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

gja*_*ain 35 c assembly linux-kernel

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

asmlinkage long sys_getjiffies( void )
{
  return (long)get_jiffies_64();
}
Run Code Online (Sandbox Code Playgroud)

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

dir*_*tly 35

有一个FAQ:

asmlinkage标签是我们应该观察到的关于这个简单函数的另一件事.对于某些gcc魔法来说,这是一个#define,它告诉编译器函数不应该期望在寄存器中找到它的任何参数(一个常见的优化),而只是在CPU的堆栈上.回想一下我们之前的断言,即system_call使用它的第一个参数,系统调用号,并允许最多四个传递给实际系统调用的参数.system_call只是通过在堆栈上保留其他参数(在寄存器中传递给它)来实现这一功能.所有系统调用都标有asmlinkage标记,因此它们都会查看堆栈中的参数.当然,在sys_ni_syscall这种情况下,这没有任何区别,因为sys_ni_syscall没有任何参数,但对于大多数其他系统调用来说这是一个问题.并且,因为你会asmlinkage 在许多其他功能面前看到,我认为你应该知道它是什么.

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

  • 原因是无论如何内核需要在处理来自用户空间的系统调用请求时将所有寄存器保存到堆栈中(以便在返回用户空间之前恢复环境),因此参数在堆栈上可用.即,它不需要额外的努力.来源:http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-ac-function-to-be-called-from-assembly (8认同)