我已经读到,它用于在Linux中实现系统调用的函数.

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

它告诉编译器在堆栈上传递所有函数参数.但现在不是这样吗?函数参数通常只通过在堆栈上推送来传递.还是我们指的是通过寄存器传递函数参数?

推荐答案

有一个FAQ:

asmlink标记是我们应该注意的另一件事 这个简单的函数.这是对一些GCC魔法的#定义,它告诉我们 该函数不应期望找到其任何 寄存器中的参数(一种常见的优化),但仅限于CPU的 堆栈.回想一下我们之前的断言,SYSTEM_CALL使用它的 第一个参数是系统调用号,最多允许另外四个 传递给实际系统调用的参数.系统调用 实现这一壮举只需将它的其他参数(它们是 在寄存器中传递给它).所有系统调用都已标记 使用asmlink标记,所以它们都在堆栈中查找参数. 当然,在sys_ni_syscall的情况下,这并没有什么不同, 因为sys_ni_syscall不需要任何争论,但这是一个问题 用于大多数其他系统调用.而且,因为你会看到asmlinkage 在许多其他功能面前,我想你应该知道它是什么 是关于.

它还用于允许从程序集文件调用函数.

C++相关问答推荐

sscanf:如何解析

如何从C中的公钥字符串创建EVP_PKEY

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

C:scanf(%d&q;,...)输入只有一个减号

GCC预处理宏和#杂注GCC展开

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

带有sigLongjMP中断I/O的异常处理程序

我可以在C中声明不同长度数组的数组而不带变量名吗?

向上强制转换C中的数值类型总是可逆的吗?

CC2538裸机项目编译但不起作用

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

I2C外设在单次交易后出现故障

为什么用非常数指针变量改变常量静态变量时会出现分段错误?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

从C中的函数返回静态字符串是不是一种糟糕的做法?

可以对两种 struct 类型中的任何一种进行操作的C函数

在哪里可以找到叮当返回码的含义?

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

10 个字节对于这个 C 程序返回后跳行的能力有什么意义