You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

kprobe_events获取do_sys_open文件名参数:x86正常arm64异常求助

解决arm64下kprobe获取do_sys_open文件名字符串的问题

首先可以明确的是,你对arm64内核函数参数传递的ABI理解是正确的——do_sys_open的第二个参数filename(用户空间字符串指针)确实存在x1寄存器中,问题出在字符串类型的指定方式,而非ABI使用错误。

问题根源

filename是被__user修饰的用户空间指针,arm64架构对内核/用户空间的内存隔离更严格,内核态不能直接解引用用户空间地址。你之前使用的:string是用于读取内核空间的字符串,直接访问用户空间指针会触发页错误,导致返回(fault);而x86架构在系统调用上下文允许内核临时访问用户空间地址,所以:string能侥幸工作,但这并不是通用的正确做法。

正确配置方式

在arm64下,需要使用:ustring类型来明确告诉kprobe这是用户空间的字符串,它会通过内核合法的用户空间内存访问机制(比如copy_from_user)来读取内容:

echo 'p:myprobe do_sys_open filename_string=+0(%x1):ustring' > kprobe_events

关于perf probe的验证

你用perf probe时遇到空值,也是因为默认使用了:string类型。修改为指定:ustring即可解决:

./perf4.14 probe 'do_sys_open filename:ustring'

生成的kprobe_events会自动带上:ustring标记,此时再用perf记录就能正确获取文件名了。

额外提示

  • 如果你不确定指针是用户空间还是内核空间,优先根据变量的定义(带__user修饰即为用户空间)选择对应的字符串类型;
  • 对于较长的用户空间字符串,kprobe会读取到第一个\0为止,最大长度受内核配置限制(通常是256字节左右)。

内容的提问来源于stack exchange,提问作者Madhur Rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:04:28