我正在寫一個將從彙編代碼中調用的C函數。從程序集中調用c函數需要「asmlinkage」嗎?
(具體來說,我想要做的系統調用Linux內核處理的路徑一些檢查工作,所以我會調用C功能的系統調用在entry_32.S派遣之前)
我很困惑在定義我的c函數時使用「asmlinkage」修飾符。
我知道asmlinkage是告訴編譯器參數將通過堆棧傳遞。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
問題:
(1)定義將在彙編代碼來調用這樣的功能時,需要asmlinkage?
(2)gcc中的默認調用約定是什麼?如果我在定義c函數時省略「asmlinkage」,它是否暗示_cdecl或fastcall? (3)如果默認的調用約定是cdecl,爲什麼需要asmlinkage,考慮到cdecl等於asmlinkage修飾符? (我在這裏糾正?)
(4)爲什麼這些系統調用函數都是用asmlinkage聲明的。我們可以先將參數複製到寄存器,然後再調用這些系統調用函數嗎?從我的角度來看,在x86中,發出系統調用時,參數很容易保存在寄存器中;那麼爲什麼還要在堆棧中保存以通過堆棧約定來強制執行這樣的傳遞參數呢?
最後,有人可以推薦一些我可以參考的混合裝配/ c編程資源/書籍嗎?
在32位x86上,內核中使用的調用約定似乎不完全是GNU fastcall(即前'2個參數 - '%ecx'和'%edx')。它受'-mregparm = 3' [GCC選項](http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html)的控制,它指示編譯器使用'%eax', '%edx','%ecx'爲前3個參數,依次。這與Borland fastcall約定相似,但仍然如此。 – Eugene 2012-04-09 07:27:32