MMU記憶體管理單元相關知識點總結

来源:http://www.cnblogs.com/Forever-LJX/archive/2016/08/27/5813502.html
-Advertisement-
Play Games

1.MMU是Memory Management Unit的縮寫,中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的記憶體訪問授權,多用戶多進程操作系統。 2.虛擬記憶體由來:許多年以前,當人們還在使用DOS或是更 ...


1.MMU是Memory Management Unit的縮寫,中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的記憶體訪問授權,多用戶多進程操作系統。

 

2.虛擬記憶體由來:許多年以前,當人們還在使用DOS或是更古老的操作系統的時候,電腦的記憶體還非常小,一般都是以K為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形界面的興起還有用戶需求的不斷增大,應用程式的規模也隨之膨脹起來,終於一個難題出現在程式員的面前,那就是應用程式太大以至於記憶體容納不下該程式,通常解決的辦法是把程式分割成許多稱為覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程式員把程式先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程式,數據,堆棧的總的大小可以超過物理存儲器的大小,操作系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分保存在磁碟上。比如對一個16MB的程式和一個記憶體只有4MB的機器,操作系統通過選擇,可以決定各個時刻將哪4M的內容保留在記憶體中,併在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16M的程式運行在一個只具有4M記憶體機器上了。而這個16M的程式在運行前不必由程式員進行分割。

虛擬記憶體電腦系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時存儲在外部磁碟存儲器上,在需要時進行數據交換。目前,大多數操作系統都使用了虛擬記憶體,如Windows家族的“虛擬記憶體”;Linux的“交換空間”等。

虛擬記憶體別稱虛擬存儲器(Virtual Memory)。電腦中所運行的 程式均需經由記憶體執行,若執行的程式占用記憶體很大或很多,則會導致記憶體消耗殆盡。為解決該問題,Windows中運用了虛擬記憶體[2]  技術,即勻出一部分硬碟空間來充當記憶體使用。當記憶體耗盡時,電腦就會自動調用硬碟來充當記憶體,以緩解記憶體的緊張。若電腦運行程式或操作所需的隨機存儲器(RAM)不足時,則 Windows 會用虛擬存儲器進行補償。它將電腦的RAM硬碟上的臨時空間組合。當RAM運行速率緩慢時,它便將數據從RAM移動到稱為“分頁文件”的空間中。將數據移入分頁文件可釋放RAM,以便完成工作。 一般而言,電腦的RAM容量越大,程式運行得越快。若電腦的速率由於RAM可用空間匱乏而減緩,則可嘗試通過增加虛擬記憶體來進行補償。但是,電腦從RAM讀取數據的速率要比從硬碟讀取數據的速率快,因而擴增RAM容量(可加記憶體條)是最佳選擇。 虛擬記憶體是Windows 為作為記憶體使用的一部分硬碟空間。虛擬記憶體在硬碟上其實就是為一個碩大無比的文件,文件名是PageFile.Sys,通常狀態下是看不到的。必須關閉資源管理器對系統文件的保護功能才能看到這個文件。虛擬記憶體有時候也被稱為是“頁面文件”就是從這個文件的文件名中來的。   3.地址範圍:任何時候,電腦上都存在一個程式能夠產生的地址集合,我們稱之為地址範圍。這個範圍的大小由CPU的位數決定,例如一個32位的CPU,它的地址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的地址範圍為0~0xFFFFFFFFFFFFFFFF (16E).這個範圍就是我們的程式能夠產生的地址範圍,我們把這個地址範圍稱為虛擬地址空間,該空間中的某一個地址我們稱之為虛擬地址。與虛擬地址空間和虛擬地址相對應的則是物理地址空間和物理地址,大多數時候我們的系統所具備的物理地址空間只是虛擬地址空間的一個子集。這裡舉一個最簡單的例子直觀地說明這兩者,對於一臺記憶體為256M的32bit x86主機來說,它的虛擬地址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x00000000~0x0FFFFFFF(256M)。   4.在沒有使用虛擬存儲器的機器上,虛擬地址被直接送到記憶體匯流排上,使具有相同地址的物理存儲器被讀寫;而在使用了虛擬存儲器的情況下,虛擬地址不是被直接送到記憶體地址匯流排上,而是送到存儲器管理單元MMU,把虛擬地址映射為物理地址。   5.分頁機制:大多數使用虛擬存儲器的系統都使用一種稱為分頁(paging)機制。虛擬地址空間劃分成稱為頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁幀(frame).頁和頁幀的大小必須相同。在這個例子中我們有一臺可以生成32位地址的機器,它的虛擬地址範圍從0~0xFFFFFFFF(4G),而這台機器只有256M的物理地址,因此他可以運行4G的程式,但該程式不能一次性調入記憶體運行。這台機器必須有一個達到可以存放4G程式的外部存儲器(例如磁碟或是FLASH),以保證程式片段在需要時可以被調用。在這個例子中,頁的大小為4K,頁幀大小與頁相同——這點是必須保證的,因為記憶體和外圍存儲器之間的傳輸總是以頁為單位的。對應4G的虛擬地址和256M的物理存儲器,他們分別包含了1M個頁和64K個頁幀。

 

