簡體   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