日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

一步步编写操作系统 38 一级页表与虚拟地址3

發布時間:2023/12/10 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 38 一级页表与虚拟地址3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上,頁是地址空間的計量單位,并不是專屬物理地址或線性地址,只要是4KB的地址空間都可以稱為一頁,所以線性地址的一頁也要對應物理地址的一頁。一頁大小為4KB,這樣一來,4GB地址空間被劃分成4GB/4KB=1M個頁,也就是4GB空間中可以容納1048576個頁,頁表中自然也要有1048576個頁表項,這就是我們要說的一級頁表。一級頁表如圖:

這是一級頁表模型,由于頁大小是4KB,所以頁表項中的物理地址都是4k的整數倍,故用16進制表示的地址,低3位都是0。就拿第3個頁表項來說,其值為0x3000,表示該頁對應的物理地址是0x3000。

可能,您心里一直有個疑問:頁表如何使用呢?也就是如何將線性地址轉換成物理地址呢?

還是用圖5-10幫助理解,滑塊正落到在32位地址的第12位。右邊11~0位用來表示頁的大小,也就是這12位可以做為頁內尋址。左邊31~12位用來表示頁的數量,同樣這20位也用來索引一個頁(索引范圍0~0xfffff),表示第幾個頁,對吧。

其實也可以這樣理解:任意一個地址最終會落到某一個物理頁中。32位地址空間共有1M(1048756)個物理頁,首先要做的是定位到某個具體物理頁,然后給出物理頁內的偏移量就可以訪問到任意1字節的內存啦。所以,用20位二進制就可以表示全部物理頁啦。標準頁都是4KB,12位二進制便可以表達4KB之內的任意地址。

在32位保護模式下任何地址都是用32位二進制表示,包括虛擬地址也是。經以上分析,虛擬地址的高20位可用來定位一個物理頁,低12位可用來在該物理頁內尋址。這是如何實現的呢?物理地址是寫在頁表的頁表項中,段部件輸出的只是線性地址,所以問題就變成了:怎樣用線性地址找到頁表中對應的頁表項

在此之前,大家要知道兩件事:

  • 分頁機制打開前要將頁表地址加載到控制寄存器cr3中,這是啟用分頁機制的先決條件之一,在介紹二級頁表時會細說。所以,在打開分頁機制前加載到寄存器cr3中的是頁表的物理地址,頁表中頁表項的地址自然也是物理地址了。
  • 雖然內存分頁機制的作用是將虛擬地址轉換成物理地址,但其轉換過程相當于在關閉分頁機制下進行,過程中所涉及到的頁表及頁表項的尋址,它們的地址都被cpu當做最終的物理地址(本來也是物理地址)直接送上地址總線,不會被分頁機制再次轉換(否則會遞歸轉換下去)。
  • 剛才說過啦,如何通過線性地址找到其對應的頁表項才是轉換的關鍵。既然頁表是位于內存中,所以只要提供頁表項的物理地址便能夠訪問到頁表項。頁表本身屬于線性表結構,相當于頁表項數組,訪問其中任意頁表項成員,只要知道該表頁項的索引(下標)就夠了。

    分析過后,地址轉換過程原理如下:

    一個頁表項對應一個頁,所以,用線性地址的高20位做為頁表項的索引,每個頁表項要占用4字節大小,所以這高20位的索引乘以4后才是該頁表項相對于頁表物理地址的字節偏移量。用cr3寄存器中的頁表物理地址加上此偏移量便是該頁表項的物理地址,從該頁表項中得到映射的物理頁地址,然后用線性地址的低12位與該物理頁地址相加,所得的地址之和便是最終要訪問的物理地址。

    曾經有同學對地址轉換過程感到迷惑,誤以為啟用分頁后,頁表項地址也是虛擬地址,還需要被轉換,轉換過程無限遞歸下去,這顯然是不對的。

    以上所說的轉換步驟多少都有點麻煩,既然地址轉換算法已經是固定的了,何不使其在硬件一級自動完成呢。有道理,所以cpu中集成了專門用來干這項工作的硬件模塊,我們把該模塊稱為頁部件。當程序中給出一個線性地址時,頁部件分析線性地址,按照以上算法,自動在頁表中檢索到物理地址。

    總結一下頁部件的工作:用線性地址的高20位在頁表中索引頁表項,用線性地址的低12位與頁表項中的物理地址相加,所求的和便是最終線性地址對應的物理地址。

    咱們還是通過例子來理解轉換過程吧。拿mov ax,[0x1234]來說,其地址轉換完整過程如圖:

    假設咱們是在平坦模型下工作,不管段選擇子值是多少,其所指向的段基址都是0,指令mov ax,[0x1234]中的0x1234稱為有效地址,它做為“段基址:段內偏移地址”中的段內偏移地址。這樣段基址為0,段內偏移地址為0x1234,經過段部件處理后,輸出的線性地址是0x1234。由于咱們是演示分頁機制,必須假定系統已經打開了分頁機制,所以線性地址0x1234被送入了頁部件。頁部件分析0x1234的高20位,用16進制表示高20位是0x00001。將此項做為頁表項索引,再將該索引乘以4后加上cr3寄存器中頁表的物理地址,這樣便得到索引所指代的頁表項的物理地址,從該物理地址處(頁表項中)讀取所映射的物理頁地址:0x9000。線性地址的低12位是0x234,它做為物理頁的頁內偏移地址與物理頁地址0x9000相加,和為0x9234,這就是線性地址0x1234最終轉換成的物理地址。

    一級頁表說了這么多,完全是為了講述頁表原理,這樣就能更好的理解下面要講的二級頁表,它們在原理上一脈相承。因為目前現代操作系統一般都是用二級頁表,咱們的系統也采用二級頁表,下一節咱們再見啦。

    總結

    以上是生活随笔為你收集整理的一步步编写操作系统 38 一级页表与虚拟地址3的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。