linux - 将参数传递给系统调用
问题描述
我知道当我们想要进行系统调用时,我们通常会围绕该系统调用调用一个 C 包装器,该包装器在内部将参数放在正确的位置(有时在特定的寄存器或堆栈中)。
放置参数后(并忽略系统调用指令等方法,因为它并非在所有平台上都可用),包装器通常执行int 0x80(软件中断)。
现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(这将包括切换程序计数器和堆栈指针等)。
我无法理解系统调用处理程序如何访问最初由 C 包装器在特定寄存器中设置的参数,这些参数现在驻留在用户进程堆栈中(不在内核进程堆栈中)
解决方案
现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(这将包括切换程序计数器和堆栈指针等)。
不 ;-) 在 Linux AMD64 上,系统调用参数直接在寄存器中传递(寄存器不会堆叠)。
有关详细信息,请参阅“x86-64 Linux 系统调用约定” http://refspecs.linuxfoundation.org/elf/x86_64-abi-0.99.pdf,第 第 123 页底部的“A.2.1 调用约定”/第 1 页页首 124.
推荐阅读
- java - 如何一次从一个文件中读取 n 个 base64 编码字符并解码并写入另一个文件?
- linux - 如何在 /sys/kernel/config/nvmet/ports 下创建软链接(符号链接)?
- vba - 如何在 VBA/Access 中使用单击事件列表框执行“If 语句”
- javascript - 将 Blazor 与非 http(s) 协议一起使用
- python - 将异步对象转换为列表
- reactjs - Antd怎么做onClick on List or Card action?
- assembly - MIPS 用户输入整数
- python - 有人可以向我解释为什么在将字典附加到列表后清除它会清除列表吗?我必须以某种方式提交吗?
- ruby-on-rails - 如何使用 searchkick 3.1.3 / elasticsearch 设置 include_type_name 值或任何其他 url 参数?
- apache-kafka - 为什么在 flink EXACTLY_ONCE 模式下每次提交都关闭了 kafka 生产者