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