2014-05-11 26 views
2

,我心裏也沒有任何地方...我已經尋找這個問題,所以在這裏的解釋是我知道的:執行 的應用程序將使用內核的系統調用,如內存分配 如果在應用程序代碼如何與內核代碼進行對話?

軟件應用程序加載到內存中軟件應用程序被轉換爲二進制文件,內核也是如此,它們在內存中如何在低層次上彼此通信?

我的知識確實存在很多空白,所以我可以假設應用程序被編譯爲內核可以理解的代碼,而不是直接轉換爲機器代碼。有足夠的知識足以解釋這一點?

回答

6

的細節在很大程度上取決於具體的操作系統和架構,你問的,但是,在一般情況下,用戶空間的應用程序可以通過執行導致CPU中斷一些具體操作的系統調用,使執行跳轉到內核。該應用程序將已存儲的一些數據寄存器或指明瞭所需的系統調用和參數是在棧中,並將結果傳回同樣的系統調用完成時。

例如,對於32位x86 Linux系統,執行系統調用的指定操作是int 0x80。當應用程序想要執行系統調用時,它將系統調用的ID放在eax中,並在ebx,ecx,edx,esi,ediebp(以該順序)中存儲多達六個參數。系統調用完成後,其結果將存儲在eax中。

在大多數情況下,這使得系統調用存儲在由近內存頂部的內核映射數據的特殊頁面的代碼。該頁面包含可以通過libc調用的優化代碼。 (因此,你的代碼永遠不會需要直接調用內核 - 這是全部由libc函數其中包裹的系統調用,就像read()write()處理。)有關詳細信息,請參閱"What are vdso and vsyscall"

+0

非常好解釋非常感謝你。因此,CPU負責基於將控制轉移給內核的中斷,該中斷將查找包含所請求的系統調用的指定空間,該空間將映射到正確的功能。 – boompow