Linux 内核我应该将 asmlinkage 用于实现系统调用的函数吗?
Linux Kernel should I use asmlinkage for a function that implements a system call?
我正试图在 linux 内核中实现一个新的系统调用,所以我写道:
asmlinkage int my_func(void) {
return my_func_internal();
}
我的问题,我是否应该将 my_func_internal
定义为 asmlinkage?
也就是说,我应该写A还是B?
A) asmlinkage int my_func_internal(void) {return 1;}
B) int my_func_internal(void) {return 1;}
我也想解释一下
注意:我已经在syscalls.h中添加了my_func,我是否也应该添加内部的(可能答案是否定的)
对于未被手写 asm 直接 调用的函数使用什么调用约定并不重要(为了正确性)。 (哪些系统调用实现函数可能在某些体系结构上,这就是为什么它们应该是 asmlinkage
。)只要所有调用者都能看到与定义匹配的原型,它就会起作用。
如果 asmlinkinkage
是与默认调用约定不同的调用约定(例如,在 i386 上,asmlinkage
表示使用堆栈参数,覆盖使内部函数使用的 -mregparm=3
构建选项register args),如果编译器调用的函数不是 asmlinkage
,则它必须发出 my_func
的定义来处理差异。或者简单地将 my_func_internal()
内联到其中。
如果它们使用相同的调用约定,并且编译器选择不内联,它可以只对 my_func_internal
进行优化尾调用,例如在 x86 jmp my_func_internal
上。因此,使用相同的调用约定可能具有效率优势 如果 有可能优化尾调用。否则不要; asmlinkage
使 i386 上的调用约定效率降低。
(IIRC,asmlinkage
对 x86-64 和大多数其他具有寄存器参数调用约定的现代 ISA 没有影响;x86 上的默认调用约定已经很好,因此内核不需要覆盖它与 -mregparm=3
就像在 i386 上一样。)
在你的例子中没有参数,没有区别。
顺便说一句,函数名称的通常命名约定是 sys_foo
以实现名为 foo
的系统调用。即当 user-space 传递 __NR_foo
作为呼叫号码时将被调用的函数。
Note: I have added my_func to syscalls.h should I add the internal one too (probably the answer is no)
当然不是,除非my_func_internal
实现了一个不同的系统调用,您希望用户-space能够直接调用。
我正试图在 linux 内核中实现一个新的系统调用,所以我写道:
asmlinkage int my_func(void) {
return my_func_internal();
}
我的问题,我是否应该将 my_func_internal
定义为 asmlinkage?
也就是说,我应该写A还是B?
A) asmlinkage int my_func_internal(void) {return 1;}
B) int my_func_internal(void) {return 1;}
我也想解释一下
注意:我已经在syscalls.h中添加了my_func,我是否也应该添加内部的(可能答案是否定的)
对于未被手写 asm 直接 调用的函数使用什么调用约定并不重要(为了正确性)。 (哪些系统调用实现函数可能在某些体系结构上,这就是为什么它们应该是 asmlinkage
。)只要所有调用者都能看到与定义匹配的原型,它就会起作用。
如果 asmlinkinkage
是与默认调用约定不同的调用约定(例如,在 i386 上,asmlinkage
表示使用堆栈参数,覆盖使内部函数使用的 -mregparm=3
构建选项register args),如果编译器调用的函数不是 asmlinkage
,则它必须发出 my_func
的定义来处理差异。或者简单地将 my_func_internal()
内联到其中。
如果它们使用相同的调用约定,并且编译器选择不内联,它可以只对 my_func_internal
进行优化尾调用,例如在 x86 jmp my_func_internal
上。因此,使用相同的调用约定可能具有效率优势 如果 有可能优化尾调用。否则不要; asmlinkage
使 i386 上的调用约定效率降低。
(IIRC,asmlinkage
对 x86-64 和大多数其他具有寄存器参数调用约定的现代 ISA 没有影响;x86 上的默认调用约定已经很好,因此内核不需要覆盖它与 -mregparm=3
就像在 i386 上一样。)
在你的例子中没有参数,没有区别。
顺便说一句,函数名称的通常命名约定是 sys_foo
以实现名为 foo
的系统调用。即当 user-space 传递 __NR_foo
作为呼叫号码时将被调用的函数。
Note: I have added my_func to syscalls.h should I add the internal one too (probably the answer is no)
当然不是,除非my_func_internal
实现了一个不同的系统调用,您希望用户-space能够直接调用。