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