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