Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux系统调用上下文中,EAX寄存器的用途是什么?_Linux_Linux Kernel - Fatal编程技术网

在Linux系统调用上下文中,EAX寄存器的用途是什么?

在Linux系统调用上下文中,EAX寄存器的用途是什么?,linux,linux-kernel,Linux,Linux Kernel,教科书中提到(第101页): 返回值也通过寄存器发送到用户空间。在x86上,它 写入eax寄存器 教科书中提到(第88页): 由于所有系统调用都以相同的方式进入内核,因此内核 需要一些识别系统调用的方法。为了允许这一点 包装器函数将系统调用号复制到特定的CPU中 寄存器(%eax) 那么,对于EAX寄存器在系统调用中的实用性,我可以得出什么结论呢 当内核遇到系统调用时,它会将系统调用号复制到EAX寄存器,在系统调用返回时,寄存器中的值将替换为系统调用的返回值。这个结论正确吗? 进行系统调用 要使

教科书中提到(第101页):

返回值也通过寄存器发送到用户空间。在x86上,它 写入eax寄存器

教科书中提到(第88页):

由于所有系统调用都以相同的方式进入内核,因此内核 需要一些识别系统调用的方法。为了允许这一点 包装器函数将系统调用号复制到特定的CPU中 寄存器(%eax)

那么,对于EAX寄存器在系统调用中的实用性,我可以得出什么结论呢

当内核遇到系统调用时,它会将系统调用号复制到EAX寄存器,在系统调用返回时,寄存器中的值将替换为系统调用的返回值。这个结论正确吗?

进行系统调用 要使用中断进行系统调用,必须通过所有必需的 通过将信息复制到通用文件中,将其复制到内核 登记册

每个系统调用都有一个固定的编号(注意:编号在
int之间不同
$0x80
系统调用
!)。您可以通过写入数字来指定系统调用 进入eax/rax寄存器

大多数系统调用使用参数来执行任务。这些参数 通过在作出决定之前将其写入适当的寄存器来传递 实际通话。每个参数索引都有一个特定的寄存器。见 子部分中的表作为映射在
int$0x80
syscall
。参数按其在列表中出现的顺序传递 对应的C包装函数的函数签名。你可以 在每个Linux API中查找系统调用函数及其签名 文档,如参考手册(键入man 2打开以查看 打开系统调用的签名)

一切设置正确后,使用
int$0x80
syscall
,内核执行该任务

系统调用的返回/错误值写入
eax
/
rax

内核使用自己的堆栈来执行操作。用户堆栈 没有以任何方式接触

综上所述:

在用户空间中:

  • 通过将参数写入指定的寄存器来准备系统调用
  • 将系统调用号码放入
    eax
  • 通过
    int$0x80
    syscall
在内核空间中:

  • 内核从
    eax
  • 从特定寄存器读取参数
  • 执行任务(在自己的堆栈上)
  • 将结果写入
    eax
  • 返回到用户空间的控件
再次在用户空间中:

  • 您可以在
    eax
    寄存器中找到中断的结果