1. 實模式
在實模式下,CPU不會為任務提供任務的保護機制,代碼任意運行。8086處理器是學習實模式的常用例子。它內部大致有以下寄存器:
- 8個16位的通用寄存器:
- AX (可以拆分成兩個AH/AL的8位寄存器)
- BX (BH,BL)
- CX (CH,CL)
- DX (DH,DL)
- SI (source index, 源索引寄存器)
- DI (destination index, 目的索引寄存器)
- BP (base pointer, 基數指針寄存器)
- SP (stack pointer, 堆棧指針寄存器)
- 段寄存器
- CS (code segment, 代碼段寄存器)
- DS (data segment, 數據段寄存器)
- ES (extra segment, 附加段寄存器)
- SS (stack segment, 堆棧段寄存器)
- 專用寄存器
- IP (instruction pointer, 指令指針寄存器, 它只與CS一起使用,只有處理器才能直接改變它的值)
- FLAGS (標志位寄存器)
2. 實模式下的分段機制.
在實模式下,當處理器訪問內存時,它把指令中的指針的內存地址看成是段內的偏移地址,而不是物理地址: CS與IP一起使用,內存地址與DS(默認使用DS,也可以指定ES寄存器)一起使用. 具體來說,段地址左移4位 + 偏移地址 就得到了分段模式下的線段地址(不啟動分頁時,就這是物理地址).
3. 32位下的保護模式
保護模式是指CPU從硬件機制上提供了用戶程序對內存的訪問限制,為多用戶多任務的程序進行了彼此隔離,防止因某個程序的編寫錯誤影響到操作系統和其它用戶。保護模式下提供了修改段寄存器的保護/代碼段的保護/棧操作時的保護/數據訪問的保護等。具體如何保護的,得詳細看看《x86匯編語言從實模式到保護模式》一書,里面說的還是很明白的。如果不寫操作系統的話,真的沒有太大必要了解很清楚,因為看完之后過一段時間對會忘記了.
4. 保護模式下的分段機制
在32位處理器中,在原有的CS/DS/ES/SS段寄存器的基礎上對增加了FS/GS段寄存器,並且每一個16位的段寄存器都對應了一個描述符高速緩存器。 在32的保存模式下,段寄存器中存放不是段地址,而是段的描述符的索引號。過程是這樣的:在使用一個段之前都需要把該段的描述符(占6個字節)登記注冊的段描述符表中(GDT或LDT),在使用一個段時,在段寄存器是放在是該段的描述符在段描述符表中的索引號,cpu會自動把段對應的描述符加載到段寄存器對應的調整緩存器中(這里面有段地址).
- 全局描述符表(GDT): 存放全局的段描述符.
- GDTR: 48位的全局描述符表寄存器,前32位存放了GDT在內存起始位置的線性地址, 后16位存放了全局描述符表的大小(16位,64Kb, 每一個段描述符大小8b, 所以最多可以定義8192個段描述符).
- 局部描述符表(LDT): 存放每一個任務自己段描述符.
- LDTR: LDT寄存器,類似GDTR, 保存當前任務的LDT的位置信息.
- 任務狀態段(TSS): 為了保存任務的狀態,並在下一次重新執行時恢復它們,每個任務都應用一個額外的內存區域保存上下文相關的信息(各寄存器的值),這就叫做任務狀態段. 它有固定的格式,最小為104字節.
- TR寄存器:指向當前任務的TSS.
段部件負責求出線性地址.
5. 32位下的分頁機制
- 頁目錄
- 頁表
