在Linux中,在进入sys调用时,%eax中的值是多少?(非原版)

在Linux中,在进入sys调用时,%eax中的值是多少?(非原版),linux,x86,system-calls,Linux,X86,System Calls,当系统调用返回时,我得到%eax中的系统调用返回值,但是在条目上我得到了-38,十六进制中的0xFFFFDA。这适用于写入/读取。这个号码是多少?它可以用来安全地区分入口和出口吗?当您在eax中获得-38时,我仍然不知道,但是当执行系统调用时,eax包含一个定义系统调用的数字(在2.6内核中,您可以查看arch/x86/include/asm/unistd_64.h以查看每个调用的数字) 因此,顺序如下: 你的程序 将eax设置为syscall(dep on call,以及一些其他REG) 初始

当系统调用返回时,我得到%eax中的系统调用返回值,但是在条目上我得到了-38,十六进制中的0xFFFFDA。这适用于写入/读取。这个号码是多少?它可以用来安全地区分入口和出口吗?

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

因此,顺序如下:

  • 你的程序
  • 将eax设置为syscall(dep on call,以及一些其他REG)
  • 初始化系统调用(通过int 0x80)
  • eax中syscall的结果
  • 你的程序又来了

  • 也许您的问题不是这样表述的,但是如果您没有编写内核代码/驱动程序,最简单的方法是:当您在代码中时,判断您是在syscall进入之前还是在syscall退出之后;-)。进入/退出本身(或多或少)在一条指令中立即发生,因此要么您在系统调用中(因为它必须是一些内核代码或阻塞调用),要么您不在系统调用中(几乎每次调试代码时)。

    eax中关于系统调用的-38项显然是ENOSYS(函数未实现),并通过arch/x86/kernel/entry\u 32.S中的syscall\u trace\u条目放在那里。我认为可以安全地假设它在syscall条目上始终存在,但是如果syscall返回ENOSYS,它也可以在syscall exit上存在

    就我个人而言,在使用ptrace时,我一直在跟踪我是处于syscall入口还是退出状态,尽管我也看到一些代码依赖于ENOSYS。(我假设您使用的是ptrace)我想,如果您连接到某个系统调用时该进程恰好位于该系统调用内部,那么这将不起作用,但我很幸运没有遇到这个问题

    我快速查看了strace源代码,我想它也会跟踪状态,因为有一条评论说“我们正在连接一个已经运行的进程。尝试在syscalls中找出进程的状态,以便很好地处理第一个事件。”然后它说“进程在一个SysCar的中间睡着了。伪造syscall条目事件。“


    简而言之,无法安全地使用该值来区分入口和出口。也就是说,我不确定手动跟踪它是否是最好的方法,因为我还没有任何来源可以明确告诉您使用该技术,对不起。:)

    您能解释一下“进入时”是什么意思吗“?@Shickadance先生,据我所知,系统调用有两个部分。当它被制作/发送到内核时,我称之为入口,当内核完成并返回时,我称之为出口。所以进入/退出就是进入/离开内核空间。进入内核空间后,运行内核代码。系统调用后的代码将仅在内核返回(退出)后运行。@ughoavgfhw,我正在使用ptrace跟踪应用程序。因此,当呼叫发出(或进入)时,我正在检查%eax,它是-38。当调用返回(或退出)时,我将再次检查%eax并获取一个文件描述符或有用的错误。我只是想知道当调用内核时%eax是什么,我读了它。内核保存orig_eax是有原因的,我想知道在保存后%eax会发生什么,结果是-38,但我似乎在任何地方都找不到。我用
    ptrace GETREGS
    重现了这一点。获取系统调用号的正确方法似乎是使用
    PTRACE\u PEEKUSER
    +
    ORIG\u EAX
    :“arch/x86/kernel/entry\u 32.S中的syscall\u trace\u条目”这正是我所需要的。谢谢退出时它肯定是
    -ENOSYS
    -检查源代码表明许多系统调用都可以返回此结果。@caf谢谢,我完全错过了。当我考虑这个问题时,我不知何故混淆了syscall入口和出口,认为需要使用ENOSYS作为系统调用号来进行系统调用,这取决于在进入ptrace之前是否会删除无效的系统调用。我已经更新了答案。这些评论应该会澄清这个问题。我选择了一个答案。谢谢你的帮助,非常感谢!