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
相关产品推荐
相关产品推荐

