相关疑难解决方法(0)

asmlinkage 是堆栈还是寄存器?

在大多数语言中,C 包括堆栈用于函数调用。这就是如果您在递归时不小心会收到“堆栈溢出”错误的原因。(不是双关语)。

如果这是真的,那么asmlinkageGCC 指令有什么特别之处。

它说,来自#kernelnewbies

asmlinkage 标签是我们应该注意的关于这个简单函数的另一件事。这是一些 gcc 魔法的 #define,它告诉编译器该函数不应期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。

我的意思是我不认为寄存器用于正常的函数调用

更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。

regparm的文档如下:

在 x86-32 目标上,如果参数在寄存器 EAX、EDX 和 ECX 中而不是在堆栈中是整数类型,则 regparm 属性会导致编译器将第一个参数传递给 number。

这基本上与asmlinkage正在尝试做的相反。

那么会发生什么?它们是在堆栈上还是在寄存器上。

我哪里错了?

信息不是很清楚。

linux x86 gcc linux-kernel function-attributes

0
推荐指数
1
解决办法
98
查看次数

标签 统计

function-attributes ×1

gcc ×1

linux ×1

linux-kernel ×1

x86 ×1