49

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

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

并且它告诉编译器传递堆栈上的所有函数参数。但不是已经这样了吗?函数参数通常仅通过将它们压入堆栈来传递。还是我们在这里指的是通过寄存器传递函数参数?

4

1 回答 1

43

有一个常见问题解答

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

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

于 2012-05-05T07:04:41.897 回答