6.  我們先根據上圖解釋一下分頁後要用到的幾個術語,在上面我們已經接觸了頁和頁框,上圖中藍色部分是物理空間,其中每一格表示一個物理頁框。橘黃色部分是虛擬空間,每一格表示一個頁,它由兩部分組成,分別是Frame Index(頁框索引)和位p(present 存在位),Frame Index的意義很明顯,它指出本頁是往哪個物理頁框進行映射的,位p的意義則是指出本頁的映射是否有效,如上圖,當某個頁並沒有被映射時(或稱映射無效,Frame Index部分為X),該位為0,映射有效則該位為1。


    我們執行下麵這些指令(本例子的指令不針對任何特定機型,都是偽指令)
例1:
    MOVE REG,0 //將0號地址的值傳遞進寄存器REG.
    虛擬地址0將被送往MMU,MMU看到該虛地址落在頁0範圍內(頁0範圍是0到4095),從上圖我們看到頁0所對應(映射)的頁框為2(頁框2的地址範圍是8192到12287),因此MMU將該虛擬地址轉化為物理地址8192,並把地址8192送到地址匯流排上。記憶體對MMU的映射一無所知,它只看到一個對地址8192的讀請求並執行它。MMU從而把0到4096的虛擬地址映射到8192到12287的物理地址。


例2:
    MOVE REG,8192
    被轉換為
    MOVE REG,24576 
    因為虛擬地址8192在頁2中,而頁2被映射到頁框6(物理地址從24576到28671)


例3:
    MOVE REG,20500
    被轉換為
    MOVE REG,12308
    虛擬地址20500在虛頁5(虛擬地址範圍是20480到24575)距開頭20個位元組處,虛頁5映射到頁框3(頁框3的地址範圍是 12288到16383),於是被映射到物理地址12288+20=12308。


      通過適當的設置MMU,可以把16個虛頁隱射到8個頁框中的任何一個,但是這個方法並沒有有效的解決虛擬地址空間比物理地址空間大的問題。從上圖中我們可以看到,我們只有8個頁框(物理地址),但我們有16個頁(虛擬地址),所以我們只能把16個頁中的8個進行有效的映射。我們看看例4會發生什麼情況

      MOV REG,32780
      虛擬地址32780落在頁8的範圍內,從上圖總我們看到頁8沒有被有效的進行映射(該頁被打上X),這是又會發生什麼?MMU註意到這個頁沒有被映射,於是通知CPU發生一個缺頁故障(page fault).這種情況下操作系統必須處理這個頁故障,它必須從8個物理頁框中找到1個當前很少被使用的頁框並把該頁框的內容寫入外圍存儲器(這個動作被稱為page copy),隨後把需要引用的頁(例4中是頁8)映射到剛纔釋放的頁框中(這個動作稱為修改映射關係),然後從新執行產生故障的指令(MOV REG,32780)。假設操作系統決定釋放頁框1,那麼它將把虛頁8裝入物理地址的4-8K,並做兩處修改:首先把標記虛頁1未被映射(原來虛頁1是被影射到頁框1的),以使以後任何對虛擬地址4K到8K的訪問都引起頁故障而使操作系統做出適當的動作(這個動作正是我們現在在討論的),其次他把虛頁8對應的頁框號由X變為1,因此重新執行MOV REG,32780時,MMU將把32780映射為4108。

 

 7.

我的s3c2410上配置的SDRSAM大小為64M,該SDRAM的物理地址範圍是0x3000 0000~0x33FF FFFF(屬於Bank 6),由於1個Section的大小是1M,所以該物理空間可以被分成64個物理段(頁框).


      在Section模式下,送進MMU的虛擬地址(註1)被分為兩部分(這點和我們上面舉的例子是一樣的),這兩部分為 Descriptor Index(相當於上面例子的Page Index)和 Offset,descript index長度為12bit(2^12=4096,從這個關係式你能看出什麼?:) ),Offset長度為20bit(2^20=1M,你又能看出什麼?:)).觀察一下一個描述符(Descriptor)中的Section Base Address部分,它長度為12 bit,裡面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,由於每一個物理段的長度都是1M,所以物理段首地址的後20bit總是為0x00000(每個Section都是以1M對齊),確定一個物理地址的方法是 物理頁框基地址+虛擬地址中的偏移部分=Section Base Address<<20+Offset ,呵呵,可能你有點糊塗了,還是舉一個實際例子說明吧。

      假設現在執行指令MOV REG, 0x30000012,虛擬地址的二進位碼為00110000 00000000 00000000 00010010,前12位是Descriptor Index= 00110000 0000=768,故在Translation Table裡面找到第768號描述符,該描述的Section Base Address="0x0300",也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址為0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬地址中的偏移)。你可能會問怎麼這個虛擬地址和映射後的物理地址一樣?這是由我們定義的映射規則所決定的。在這個例子中我們定義的映射規則是把虛擬地址映射成和他相等的物理地址。我們這樣書寫映射關係的代碼:
void mem_mapping_linear(void)
{
    unsigned long descriptor_index, section_base, sdram_base, sdram_size;
    sdram_base=0x30000000;
    sdram_size=0x 4000000;
    for (section _base= sdram_base,descriptor_index = section _base>>20;
         section _base < sdram_base+ sdram_size; 
         descriptor_index+=1;section _base +=0x100000)
    {
         *(mmu_tlb_base + (descriptor_index)) = (section _base>>20) | MMU_OTHER_SECDESC;
    }
}


      上面的這段段代碼把虛擬空間0x3000 0000~0x33FF FFFF映射到物理空間0x3000 0000~0x33FF FFFF,由於虛擬空間與物理空間空間相吻合,所以虛擬地址與他們各自對應的物理地址在值上是一致的。當初始完Translation Table之後,記得要把Translation Table的首地址(第0號描述符的地址)載入進協處理器CP15的Control Register2(2號控制寄存器)中,該控制寄存器的名稱叫做Translation table base (TTB) register。

 

8.以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關係,然而MMU還有一個重要的功能,那就是訪問控制機制(Access Permission )。簡單說訪問控制機制就是CPU通過某種方法判斷當前程式對記憶體的訪問是否合法(是否有許可權對該記憶體進行訪問),如果當前的程式並沒有許可權對即將訪問的記憶體區域進行操作,則CPU將引發一個異常,s3c2410稱該異常為Permission fault,x86架構則把這種異常稱之為通用保護異常(General Protection),什麼情況會引起Permission fault呢?比如處於User級別的程式要對一個System級別的記憶體區域進行寫操作,這種操作是越權的,應該引起一個Permission fault,搞過x86架構的朋友應該聽過保護模式(Protection Mode),保護模式就是基於這種思想進行工作的,於是我們也可以這麼說:s3c2410的訪問控制機制其實就是一種保護機制。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今日頭條創立於2012年3月,到目前僅4年時間。從十幾個工程師開始研發,到上百人,再到200餘人。產品線由內涵段子,到今日頭條,今日特賣,今日電影等產品線。 一、產品背景 今日頭條是為用戶提供個性化資訊客戶端。下麵就和大家分享一下當前今日頭條的數據(據內部與公開數據綜合): 5億註冊用戶 2014年 ...
  • 本文介紹RHEL7下which、whereis、locate、find命令的使用,重點介紹find命令的使用 which 命令:which 作用:查找命令的執行文件路徑 語法:which [選項] [ ] 名稱... 說明:which命令比較簡單,他的選項都是不常用的 whereis 命令:wher ...
  • 本文介紹RHEL7.2文件的歸檔和壓縮 文件歸檔 歸檔的好處:方便使用、查詢、閱讀,易於管理 (批量刪除文件) 常用操作 命令:tar 作用:將許多文件一起保存至一個單獨的磁帶或磁碟歸檔,並能從歸檔中單獨還原所需文件 用法: tar [選項...] [FILE]... | 選項 | 說明 | | : ...
  • 進程概念 | 名稱 | 說明 | | : | : | | 程式 | 一組指令的集合 | | 進程 |程式的執行就是進程也可以把進程看成一個獨立的程式在記憶體中有其對應的代碼空間和數據空間,一個進程所擁有的數據和代碼只屬於自己進程是資源分配的基本單位,也是調度運行的基本單位 | | 線程 | 線程被人們 ...
  • 一、問題起源 在Linux系統中,通過rm刪除文件將會從文件系統的目錄結構上解除鏈接(unlink),如果文件是被打開的(有一個進程正在使用),那麼進程將仍然可以讀取該文件磁碟空間也一直被占用 這樣就會導致我們明明刪除了文件,但是磁碟空間卻未被釋放 二、問題分析 1、首先獲得一個已經被刪除但是仍然被 ...
  • 》進程式控制制塊 在linux中進程信息存放在叫做進程式控制制塊的數據結構中,每個進程在內核中都有⼀個進程式控制制塊(PCB)來維護進程相關的信息,Linux內核的 進程式控制制塊是task_struct結構體。在Linux中,這個結構叫做task_struct。 task_struct是Linux內核的一種數據結 ...
  • 1、問題描述 2、問題分析 google 499 / ClientClosed Request An Nginx HTTP server extension. This codeis introduced to log the case when the connection is closed b ...
  • 1.運行環境Windows xp;Arduino1.6.11 IDE.2.問題在Arduino編譯時,經常出現如下的錯誤: collect2.exe: error: ld returned 5 exit statusexit status 1Error compiling for board Ard... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...