進行系統調用時,使用代碼段寄存器或控制寄存器進行預取級別檢查嗎?代碼段寄存器在系統調用中的作用
intel cpus中的代碼段寄存器是用於分段的目的。我不清楚在Linux中如何處理分頁和intel x86機制。
如果有人解釋了在系統調用關於級別變化時發生在cpu中的情況,會有很大的幫助。
進行系統調用時,使用代碼段寄存器或控制寄存器進行預取級別檢查嗎?代碼段寄存器在系統調用中的作用
intel cpus中的代碼段寄存器是用於分段的目的。我不清楚在Linux中如何處理分頁和intel x86機制。
如果有人解釋了在系統調用關於級別變化時發生在cpu中的情況,會有很大的幫助。
Linux從未使用286風格分割來分離進程,或以其他方式使虛擬內存有趣地分割,而是從頭開始使用386風格的分頁。轉移到內核模式(syscall)過去是一個簡單的int
指令,它根據中斷表傳送執行,並導致CPU進入內核模式(保護級別0)。但是,CPU仍然需要重新加載段描述符來「學習」新的保護級別和新段的位置(儘管它總是與CPU「不知道」的虛擬內核模式段相同)。
AMD和英特爾提出了optimized instructions以使此過程更快,這是此平臺上所有操作系統都使用的實際情況。
然後內核代碼必須做更多的工作來保存堆棧上的寄存器並將它們初始化爲新的值,但這並沒有改變。但這通常不被理解爲系統調用過程的一部分。
當進行系統調用時,使用代碼 檢查特權級別使用段寄存器還是控制寄存器?
通過中斷表中引用的權限級別獲得,不檢查,從新代碼段 - 或,在優化的情況下,作爲預加載到MSR(一個CPU寄存器不非內核代碼可訪問)。
另一種說法是,切換到0級的切換是在CPU級別自動進行的,但是段描述符和/或MSR需要由內核預先安排,這樣才能真正導致內核執行陷阱處理程序而不僅僅是一般性的保護錯誤。
我在linux的同一進程地址空間裏有一個double.is內核模式,它使用系統調用進入內核模式,或者內核代碼是完全不同的進程? – Dhatri 2012-07-09 18:06:38
@vindhya - 進程和地址空間是不同的東西。地址空間主要由CPU提供。進程由操作系統提供;每個進程由地址空間,內核模式堆棧空間,打開文件表等組成。兩個進程的地址空間完全重疊(如果它們只是您稱之爲「相同進程」的線程),或者部分地與所有內核內存映射到相同的地址,但不能從用戶模式訪問。系統調用不會更改進程,並且不會更改地址空間。 – 2012-07-09 20:21:53