2012-07-20 51 views
2

從羅伯特·愛的書,(在系統調用實現)參數傳遞的系統調用在Linux

不知何故,用戶空間必須在陷阱中中繼參數給內核。最簡單的方法是通過傳遞系統調用號的相同方式: 參數存儲在寄存器中。在x86-32上,寄存器ebx,ecx,edx,esi和edi包含前五個參數。在不太可能的情況下,有六個或更多個參數,單個寄存器用於保存指向用戶空間,其中存儲了所有參數 。

asymlinkage前綴爲每一個系統調用將期望參數是在系統堆棧。並且當模式切換髮生時參數如何複製到內核堆棧中?

+0

http://stackoverflow.com/questions/10061324/how-to-write-ac-function-invoked-from-assembly-code/10063777# 10063777 – 2012-07-24 04:04:08

+0

http://stackoverflow.com/questions/9238109/where-is-the-linux-isr-entry-point/9261572#9261572 – 2012-07-24 04:14:10

回答

3

通過系統調用粘合邏輯將參數放置到堆棧上。所有的系統調用都是通過一箇中斷陷阱來完成的(我相信x86上的int 0x80)。這個中斷處理程序的內核代碼完成了將參數放入系統調用處理程序的堆棧所需的工作。

看看這個常見問題回答非常問題:http://kernelnewbies.org/FAQ/asmlinkage

+0

「系統調用膠合邏輯」 - > tatz正是我的問題。你能指出內核中的代碼是否符合這個邏輯? – viji 2012-07-20 13:46:41

+0

這可以在http://fxr.watson.org/fxr/source/arch/x86/kernel/entry_32.S?v=linux-2.6 – chmeee 2012-07-20 13:54:30

+0

中找到請注意,在x86-32上,您有兩種有效的系統調用方式: 'int 0x80'和'sysenter'。在x86-64上可能有四種方法:int 0x80,sysenter,syscall32和syscall。 – 2012-07-24 04:06:36