IA-32 Intel手册学习笔记(二)保护模式下的内存管理
內存管理概述(Memory Management Overview)
Inter體系結構的內存管理可分為兩部分:分段和分頁。
- 分段提供了一種機制,這種機制可以為每個程序或者任務提供單獨的代碼、數據和棧模塊,這就保證了多個進程或者任務能夠在同一個處理器上運行而不互相干擾。
- 分頁機制提供了虛擬內存系統,在這種系統中,程序的執行代碼按需要被映射到物理內存中。分頁機制同樣可以用來隔離多個任務。
- 在保護模式下,分段機制是必須的,分頁機制是可選的
分段機制將處理器可尋址空間(即線性空間)分成若干個較小的受保護的地址空間段。段可以用來裝載程序的代碼,數據或者堆棧,也可以用來裝載系統的數據結構(如TSS、LDT等)。當處理器上運行多個進程時,操作系統為每個進程分配屬于它自己的段,同時處理器會規定這些段的邊界,保證一個進程不會對另一個進程的段進行讀寫造成干擾。
系統中所有的段都在處理器的線性地址空間內,但是只有邏輯地址才能確定一個字節在特定段中的位置。所以在實際程序訪問內存時,需要有某種機制將邏輯地址映射到線性地址。邏輯地址由段選擇符和偏移量組成。通過段選擇符,可以在全局/局部描述符表(GDT/LDT)中唯一定位一個段描述符,每個段描述符記錄一個段在線性地址空間的基地址,然后通過和偏移量相加,得到實際的線性地址。
在保護模式下,段選擇符其實就是CS寄存器,是16位的。偏移量是EIP寄存器,是32位的。上述過程其實就是將CS中16位的邏輯地址映射成32位的線性地址。
段的使用(Using Segments)
intel架構所使用的分段機制被用來實現各種不同的系統設計
基本平坦模型(Basic Flat Model)
- 僅僅利用分段來保護程序。操作系統和應用程序可以訪問一個連續的,沒有分段的地址空間,即使所訪問的地址處并沒有物理內存時,也不會產生“超出內存范圍”異常
受保護的平坦模型(Protected Flat Model)
- 和基本平坦模型類似,只是段限長被設定為實際物理內存范圍內,如果試圖訪問實際內存以外的地址,會產生一個通用保護異常
多段模型(Multi-Segment Model)
- 充分利用了分段機制,提供了對代碼,數據結構以及程序的硬件級的強制保護。在這里,每個進程擁有自己的段描述符表及自己的段。LDT?
邏輯地址和線性地址(Logical And Linear Address)
邏輯地址
- 相對于該進程所在段基地址的偏移地址,應用程序直接使用的其實就是邏輯地址,而不需要關心分段分頁機制轉換的物理地址。邏輯地址由16位的段選擇符(CS)和一個32位的偏移量(EIP)組成。
線性地址
- 作為邏輯地址和物理地址轉換的一個橋接。邏輯地址是偏移量,段描述符中的地址是基地址,二者相加的結果是線性地址。線性地址是32位地址,地址空間中包含了所有的段以及為系統而定義的各種系統表
物理地址
- 實際內存中的地址,即地址總線上的尋址。如果沒有采用分頁機制,那么線性地址就是物理地址。如果采用分頁機制,那么需要通過頁目錄和頁表轉換成物理地址。32位機器總共有32根地址總線,實際物理地址內存空間為4GB,即2的32次方
三者之間的轉換關系如下
- 通過邏輯地址中的段選擇符,在GDT或LDT中定位該段的段描述符(僅當一個新的段選擇符被讀入段寄存器時才執行這一步?)
- 檢查段描述符中的訪問權限和段的地址范圍以確保該段是可訪問的,即偏移量在段限長范圍內
- 將段描述符中的段基址與偏移量相加構成線性地址
- 如果沒有采用分頁,那么線性地址就是物理地址,否則,需要根據頁目錄和也表將線性地址轉換成物理地址
段選擇符
段選擇符是一個16位的段標識符,它并不直接指向該段,而是指向定義該段的段描述符。段選擇符其實就是CS : EIP中的CS。一個段選擇符包含一下項目
- Index索引,在3-15位。標識對應的段描述符在GDT/LDT中的索引,尋址時索引 * 8 + GDT/LDT的基地址就可以找到對應的段描述符
- TI標記,在第2位。用于標識使用哪一個描述符表,0表示GDT,1表示LDT
- RPL請求的特權級,在0-1位。確定該選擇符的特權級。特權級從0-3,0為最高特權級(內核),3為最低特權級(用戶)
段描述符
段描述符是一個64位的段標識符,占8個字節,位于GDT/LDT中,其中的標志和字段如下
- 段限長字段,指定了段的大小。
- 基地址域,該描述符指向的段內存的基地址
- 類型域,指明段或者門的類型,確定段的范圍權限和增長方向
- S(描述符類型)標志,確定段描述符是系統描述符或者代碼(S標記為0時),數據段標識符(S標記為1時)
- DPL(描述符特權級)域,指明該段的特權級,特權級從0-3。0為最高特權級,DPL用來控制對該段的訪問
- P(段存在)標志,指出該段是否在內存中(1表示在內存中,0表示不在內存中)
- D/B(默認操作數大小/默認棧指針大小/上限)標志,根據這個段描述符所指的是一個可執行代碼段,一個向下擴展的數據段還是一個堆棧段,這個標志完成不同的功能
- G(粒度)標志,確定該段限長擴展的增量
- 可用及保留的為s
GDT中的第一項是空,不能被使用,如果使用該項訪問內存,處理器會產生一個異常
分頁機制(Paging Modes)
分頁機制提供了一種虛擬內存環境,虛擬內存通過一個較小的物理內存以及磁盤空間來模擬一個很大的線性地址空間。在分頁機制下,每個段被分成很多頁(通常一個頁的大小是4KB),這些頁或者在物理內存中,或者在磁盤上。操作系統會維護一個頁目錄和一組頁表來跟蹤這些頁。當一個進程試圖訪問線性地址空間的一個地址時,處理器會通過頁目錄和頁表將線性地址映射成物理地址,然后對其進行操作(讀或寫)。如果被訪問的頁不在當前的物理內存中,處理器會從磁盤上讀取缺少的這頁到物理內存中,接著執行操作。
處理器用來映射線性地址到物理地址的信息和產生缺少缺頁異常的信息都在頁目錄和頁表中,頁目錄和頁表都在內存中。
為了減少地址轉換所使用的總線周期,最近被訪問過的頁目錄和頁表項都被緩存在一個叫做轉換后備緩沖區(translation lookaside buffers, TLBs)的設備中。TLBs可以滿足多數的讀當前頁目錄和頁表的請求而不占用總線周期。僅當所訪問的頁表項不在TLBs中時,才需要額外的總線周期。
分段和分頁有本質的不同
- 分頁使用固定大小的頁面,頁有固定的尺寸。一個進程的數據結構可以部分在內存,部分在磁盤
- 分段的每個段的大小不固定,與它所持有的代碼,數據總和有關。如果僅僅使用分段作為唯一的地址轉換形式,一個進程的數據結構必須全部在物理內存中
如果沒有采用分頁機制,那么線性地址就是物理地址。
頁表和頁目錄
當啟動分頁機制時,處理器用來進行線性地址到物理地址轉換的信息都包含在4個數據結構中
- 頁目錄,一個由32位頁目錄項組成的數組。它被放在一個4KB的頁中,頁目錄最多包含1024個頁目錄。
- 頁表,一個由32位頁表項組成的數組。它存放在一個4KB的頁中,頁表最多包含1024個頁表項。對于2MB和4MB的頁,不適用頁表。這些頁直接從一個或者更多的頁目錄項映射。
- 頁,一個4KB,2MB或者4MB的平坦地址空間。
- 頁目錄指針表,由4個64位的項組成的數組,每一項都指向一個頁目錄。僅當啟用物理地址擴展時才使用這個數據結構。
總結
以上是生活随笔為你收集整理的IA-32 Intel手册学习笔记(二)保护模式下的内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----将间隔
- 下一篇: 每天一道LeetCode-----将数组