【问题标题】:In Linux, on entry of a sys call, what is the value in %eax? (not orig_eax)在 Linux 中,进入系统调用时,%eax 中的值是多少? (不是 orig_eax)
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • "syscall_trace_entry in arch/x86/kernel/entry_32.S" 这就是我需要的。谢谢!
  • 退出时肯定是-ENOSYS - 检查源代码表明许多系统调用可以返回这个。
  • @caf 谢谢,我完全错过了。当我考虑它时,我以某种方式混淆了系统调用入口和出口,认为您需要使用 ENOSYS 作为系统调用号进行系统调用来实现它,并且这取决于在到达之前是否会删除无效的系统调用跟踪。我已经更新了答案。
【解决方案2】:

当您在 eax 中获得 -38 时,我仍然不明白,但是在执行系统调用时,eax 包含一个定义系统调用的数字(在 2.6 内核中,您可以查看 arch/x86/include/asm/unistd_64. h 查看每个呼叫的号码)。

所以顺序如下:

  1. 你的程序
  2. 将 eax 设置为 syscall(随叫随到,还有其他一些 regs)
  3. init 系统调用(通过 int 0x80)
  4. eax 中系统调用的结果
  5. 你的程序又来了

也许你的问题没有那么明确,但是如果你没有编写内核代码/驱动程序,那么最简单的方法是,无论你是在系统调用进入之前还是在系统调用退出之后:当你在你的代码中时是 TRUE ;-)。进入/退出本身(或多或少)在一条指令中立即发生,所以要么你在系统调用中(然后你会知道,因为它必须是一些内核代码或阻塞调用)或者你不在(几乎每次调试时)你的代码)。

【讨论】:

  • cmets 应该澄清这个问题。我选择了一个答案。不过感谢您的帮助,非常感谢!
猜你喜欢
  • 2012-08-20
  • 2012-07-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2019-10-30
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多