gja*_*ain 35 c assembly linux-kernel
我已经读过它用于在Linux中实现系统调用的函数.例如:
asmlinkage long sys_getjiffies( void )
{
  return (long)get_jiffies_64();
}
并告诉编译器传递堆栈上的所有函数参数.但事实并非如此吗?函数参数通常只通过在堆栈上推送它们来传递.或者我们指的是通过寄存器传递函数参数?
dir*_*tly 35
有一个FAQ:
asmlinkage标签是我们应该观察到的关于这个简单函数的另一件事.对于某些gcc魔法来说,这是一个#define,它告诉编译器函数不应该期望在寄存器中找到它的任何参数(一个常见的优化),而只是在CPU的堆栈上.回想一下我们之前的断言,即system_call使用它的第一个参数,系统调用号,并允许最多四个传递给实际系统调用的参数.system_call只是通过在堆栈上保留其他参数(在寄存器中传递给它)来实现这一功能.所有系统调用都标有asmlinkage标记,因此它们都会查看堆栈中的参数.当然,在
sys_ni_syscall这种情况下,这没有任何区别,因为sys_ni_syscall没有任何参数,但对于大多数其他系统调用来说这是一个问题.并且,因为你会asmlinkage在许多其他功能面前看到,我认为你应该知道它是什么.它还用于允许从汇编文件调用函数.