linux - 在 Linux 中,在进入系统调用时,%eax 的值是多少? (不是 orig_eax)

标签 linux x86 system-calls

当系统调用返回时,我在 %eax 中得到系统调用返回值,但是在输入时我得到 -38,即十六进制的 0xFFFFFFDA。这适用于写/读。这个数字是多少?它能否用于安全区分入口和导出?

最佳答案

系统调用条目上的 eax 中的 -38 显然是 ENOSYS(函数未实现),并由 arch/x86/kernel/entry_32.S 中的 syscall_trace_entry 放置在那里。我想可以安全地假设它始终存在于系统调用入口处,但是它也可以存在于系统调用导出处,如果系统调用返回 ENOSYS。

就我个人而言,我一直只是在使用 ptrace 时跟踪我是处于系统调用入口还是退出,尽管我也看到了一些依赖于 ENOSYS 的代码。 (我假设你正在使用 ptrace)我想如果当你附加到它时进程恰好在系统调用中,那将不会起作用,但我很幸运没有遇到这个问题。

我快速查看了 strace 源,我猜它也跟踪状态,因为有一条评论说“我们正在附加到一个已经运行的进程。尝试在系统调用中找出进程的状态,处理好第一个事件。”紧接着它说“该进程在系统调用的过程中处于休眠状态。伪造系统调用进入事件。”。

简而言之,不能安全地使用该值来区分入口和导出。也就是说,我不确定手动跟踪它是最好的方法,因为我还没有真正得到任何肯定会告诉你使用该技术的来源,抱歉。 :)

关于linux - 在 Linux 中,在进入系统调用时,%eax 的值是多少? (不是 orig_eax),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5503425/

相关文章:

memory - 谁在启动期间加载 BIOS 和内存映射

c - 硬件处理器计数器重置不正确

c - execlp() 系统调用输出错误

linux - 限制 Linux 应用程序的系统调用访问

c - 针对比使用 libc 构建的更新的 linux 头文件构建

linux - *nix 中的打印机配置文件

linux - 如何在 Linux 上构建 Mono 应用程序

linux - QFileIconProvider 总是使用 "gnome"主题?

java - Groovy 或 Java 上的跨平台提示音

x86 - 将引导加载程序重新定位到 EBDA 中?