【发布时间】:2015-08-10 13:28:13
【问题描述】:
我认为使用 asmlinkage 修饰符调用函数需要将所有参数推送到堆栈,直到我对 Linux 内核源代码 (3.16) 中的以下内容感到困惑。
来源在 entry_64.S link
movq %rsp,%rdi
call sync_regs
sync_regs 在arch/x86/kernel/traps.c 中的定义:
asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs)
{
struct pt_regs *regs = task_pt_regs(current);
*regs = *eregs;
return regs;
}
难道不应该把%rdi/%rsp推入栈吗?
答案/外卖:感谢@Jester,我总结的答案如下:
- 注意!在 x86-64 上,所有参数都在寄存器中,所以这个
- 仅在 32 位内核上重要。" [linux src comment]
【问题讨论】:
-
64 位调用约定使用寄存器作为前几个参数。阅读 abi 文档。
-
我以为这是默认设置(wo asmlinkage)...所以对于 x_86_64,asmlikage 不会在堆栈上假设参数?...或者 asmlinkage 仅适用于 32 位?
标签: assembly linux-kernel x86-64 calling-convention