CPU模式学习总结
CPU 模式
大部分CPU 至少都有兩種CPU 模式。CPU 模式也稱為特權級,它會根據CPU 的工作模式限制可以執行的
操作。CPU 模式中,全部指令可以無限制執行的模式稱為內核模式(Kernel Mode)或管理者模式
(Supervisor Mode),操作系統等系統軟件需要在內核模式下工作。反之,可執行的指令被限制的模式
稱為用戶模式(User Mode),應用軟件通常在用戶模式下工作。用戶模式中被限制的操作包括CPU 控制
寄存器的訪問、改變CPU 狀態的指令等。如果應用程序擅自更改CPU 的狀態,最壞會導致操作系統崩潰
。因此,需要根據CPU 模式管理各種軟件的權限。
大多情況下,CPU 的控制寄存器內都有可以設置CPU 模式的區域。在從高權限的內核模式轉換到低權限
的用戶模式時,可以通過操作控制寄存器來實現。反之,如果要從低權限的用戶模式轉換到高權限的內
核模式,需要使用專用的指令。
========
CPU三種工作模式
??一直以來,都搞不清楚這幾個概念。在網上搜了一下,把它曬上,不會再忘記!?
? ? ? 從80386開始,cpu有三種工作方式:實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候
是real-mode,等到linux操作系統運行 起來以后就運行在保護模式。實模式只能訪問地址在1M以下的內
存稱為常規內存,我們把地址在1M 以上的內存稱為擴展內存。在保護模式下,全部32條地址線有效,可
尋址高達4G字節的物理地址空間; 擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅為存
儲器共享和保護提供了硬件支持,而且為實現虛擬存儲器提供了硬件支持; 支持多任務,能夠快速地進
行任務切換和保護任務環境; 4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼和數據
的安全和保密及任務的隔離; 支持虛擬8086方式,便于執行8086程序。
? ? ? 虛擬8086模式是運行在保護模式中的實模式,為了在32位保護模式下執行純16位程序。它不是一
個真正的CPU模式,還屬于保護模式。?
? ? ? 保護模式同實模式的根本區別是進程內存受保護與否。可尋址空間的區別只是這一原因的果。實
模式將整個物理內存看成分段的區域,程序代碼和數據位于不同 區域,系統程序和用戶程序沒有區別對
待,而且每一個指針都是指向"實在"的物理地址。這樣一來,用戶程序的一個指針如果指向了系統程序
區域或其他用戶程序 區域,并改變了值,那么對于這個被修改的系統程序或用戶程序,其后果就很可能
是災難性的。為了克服這種低劣的內存管理方式,處理器廠商開發出保護模式。這 樣,物理內存地址不
能直接被程序訪問,程序內部的地址(虛擬地址)要由操作系統轉化為物理地址去訪問,程序對此一無
所知。
? ? ? 至此,進程(這時我們可以稱程序 為進程了)有了嚴格的邊界,任何其他進程根本沒有辦法訪問
不屬于自己的物理內存區域,甚至在自己的虛擬地址范圍內也不是可以任意訪問的,因為有一些虛擬區?
域已經被放進一些公共系統運行庫。這些區域也不能隨便修改,若修改就會有: SIGSEGV(linux 段錯誤
);非法內存訪問對話框(windows 對話框)。
? ? ? CPU啟動環境為16位實模式,之后可以切換到保護模式。但從保護模式無法切換回實模式?
? ? ??
? ? ?事實上,現在的64位奔騰4處理器,擁有三種基本模式和一種擴展模式,?
? ? ?基本模式:?
? ? ? ? ? ? ? ? ?保護模式:純32位保護執行環境。
? ? ? ? ? ? ? ? ?實模式:純16位無保護執行環境。?
? ? ? ? ? ? ? ? ?系統管理模式:當SMI引腳為有效進入系統管理模式,首先保存當前的CPU上下文。它
有獨立的地址空間,用來執行電源管理或系統安全方面的指令。?
? ? ?擴展模式:
? ? ? ? ? ? ? ? ?IA-32e模 式: 64位操作系統運行在該模式。該模式有兩種子模式:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1)兼容模式:該模式下,64位操作系統運行在32位兼容環境,
能正常運行16,32位應用程序就像基本的保護模式一樣,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 訪問32位地址空間,但不能 運行純16位
實模式程序(就是不能運行虛擬86模式程序了)。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2)64位模式:在該模式下,處理器完全執行64位指令,使用64
位地址空間和64操作數,運行16,32位程序必須切換到兼容模式。
? ? ? ? ? ? ? ? ?IA-32e子模式的切換完全基于代碼段寄存器。這樣一來,運行在IA-32e模式中(64位
)的OS完全可以無縫的運行所有16,32,64為應用程序,
? ? ? ? ? ? ? ? ?通過設置32位后的CS。
========
總結
- 上一篇: C++ string源码
- 下一篇: UEStudio使用入门