[英]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.