Linux kernel linux系统调用中的参数传递

Linux kernel linux系统调用中的参数传递,linux-kernel,system-calls,kernel,Linux Kernel,System Calls,Kernel,摘自Robert Love的书(系统内调用实现) 无论如何,用户空间必须在陷阱期间将参数中继到内核。最简单的方法是通过传递syscall号码的相同方式: 参数存储在寄存器中。在x86-32上,寄存器ebx、ecx、edx、esi和 按顺序,edi包含前五个参数- 例如,一个寄存器用于保存指向用户空间的指针,其中包含所有参数 这些都是存储的 但是,asymlinkage是每个系统调用的前缀,期望参数在系统堆栈中。当模式切换发生时,参数是如何复制到内核堆栈的?系统调用逻辑将参数放置到堆栈上。所有系统

摘自Robert Love的书(系统内调用实现)

无论如何,用户空间必须在陷阱期间将参数中继到内核。最简单的方法是通过传递syscall号码的相同方式: 参数存储在寄存器中。在x86-32上,寄存器ebx、ecx、edx、esi和 按顺序,edi包含前五个参数- 例如,一个寄存器用于保存指向用户空间的指针,其中包含所有参数 这些都是存储的


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

系统调用逻辑将参数放置到堆栈上。所有系统调用都是通过单个中断陷阱进行的(我相信x86上的int 0x80)。此中断处理程序的内核代码执行必要的工作,将参数放入系统调用处理程序的堆栈中


查看此常见问题解答来回答这个问题:

“系统调用粘合逻辑”->塔茨正是我的问题。您能告诉我内核中执行此逻辑的代码吗?请注意,在x86-32上有两种有效的系统调用方式:
int 0x80
syscenter
。在x86-64上,最多可以有四种方式:
int 0x80
syscenter
syscall32
syscall