當系統調用或中斷出現時,Linux內核如何在用戶模式和內核模式堆棧之間切換?我的意思是什麼是確切的機制 - 用戶模式堆棧指針發生了什麼?內核模式堆棧指針來自哪裏?硬件完成什麼以及軟件必須完成什麼?Linux內核如何在用戶模式和內核模式堆棧之間切換?
2
A
回答
3
下面的所有單詞都是關於x86的。
我只會描述整個系統調用路徑,而這個答案將包含請求的信息。
首先,您需要了解什麼是interrupt descriptor table。該表存儲異常/中斷向量的地址。系統調用是一個例外。舉例異常用戶代碼執行
int x
彙編指令。包括系統調用的每個例外都有自己的編號。在x86 linux上,這將看起來像
int 0x80
int指令是一個複雜的多步指令。下面是對它做什麼的解釋:
1.)從IDT(存儲在特殊寄存器中的IDT地址)中提取descriptor並檢查CPL < = DPL。 CPL是目前的特權級別,可以從CS註冊表中讀取。 DPL存儲在IDT描述符中。 由於這個原因 - 您不能通過int指令直接從用戶空間生成一些異常(f.e.頁面錯誤)。如果您嘗試這樣做,您將得到general protection exception
2.)處理器切換到在TSS中定義的堆棧。 TSS早先被初始化,並且已經包含保存內核堆棧地址的ESP和SS的值。所以現在ESP指向內核堆棧。
3.)處理器推送到新切換的內核堆棧用戶空間寄存器:ss, esp, eflags, cs, eip
。我們需要在系統調用服務之後返回,對嗎?
4.)下一個處理器從IDT描述符中設置CS和EIP。該地址定義異常向量入口點。
5.)這裏我們在內核的系統調用異常向量中。
有關ARM的幾句話。 ARM沒有TSS,它擁有每個模式的寄存器。所以對於SVC和USR模式你有單獨的堆棧指針。如果你有興趣,你可以看一下trap entry code
Interestring鏈接: MIT JOS lab 3, XV6 manual
相關問題
- 1. 切換到(Linux)內核模式
- 2. 用戶模式和內核模式之間的共享內存
- 3. 內核堆棧與用戶模式應用程序堆棧
- 4. 如何從用戶模式切換到內核模式?
- 5. 上下文切換和內核模式
- 6. 從用戶模式切換到內核模式
- 7. 如何:在用戶模式和內核模式之間做2路通信
- 8. 特權模式,內核模式和超級用戶模式之間的區別
- 9. 用戶進程的內核堆棧| Linux內核
- 10. 用戶線程(OS Windows)的內核模式堆棧是什麼?
- 11. 如何在PowerShell中獲取內核模式時間和用戶模式時間?
- 12. 在內核模式和用戶模式之間使用ioctl通信
- 13. 在Linux內核模式下使用vfs_link
- 14. Linux內核和我的內核模塊
- 15. 如何在內核模塊中生成用戶堆棧跟蹤
- 16. 內核模式轉換
- 17. 內核模式和用戶模式應用程序之間的通信
- 18. 用戶模式和內核模式爲用戶提供保護?
- 19. Linux內核中的堆棧內存
- 20. IIS 8.0中內核模式和用戶模式緩存之間的區別
- 21. 在內核轉儲中切換到用戶堆棧
- 22. Linux內核模塊中的內核線程之間的通信
- 23. 不同內核補丁之間的Linux內核模塊
- 24. 如何從用戶模式調用/掛鉤內核模式API?
- 25. 用戶模式同步與內核模式同步(在Linux和Windows中)
- 26. 如何做混合用戶模式/內核模式調試?
- 27. 如何從Windows內核模式啓動用戶模式程序
- 28. Windows如何實現用戶模式/內核模式?
- 29. 轉儲內核模塊堆棧
- 30. 如何在Linux內核空間打印用戶空間堆棧跟蹤
超級有用。謝謝@ alex-hoppus – dsatish