ofo*_*sho 6 linux x86 system-calls
当一个系统调用返回时,我得到了%eax中的系统调用的返回值,但是在进入我得到-38,这是0xFFFFFFDA十六进制.这适用于写/读.这个号码是多少?它可以用来安全地区分出口和出口吗?
syscall条目中eax中的-38显然是ENOSYS(函数未实现),并由arch/x86/kernel/entry_32.S中的syscall_trace_entry放在那里.我认为可以安全地假设它始终存在于syscall条目中,但是如果系统调用返回ENOSYS ,它也可以在syscall出口处.
就个人而言,我一直只是在使用ptrace时跟踪我是在系统调用进入还是退出,尽管我已经看到一些代码也依赖于ENOSYS.(我假设你正在使用ptrace)我想如果当你附加到它时,如果进程恰好在系统调用中,那将无法工作,但我很幸运,没有遇到这个问题.
我快速浏览一下strace源代码,我猜它也跟踪状态,因为有一条评论说"我们正在附加一个已经在运行的进程.试着找出系统调用中的进程状态,处理第一次活动很好." 稍后它说:"进程在系统调用中间睡着了.假冒系统调用进入事件."
简而言之,该值不能安全地用于区分条目和出口.也就是说,我不确定手动跟踪它是最好的方法,因为我没有真正有任何来源肯定会告诉你使用这种技术,对不起.:)