我已经读过它用于在Linux中实现系统调用的函数。 例如:
asmlinkage long sys_getjiffies( void )
{
return (long)get_jiffies_64();
}
它告诉编译器传递堆栈上的所有函数参数。但事实并非如此吗?函数参数通常只通过在堆栈上推送它们来传递。还是我们指的是通过寄存器传递函数参数?
答案 0 :(得分:32)
有FAQ:
asmlinkage标签是我们应该注意的另一件事 这个简单的功能。对于某些gcc魔术来说,这是一个#define 该函数不应该期望找到它的任何编译器 寄存器中的参数(常见的优化),但仅限于CPU 堆。回想一下我们之前关于system_call消耗它的断言 第一个参数,系统呼叫号码,并允许最多四个 传递给实际系统调用的参数。 system_call 仅仅通过留下其他论点来实现这一壮举 在堆栈中传递给寄存器)。所有系统调用都已标记 使用asmlinkage标记,所以他们都查看堆栈的参数。 当然,在
sys_ni_syscall
的情况下,这并没有任何区别, 因为sys_ni_syscall
没有采取任何论据,但这是一个问题 对于大多数其他系统调用。而且,因为你会看到asmlinkage
在许多其他功能面前,我以为你应该知道它是什么 是关于。它还用于允许从汇编文件调用函数。