什么是'asmlinkage'修饰符意味着什么?

时间:2012-05-05 07:01:46

标签: c assembly linux-kernel

我已经读过它用于在Linux中实现系统调用的函数。 例如:

asmlinkage long sys_getjiffies( void )
{
  return (long)get_jiffies_64();
}

它告诉编译器传递堆栈上的所有函数参数。但事实并非如此吗?函数参数通常只通过在堆栈上推送它们来传递。还是我们指的是通过寄存器传递函数参数?

1 个答案:

答案 0 :(得分:32)

FAQ

  

asmlinkage标签是我们应该注意的另一件事   这个简单的功能。对于某些gcc魔术来说,这是一个#define   该函数不应该期望找到它的任何编译器   寄存器中的参数(常见的优化),但仅限于CPU   堆。回想一下我们之前关于system_call消耗它的断言   第一个参数,系统呼叫号码,并允许最多四个   传递给实际系统调用的参数。 system_call   仅仅通过留下其他论点来实现这一壮举   在堆栈中传递给寄存器)。所有系统调用都已标记   使用asmlinkage标记,所以他们都查看堆栈的参数。   当然,在sys_ni_syscall的情况下,这并没有任何区别,   因为sys_ni_syscall没有采取任何论据,但这是一个问题   对于大多数其他系统调用。而且,因为你会看到asmlinkage   在许多其他功能面前,我以为你应该知道它是什么   是关于。

     

它还用于允许从汇编文件调用函数。