在x86架構中,有一些段寄存器,如SS,CS,DS,FS,GS。我知道這些16位寄存器指示LDT,GDT條目(作爲段選擇器)和MMU引用 這個(GDT,LDT)來計算段基址+偏移量值。並檢查權限 等。什麼時候由操作系統修改段寄存器?
我很好奇的是:誰填寫了基於段的寄存器內容?內核調度程序?
當應用程序更改段寄存器值本身時會發生什麼? 我知道只有CS不能被更改,因爲它具有當前CPU的CPL。 ,但其他寄存器(SS,DS ...)可以更改。
在x86架構中,有一些段寄存器,如SS,CS,DS,FS,GS。我知道這些16位寄存器指示LDT,GDT條目(作爲段選擇器)和MMU引用 這個(GDT,LDT)來計算段基址+偏移量值。並檢查權限 等。什麼時候由操作系統修改段寄存器?
我很好奇的是:誰填寫了基於段的寄存器內容?內核調度程序?
當應用程序更改段寄存器值本身時會發生什麼? 我知道只有CS不能被更改,因爲它具有當前CPU的CPL。 ,但其他寄存器(SS,DS ...)可以更改。
誰的依據是什麼?(內核調度??)段寄存器的內容填充
引導程序一樣。 ISR和異常處理程序。系統調用處理程序。調度器的確如此。其他部分可能需要。寄存器被認爲是私有的,並且在各種上下文切換期間必須被保存和恢復。而且,當然,他們也需要在某個先前的位置進行初始化。
基於這些寄存器需要什麼。它們的價值觀不是在操作系統的不同部分之間以及不同的程序之間普遍共享的。
當應用程序更改自己的段寄存器值時會發生什麼?我知道只有CS不能被更改,因爲它具有當前CPU的CPL。但其他寄存器(SS,DS ...)可以更改。
會發生什麼情況?它要麼成功地改變它,要麼導致一個異常(通常是#GP),然後發生任何異常處理程序,或者如果沒有或者有問題,則會發生三重故障,CPU重置以及可能重新啓動整個計算機。
如果您知道還能在當前特權級別加載哪些內容,則可以更改任何段寄存器。如果您的程序處於第3級,並且操作系統爲其設置了DPL = 3的兩個代碼段,則程序可以將其中的任何一個用於CS寄存器。如果你不知道這一點,那麼你很可能會使程序崩潰。
我想知道x86段寄存器的細節。
讓自己的副本,並閱讀:
英特爾®64和IA-32架構軟件開發人員手冊卷組合:1,2A,2B,3A和3B。您可以通過相關章節(內存管理,中斷/異常處理,任務切換)或搜索特定的寄存器(例如CS或SS或DS)或查看特定指令的描述和僞代碼。
你不會對這個模糊的問題得到更準確的答案。
謝謝!它仍然非常有幫助 – daehee