繁体   English   中英

Linux Kernel 我应该为实现系统调用的 function 使用 asmlinkage?

[英]Linux Kernel should I use asmlinkage for a function that implements a system call?

我正在尝试在 linux kernel 中实现一个新的系统调用,所以我写道:

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;}

我也想要一些解释

注意:我已经将 my_func 添加到 syscalls.h 我应该添加内部的(可能答案是否定的)

对于不是由手写 asm直接调用的函数使用什么调用约定并不重要(为了正确性)。 (哪些系统调用实现函数可能在某些架构上,这就是为什么它们应该是asmlinkage 。)只要所有调用者都能看到与定义匹配的原型,它就会起作用。

如果asmlinkinkage是与默认调用约定不同的调用约定(例如,在 i386 上, asmlinkage意味着使用堆栈参数,覆盖使内部函数使用寄存器参数的-mregparm=3构建选项),编译器将必须发出my_func的定义如果它调用不是asmlinkage的 function 来处理差异。 或者简单地my_func_internal()内联到其中。

如果他们使用相同的调用约定,并且编译器选择不内联,它可以只对my_func_internal进行优化的尾调用,例如在 x86 jmp my_func_internal上。 因此,如果有可能优化尾调用,则使用相同的调用约定可能会提高效率。 否则不要; asmlinkage使 i386 上的调用约定效率降低。

(IIRC, asmlinkage对 x86-64 和大多数其他具有 register-args 调用约定的现代 ISA 没有影响;x86 上的默认调用约定已经很好,因此 kernel 不需要像它那样用-mregparm=3覆盖它在 i386 上。)

在没有参数的示例中,没有区别。


顺便说一句,function 名称的通常命名约定是sys_foo以实现名为foo的系统调用。 即 function 当用户空间传递__NR_foo作为呼叫号码时将被调用。


注意:我已经将 my_func 添加到 syscalls.h 我应该添加内部的(可能答案是否定的)

当然不是,除非my_func_internal实现了您希望用户空间能够直接调用的不同系统调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM