【发布时间】:2011-03-31 16:53:55
【问题描述】:
当系统调用返回时,我在 %eax 中获得系统调用返回值,但是在输入时我得到 -38,即十六进制的 0xFFFFFFDA。这适用于写/读。这个数字是多少?它可以用来安全地区分入口和出口吗?
【问题讨论】:
-
你能解释一下“进入”是什么意思吗?
-
@Mr. Shickadance,据我了解,sys_call 有两个部分。当它被制作/发送到内核时,我称之为入口,当内核完成并返回时,我称之为退出。所以进入/退出将进入/离开内核空间。
-
进入内核空间后,运行内核代码。系统调用后的代码只会在内核返回(退出)后运行。
-
@ughoavgfhw,我正在使用 ptrace 跟踪应用程序。因此,当调用(或进入)时,我正在检查 %eax,它是 -38。当调用返回(或退出)时,我再次检查 %eax 并获取文件描述符或有用的错误。我只想知道当调用内核时 %eax 是什么,我读了它。内核保存 orig_eax 是有原因的,我想知道保存后 %eax 会发生什么导致 -38,但我似乎在任何地方都找不到。
-
我用
ptrace GETREGS复制了这个。获取系统调用号的正确方法似乎是使用PTRACE_PEEKUSER+ORIG_EAX:github.com/nelhage/ministrace/blob/for-blog/ministrace.c
标签: linux x86 system-calls