当一个系统调用返回时,我得到%eax中的系统调用返回值,但是在条目中我得到-38,它是十六进制的0xFFFFFFDA。这适用于写/读。这个号码是多少?它可以用来安全地区分条目和退出吗?
答案 0 :(得分:7)
syscall条目中eax中的-38显然是ENOSYS(函数未实现),并由arch / x86 / kernel / entry_32.S中的syscall_trace_entry放在那里。我认为可以安全地假设它将始终存在于系统调用条目中,但是如果系统调用返回ENOSYS,它也可以存在于系统调用退出。
就个人而言,我一直只是在使用ptrace时跟踪系统调用是否进入系统调用,尽管我已经看到一些代码也依赖于ENOSYS。 (我假设你正在使用ptrace)我想如果你附加到系统调用过程恰好在系统调用中,那将无法工作,但我很幸运,没有遇到这个问题。
我快速浏览一下strace来源,我猜它也跟踪状态,因为有一条评论说“我们正在附加到已经运行的进程。试着找出系统调用中的进程状态,以便很好地处理第一个事件。“稍后它说“进程在系统调用中间睡着了。假冒系统调用进入事件。”。
简而言之,该值无法安全地用于区分条目和退出。也就是说,我不确定手动跟踪它是最好的方法,因为我没有真正有任何来源肯定会告诉你使用这种技术,对不起。 :)
答案 1 :(得分:0)
当你在eax中得到-38时我仍然没有得到,但是当做一个系统调用eax包含一个定义系统调用的数字时(在2.6内核中你可以查看arch / x86 / include / asm / unistd_64)。 h查看每个电话的号码。
所以序列如下:
也许你的问题没有如此制定,但如果你不是编写内核代码/驱动程序最简单的方法,那么你在系统调用之前或系统调用退出之后是:当你在代码中时为TRUE ;-)。进入/退出本身在一条指令中发生(或多或少)瞬间,所以要么你在系统调用中(然后你就会知道因为它必须是一些内核代码或阻塞调用)或者你不是(几乎每次调试时)你的代码)。