当前位置: 首页 > 面试题库 >

为什么在eax之外还提供orig_eax?

咸晨
2023-03-14
问题内容

为什么orig_eax列入成员sys/user.hstruct user_regs_struct


问题答案:

因为它在中struct pt_regs,所以…。http :
//tomoyo.sourceforge.jp/cgi-
bin/lxr/source/arch/x86/include/asm/user_32.h#L77

 73  * is still the layout used by user mode (the new
 74  * pt_regs doesn't have all registers as the kernel
 75  * doesn't use the extra segment registers)

因此,许多用户空间实用程序都希望在orig_eax此处输入一个字段,因此也包含在其中user_regs_struct(以与较早的调试器和ptracers
兼容)

下一个问题是“为什么将orig_eax成员包括在其中struct pt_regs?”。

它是在Linux 0.95 http://lxr.linux.no/#linux-
old+v0.95/include/sys/ptrace.h#L44中添加的。我建议这是在其他一些带有pt_regsstruct的Unix之后完成的。0.95中的评论说

  29 * this struct defines the way the registers are stored on the 
  30 * stack during a system call.

因此,的位置orig_eax由syscall接口定义。这是http://lxr.linux.no/#linux-
old+v0.95/kernel/sys_call.s

  17 * Stack layout in 'ret_from_system_call':
  18 *      ptrace needs to have all regs on the stack.
  19 *      if the order here is changed, it needs to be 
  20 *      updated in fork.c:copy_process, signal.c:do_signal,
  21 *      ptrace.c ptrace.h
  22 *
  23 *       0(%esp) - %ebx
 ...
  29 *      18(%esp) - %eax
 ...
  34 *      2C(%esp) - orig_eax

为什么我们需要保存eax两次旧的?因为eax将用于syscall的返回值(相同的文件,下面一点):

  96_system_call:
  97        cld
  98        pushl %eax              # save orig_eax
  99        push %gs
...
 102        push %ds
 103        pushl %eax              # save eax.  The return value will be put here.
 104        pushl %ebp
...
 117        call _sys_call_table(,%eax,4)

Ptrace必须能够读取syscall之前的所有寄存器状态以及syscall的返回值。但返回值被写入%eax。然后eaxsyscall之前使用的original
将会丢失。要保存它,有一个orig_eax字段。

更新:感谢R ..和出色的LXR,我orig_eax在linux 0.95中进行了全面搜索。

它不仅在ptrace中使用,而且在重新启动syscall时也用在do_signal中(如果有syscall,以结束ERESTARTSYS

 158                        *(&eax) = orig_eax;

UPDATE2:Linus 说了一些有趣的事情:

重要的是将ORIG_EAX设置为某个值,该值 不是 有效的系统调用号,以免触发系统调用重新启动逻辑(请参见信号处理代码)。

UPDATE3:ptracer应用程序(调试器)可以更改orig_eax以更改要调用的系统调用号码:http
:
//lkml.org/lkml/1999/10/30/82(在某些版本的内核中,是EIO在ptrace中更改了ORIG_EAX)



 类似资料:
  • 问题内容: 据我所知,JPA本身提供了所有闪亮的功能,例如ORM,JPQL,实体关系映射等。但是我真的不明白,为什么人们在JPA之上使用Hibernate或Toplink。 Hibernate提供了JPA本身没有的哪些功能? 问题答案: JPA只是一个规范。Hibernate和TopLink是该规范的实现。 而且,JPA规范有点弱,它仅提供Hibernate和TopLink之类提供的功能的子集。有

  • 问题内容: 我正在使用: Python 3.4.2 PyMongo 3.0.2 mongolab运行mongod 2.6.9 uWSGI 2.0.10 CherryPy 3.7.0 nginx 1.6.2 uWSGI启动参数: 我一次设置了MongoClient: 我尝试将JSON字典保存到MongoDB: 它通过执行与mongodb相同的代码路径的单元测试来工作。但是,当我使用HTTP POST

  • 问题内容: 使用a 提供一个custom很简单,从而覆盖了添加到地图的对象所提供的语义。但是不能以这种方式控制;提供哈希值和相等性检查的函数不能“侧加载”。 我怀疑设计一个接口并将其改造成(或一个新类)既简单又有用?像这样的东西,除了名字更好: 在不区分大小写Map的问题得到了平凡解: 这是可行的,还是您会看到这种方法的任何基本问题? 现有(非JRE)库中是否使用了这种方法?(尝试过Google,

  • 我使用GWT2.7,并希望在我的应用程序中提供带有级别信息和警告的日志记录。在我的gwt.xml文件中,我有: 它在开发模式下工作得很好,但在SuperDevMode中,我只能记录严重的日志级别。 为什么SuperDevMode只提供LogLevel严重?

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona