http://bbs.21ic.com/icview-127516-1-1.htmlphp
許多年之前,當人們還在使用DOS或是更古老的操做系統的時候,計算機的內存還很是小,通常都是以K爲單位進行計算,相應的,當時的程序規模也不大,因此內存容量雖然小,但仍是能夠容納當時的程序。但隨着圖形界面的興起還用用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題出如今程序員的面前,那就是應用程序太大以致於內存容納不下該程序,一般解決的辦法是把程序分割成許多稱爲覆蓋塊(overlay)的片斷。覆蓋塊0首先運行,結束時他將調用另外一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,可是必須先由程序員把程序先進行分割,這是一個費時費力的工做,並且至關枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小能夠超過物理存儲器的大小,操做系統把當前使用的部分保留在內存中,而把其餘未被使用的部分保存在磁盤上。比 如對一個16MB的程序和一個內存只有4MB的機器,OS經過選擇,能夠決定各個時刻將哪4M的內容保留在內存中,並在須要時在內存和磁盤間交換程序片 段,這樣就能夠把這個16M的程序運行在一個只具備4M內存機器上了。而這個16M的程序在運行前沒必要由程序員進行分割。
任什麼時候候,計算機上都存在一個程序可以產生的地址集合,咱們稱之爲地址範圍。這個範圍的大小由CPU的位數決定,例如一個32位的CPU,它的地址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的地址範圍爲0~0xFFFFFFFFFFFFFFFF (64T).這個範圍就是咱們的程序可以產生的地址範圍,咱們把這個地址範圍稱爲虛擬地址空間,該空間中的某一個地址咱們稱之爲虛擬地址。與虛擬地址空間和虛擬地址相對應的則是物理地址空間和物理地址,大多數時候咱們的系統所具有的物理地址空間只是虛擬地址空間的一個子集,這裏舉一個最簡單的例子直觀地說明這二者,對於一臺內存爲256MB的32bit x86主機來講,它的虛擬地址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x000000000~0x0FFFFFFF(256MB)。
在沒有使用虛擬存儲器的機器上,虛擬地址被直接送到內存總線上,使具備相同地址的物理存儲器被讀寫。而在使用了虛擬存儲器的狀況下,虛擬地址不是被直接送到內存地址總線上,而是送到內存管理單元——MMU(主角終於出現了:])。他由一個或一組芯片組成,通常存在與協處理器中,其功能是把虛擬地址映射爲物理地址。
大多數使用虛擬存儲器的系統都使用一種稱爲分頁(paging)。虛擬地址空間劃分紅稱爲頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。接下來配合圖片我以一個例子說明頁與頁框之間在MMU的調度下是如何進行映射的
mmu1.gif (5.3 KB)
2007-3-23 21:19
在這個例子中咱們有一臺能夠生成16位地址的機器,它的虛擬地址範圍從0x0000~0xFFFF(64K),而這臺機器只有32K的物理地址,所以他能夠運行64K的程序,但該程序不能一次性調入內存運行。這臺機器必須有一個達到能夠存放64K程序的外部存儲器(例如磁盤或是FLASH),以保證程序片斷在須要時能夠被調用。在這個例子中,頁的大小爲4K,頁框大小與頁相同(這點是必須保證的,內存和外圍存儲器之間的傳輸老是以頁爲單位的),對應64K的虛擬地址和32K的物理存儲器,他們分別包含了16個頁和8個頁框。
咱們先根據上圖解釋一下分頁後要用到的幾個術語,在上面咱們已經接觸了頁和頁框,上圖中綠色部分是物理空間,其中每一格表示一個物理頁框。橘本人html
00:當前級別下,該內存區域不容許被訪問,任何的訪問都會引發一個domain fault 01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查 10:保留狀態(咱們最好不要填寫該值,以避免引發不能肯定的問題) 11:當前級別下,對該內存區域的訪問都不進行權限檢查。 咱們再來看看discriptor中的Domain區域,該區域總共有4個bit,裏面的值是對DOMAIN ACCESS CONTROL REGISTER中16個區域的索引.而AP位配合S bit和A bit對當前描述符描述的內存區域被訪問權限的說明,他們的配合關係以下圖所示: AP位也是有四個值,我結合實例對其進行說明. 在下面的例子中,咱們的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,以下圖所示: mmu7.jpg (23.15 KB) 2007-3-23 21:19 例1: Discriptor 中的domain=4,AP=10(這種狀況下S bit ,A bit 被忽略) 假設如今我要對該描述符描述的內存區域進行訪問: 因爲domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。 假設當前CPU處於Supervisor模式下,則程序能夠對該描述符描述的內存區域進行讀寫操做。 假設當前CPU處於User模式下,則程序能夠對該描述符描述的內存進行讀訪問,若對其進行寫操做則引發一個permission fault. 例2: Discriptor 中的domain=0,AP=10(這種狀況下S bit ,A bit 被忽略) domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系統對任何內存區域的訪問都不進行訪問權限的檢查。 因爲統對任何內存區域的訪問都不進行訪問權限的檢查,因此不管CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存均可以順利地進行讀寫操做 例3:Discriptor 中的domain=4,AP=11(這種狀況下S bit ,A bit 被忽略) 因爲domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。 因爲AP=11,因此不管CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存均可以順利地進行讀寫操做 例4: Discriptor 中的domain=4,AP=00, S bit=0,A bit=0 因爲domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。 因爲AP=00,S bit=0,A bit=0,因此不管CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都只能進行讀操做,不然引發permission fault. 經過以上4個例子咱們得出兩個結論: 1.對某個內存區域的訪問是否須要進行權限檢查是由該內存區域的描述符中的Domain域決定的。 2.某個內存區域的訪問權限是由該內存區域的描述符中的AP位和協處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。 關於訪問控制機制咱們就講到這裏. 注1:對於s3c2410來講,MMU是以Modify Visual Address(MVA)進行尋址的,這個地址是Virtual Address的一個變換,我將在之後談論到進程切換的時候中向你們介紹MVA |
|
|
|
|
專家等級: 緩存 |
|