我看了很多,如果在線線程/教程關於進程的地址空間是如何分爲進程/內核4GB(VM)地址空間如何使用,而交換臺從/到用戶空間到內核空間
例如: 我有一些Helloworld程序 在我有調用爲printf(反過來它使寫系統調用進入內核空間)
我懷疑內核使用Helloworld程序堆棧。 你能告訴我整個執行的銜接...
./helloworld - >的printf() - >寫系統調用 - >顯示驅動器 - >從寫回 - >回的HelloWorld
謝謝, Amarender
我看了很多,如果在線線程/教程關於進程的地址空間是如何分爲進程/內核4GB(VM)地址空間如何使用,而交換臺從/到用戶空間到內核空間
例如: 我有一些Helloworld程序 在我有調用爲printf(反過來它使寫系統調用進入內核空間)
我懷疑內核使用Helloworld程序堆棧。 你能告訴我整個執行的銜接...
./helloworld - >的printf() - >寫系統調用 - >顯示驅動器 - >從寫回 - >回的HelloWorld
謝謝, Amarender
這個問題的詳細答案取決於具體的內核和體系結構。然而,一般的答案是,當用戶空間想要調用內核時,它會執行一個陷阱指令,導致CPU更改特權級別並開始執行內核代碼。作爲權限級別更改的一部分,CPU也將切換到內核堆棧。內核完成後,它將執行一個從陷阱中返回的序列,該序列將恢復用戶空間堆棧並在其停止的位置恢復執行。
總而言之:寫系統調用時,會生成int $80
陷阱。處理程序將當前進程寄存器保存在內核堆棧中(存在於內核地址空間中)。然後,更改段寄存器中的CPL以啓用內核頁表。然後內核查找它的系統調用表並找到所需例程的適當地址。執行然後跳轉到可以調用設備驅動程序代碼的例程。 完成其工作後,內核通過恢復段寄存器中的寄存器內容和CPL返回到用戶模式。