【问题标题】:Parameter passing in system call in linuxlinux系统调用中的参数传递
【发布时间】:2012-07-19 18:41:56
【问题描述】:

来自 Robert Love 的书,(在系统调用实现中)

不知何故,用户空间必须在陷阱期间将参数传递给内核。最简单的方法是通过传递系统调用号的相同方式: 参数存储在寄存器中。在 x86-32 上,寄存器 ebx、ecx、edx、esi 和 edi 按顺序包含前五个参数。在不太可能的情况下,有六个或更多参数 ments,单个寄存器用于保存指向用户空间的指针,其中所有参数 被存储。

但是asymlinkage 是每个系统调用的前缀,这将期望参数位于系统堆栈中。还有当模式切换发生时,如何将参数复制到内核堆栈中?

【问题讨论】:

标签: linux-kernel system-calls kernel


【解决方案1】:

系统调用粘合逻辑将参数放入堆栈。所有系统调用都是通过一个中断陷阱进行的(我相信 x86 上的 int 0x80)。此中断处理程序的内核代码完成了将参数放入堆栈以供系统调用处理程序使用的必要工作。

查看此常见问题解答以回答这个问题:http://kernelnewbies.org/FAQ/asmlinkage

【讨论】:

  • “系统调用粘合逻辑”-> tatz 正是我的问题。你能指出内核中执行此逻辑的代码吗?
  • 请注意,在 x86-32 上,您有两种有效的系统调用方式:int 0x80sysenter。在 x86-64 上最多可能有四种方式:int 0x80sysentersyscall32syscall
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 2014-04-22
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多