本文轉載自:http://blog.chinaunix.net/uid-24945116-id-83893.html 學習啦! asmlinkage是個巨集,使用它是為了保持參數在stack中。因為從彙編語言到C語言代碼參數的傳遞是通過stack的,它也可能從stack中得到一些不需要的參數。Asml
本文轉載自:http://blog.chinaunix.net/uid-24945116-id-83893.html
學習啦!
asmlinkage是個巨集,使用它是為了保持參數在stack中。因為從彙編語言到C語言代碼參數
的傳遞是通過stack的,它也可能從stack中得到一些不需要的參數。Asmlinkage將要
解析那些參數。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
__attribute__是關鍵字,是gcc的C語言擴展,regparm(0)表示不從寄存器傳遞參數 如果是__attribute__((regparm(3))),那麼調用函數的時候參數不是通過棧傳遞,而是直接放到寄存器里,被調用函數直接從寄存器取參數。
__attribute__機制是GNU C的一大特色,它可以設置函數屬性、變數屬性和類型屬性等。可以通過它們向編譯器提供更多數據,幫助編譯器執行優化等。
__attribute__((regparm(0))):告訴gcc編譯器該函數不需要通過任何寄存器來傳遞參數,參數只是通過堆棧來傳遞。
__attribute__((regparm(3))):告訴gcc編譯器這個函數可以通過寄存器傳遞多達3個的參數,這3個寄存器依次為EAX、EDX 和 ECX。更多的參數才通過堆棧傳遞。這樣可以減少一些入棧出棧操作,因此調用比較快。
asmlinkage定義:#define asmlinkage __attribute__((regparm(0)))
表示用0個寄存器傳遞函數參數,這樣,所有的函數參數強迫從棧中提取。
這個asmlinkage大都用在系統調用中,系統調用需要在entry.s文件中用彙編語言調用,所以必須要保證它符合C語言的參數傳遞規則,才能用彙編語言正確調用它。
這也是為何使用asmlinkage的原因吧!這是我的理解。