操作系统OS-分页、页表
大部分虛擬內存系統中都使用一種稱為 分頁(paging) 的技術,我們現在就介紹這一技術。在任何一臺計算機上,程序引用了一組內存地址。當程序執行指令
MOV REG, 1000
時,它把地址為1000的內存單元的內容復制到REG中(或者相反,這取決于計算機的型號)。地址可以通過索引、基址寄存器、段寄存器或其他方式產生。
由程序產生的這些地址稱為 虛擬地址( virtual address) ,它們構成了一個 虛擬地址空間( virtual addressspace) 。在沒有虛擬內存的計算機上,系統直接將虛擬地址送到內存總線上,讀寫操作使用具有同樣地址的物理內存字;而在使用虛擬內存的情況下,虛擬地址不是被直接送到內存總線上,而是被送到 內存管理單元( Memoiy Management Unit, MMU) ,MMU把虛擬地址映射為物理內存地址,如圖3-8所示。
圖3-9所示的簡單例子說明了這種映射是如何工作的。在這個例子中,有一臺可以產生16位地址的計算機,地址范圍從0到64K-1,且這些地址是虛擬地址。然而,這臺計算機只有32KB的物理內存,因此,雖然可以編寫64KB的程序,但它們卻不能被完全調入內存運行。在磁盤上必須有一個最多64KB的程序核心映像的完整副本,以保證程序片段在需要時能被調入內存。
虛擬地址空間按照固定大小劃分成被稱為 頁面(page) 的若干單元。在物理內存中對應的單元稱為 頁框(page frame)。頁面和頁框的大小通常是一樣的,在本例中是4KB,但實際系統中的頁面大小從512字節到1GB。對應干64KB的虛擬地址空間和32KB的物理內存,可得到16個虛擬頁面和8個頁框。
RAM和磁盤之間的交換總是以整個頁面為單元進行的。很多處理器根據操作系統認為適合的方式,支持對不同大小頁面的混合使用和匹配。例如,X86-64架構的處理器支持4KB、2MB和1GB大小的頁面,因此,可以將一組4KB大小的頁面用于用戶程序,將一個1GB大小的頁面用于內核程序。稍后將介紹為什么有時候用一個較大的頁面好于用一堆較小的頁面。
圖3-9中的標記符號如下:標記0K-4K的范圍表示該頁的虛擬地址或物理地址是0-4095, 4K~8K的范圍表示地址4096-8191,等等。毎一頁包含了4096個地址,起始于4096的整數倍位置,結束于4096倍數缺1的位置。
當程序試圖訪問地址0時,例如執行下面這條指令
MOV REG, 0
將虛擬地址0送到MMU。MMU看到虛擬地址落在頁面0 (0?4095),根據其映射結果,這一頁面對應的是頁框2 (8192-12287),因此MMU把地址變換為8192,并把地址8192送到總線上。內存對MMU一無所知,它只看到一個讀或寫地址8192的請求并執行它。MMU從而有效地把所有從0-4095的虛擬地址映射到了 8192~12287的物理地址。
同樣地,指令
MOV REG, 8192
被有效地轉換為:
MOV REG, 24576
因為虛擬地址8192 (在虛擬頁面2中)被映射到物理地址24 576 (在物理頁框6中)上。第三個例子,虛擬地址20 500在距虛擬頁面5 (虛擬地址20 480~24 575>起始地址20字節處,并且被映射到物理地址12 288 + 20=12 308。通過恰當地設置MMU,可以把16個虛擬頁面映射到8個頁框中的任何一個。但是這并沒有解決虛擬地址空間比物理內存大的問題。在圖3-9中只有8個物理頁框,干是只有8個虛擬頁面被映射到了物理內存中,在圖3-9中用叉號表示的其他頁面并沒有被映射。在實際的硬件中,用一個 “在/不在”位(present/absent bit) 記錄頁面在內存中的實際存在情況。
當程序訪問了一個未映射的頁面,例如執行指令
MOV REG, 32780
將會發生什么情況呢?虛擬頁面8 (從32 768開始)的第12個字節所對應的物理地址是什么呢? MMU注意到該頁面沒有被映射(在圖中用叉號表示),于是使CPU陷入到操作系統,這個陷阱稱為 缺頁中斷 或 缺頁錯誤( page fault) 。操作系統找到一個很少使用的頁框且把它的內容寫入磁盤(如果它不在磁盤上)。隨后把需要訪問的頁面讀到剛才回收的頁框中,修改映射關系,然后重新啟動引起陷阱的指令。
例如,如果操作系統決定放棄頁框1,那么它將把虛擬頁面8裝入物理地址4096,并對MMU映射做兩處修改。首先,它要將虛擬頁面1的表項標記為未映射,使以后任何對虛擬地址4096-8191的訪問都導致陷阱。隨后把虛擬頁面8的表項的叉號改為1,因此在引起陷阱的指令m新啟動時,它將把虛擬地址32 780映射為物理地址4108 (4096+12)。
下面査看一下MMU的內部結構以便了解它是怎么工作的,以及了解為什么我們選用的頁面大小都是2的整數次冪 6 在 圖 3-10中可以看到一個虛擬地址的例子,虛擬地址 8196 (二進制是0010000000000100)用圖3-9所示的MMU映射機制進行映射,輸入的丨6位虛擬地址被分為4位的頁號和12位的偏移置。4位的頁號可以表示16個頁面,12位的偏移可以為一頁內的全部4096個字節編址。
可用 頁號 作為 頁表( page table) 的索引,以得出對應于該虛擬頁面的頁框號。如果“在/不在”位是0,則將引起一個操作系統陷阱。
頁表項
頁表項的結構是與機器密切相關的,但不同機器的頁表項存儲的信息都大致相同。圖3-11中給出了頁表項的一個例子。不同計算機的頁表項大小可能不一樣,但32位是一個常用的大小。最重要的域是 頁框號。畢竟頁映射的目的是找到這個值,其次是“在/不在”位。這一位是1時表示該表項是有效的,可以使用,如果是0,則表示該表項對應的虛擬頁面現在不在內存中,訪問該頁面會引起一個缺頁中斷。
保護(protection)位 指出一個頁允許什么類型的訪問。最簡單的形式是這個域只有一位,0表示讀/寫,1表示只讀。一個更先進的方法是使用三位,各位分別對應是否啟用讀、寫、執行該頁面。
為了記錄頁面的使用狀況,引入了修改(modified)位和訪問( referenced)位。在寫入一貞時由硬件自動設置修改位。該位在操作系統重新分配頁框時是非常有用的。如果一個頁面已經被修改過(即它是“臟”的),則必須把它寫回磁盤。如果一個頁面沒有被修改過(即它是“干凈”的),則只簡單地把它丟棄就可以了,因為它在磁盤上的副本仍然是有效的。這一位有時也被稱為臟位(dirty bit),因為它反映了該頁面的狀態。
不論是讀還是寫,系統都會在該頁面被訪問時設置訪問位。它的值被用來幫助操作系統在發生缺頁中斷時選擇要被淘汰的頁面。不再使用的頁面要比正在使用的K面更適合淘汰。這一位在即將討論的很多頁面置換算法中都會起到重要的作用。
最后一位用于禁止該頁面被高速緩存。對那些映射到設備寄存器而不是常規內存的頁面而言,這個特性是非常重要的。假如操作系統正在緊張地循環等待某個I/O設備對它剛發出的命令作出響應,保證硬件是不斷地從設備中讀取數據而不是訪問一個舊的被高速緩存的副本是非常東要的。通過這一位可以禁止髙速緩存。具有獨立的I/O空間而不使用內存映射1/0的機器不需要這一位。
應該注意的是,若某個頁面不在內存中,用干保存該頁面的磁盤地址不是頁表的組成部分。原因很簡單,頁表只保存把虛擬地址轉換為物理地址時硬件所需要的信息。操作系統在處理缺頁中斷時需要把該頁面的磁盤地址等信息保存在操作系統內部的軟件表格中。硬件不需要它。
為了更好理解頁表項,我們來看一下這個例子
這里直接貼上鏈接
https://blog.csdn.net/u010744711/article/details/51254120/
引用了一張圖片
總結
以上是生活随笔為你收集整理的操作系统OS-分页、页表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据仓库Hive
- 下一篇: Hadoop伪分布安装及简单使用