在大多数语言中,C 包含的堆栈用于函数调用。这就是为什么如果您在递归中不小心会出现“堆栈溢出”错误的原因。(双关语不是故意的)。
asmlinkage
如果这是真的,那么GCC 指令有什么特别之处。
它说,来自#kernelnewbies
asmlinkage 标签是关于这个简单函数的另一件事。这是一些 gcc 魔术的#define,它告诉编译器该函数不应该期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。
我的意思是我不认为寄存器用于正常的函数调用。
更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。
regparm的文档如下:
在 x86-32 目标上,如果参数是寄存器 EAX、EDX 和 ECX 中的整数类型,而不是堆栈中的参数,则 regparm 属性会导致编译器将参数编号 1 传递给编号。
这基本上与asmlinkage
正在尝试做的事情相反。
那么会发生什么?它们是在堆栈上还是在寄存器上。
我哪里错了?
信息不是很清楚。