1. 程式人生 > >虛擬記憶體的好處及多級分頁機制的原因

虛擬記憶體的好處及多級分頁機制的原因

眾所周知,在現代計算機系統中都使用了虛擬地址。在一個程式的執行那個過程中,由CPU產生虛擬地址,該虛擬地址經過MMU轉換成實體地址,然後使用該實體地址去訪問記憶體。那麼虛擬地址存在的原因是什麼呢?為何不能由CPU直接產生實體地址呢?

第一,使用虛擬地址可以更加高效的使用實體記憶體。在計算機系統中實體記憶體是有限的,對於一般的計算機來說,實體記憶體一般為4G或者8G. 對於現代多工的通用系統來說這顯然是不夠的。試想假如我們需要看一個4G大小以上的視訊,這時實體記憶體就不夠了。在存在虛擬地址的情況下,可以為每個程式分配足夠大小的虛擬地址空間,但是這些地址空間在一開是並沒有真正的對應實體地址,而是在真正使用的時候才去對應。這樣在訪問後邊的地址空間的時候就可以將前邊當前沒有在訪問的物理頁釋放掉,或者交換到硬碟中。這樣這個物理頁又可以去對應新的虛擬地址。從而使實體記憶體可以充分的利用。

第二,使用虛擬地址可以使記憶體的管理更加便捷。在程式編譯的時候就會生成虛擬地址,對於不同的機器或者對於同一臺機器的不同時間,該虛擬地址可以對應不同的物理頁。試想,如果沒有虛擬地址,那麼編譯時產生的實體地址在某些機器上可能已經被佔用而不能訪問。從而導致程式需要重新編譯。

第三,為了安全性的考慮。在使用虛擬地址的時候,暴露給程式設計師永遠都是虛擬地址,而具體的實體地址在哪裡,這個只有系統才瞭解。這樣就提高了系統的封裝性。

使用了虛擬地址,那麼下一個問題來了,如何將虛擬地址轉換成實體地址。在現代計算系統中提供了一個MMU單元,可以將虛擬地址轉換成實體地址。具體的轉換方式是使用了分頁機制。及通過虛擬地址索引頁表,通過頁表獲取真實的實體地址。


但是這樣有導致了另外一個問題,在32的系統中,系統分配給每個程序的虛擬地址為4G,對於每個虛擬地址頁建立一個記錄,這樣也需要4G/4k個,假設每條記錄大小為4B,這樣對於每個程序需要4M的頁表,對於一個helloworld程式而言,不足4K的程式需要4M的頁表,未免有些浪費。

為了解決這個問題,設計了多級頁表機制。


使用多級頁表機制,對於第一級的頁表如圖所示只需4K的空間,用於索引二級頁表的地址。還是以helloworld程式碼為例,可能只需要一個物理頁,因此只需要一條記錄,故對於第二級的頁表也只需要一個頁表,對於一級頁表中的其他記錄可以對應為空。這樣只需要8k的空間就可以完成頁面的對映。大大節省了頁表所佔的空間。

相關推薦

虛擬記憶體的好處多級機制原因

眾所周知,在現代計算機系統中都使用了虛擬地址。在一個程式的執行那個過程中,由CPU產生虛擬地址,該虛擬地址經過MMU轉換成實體地址,然後使用該實體地址去訪問記憶體。那麼虛擬地址存在的原因是什麼呢?為何不能由CPU直接產生實體地址呢? 第一,使用虛擬地址可以更加高效的使用實體

記憶體管理與機制

一、問題提出: 我們經常會使用malloc()以及free()函式進行堆區記憶體申請與釋放。那麼你是否會這樣做: int * p = malloc(0);/*malloc分配了0個位元組嗎,如果是那麼p指向誰呢,是NULL嗎*/ free(p);/*假如

作業系統實現之記憶體機制.虛擬空間

這裡我們將把頁目錄表放在0x100000處.頁表也挨著頁目錄表放在0x101000處(第二個頁表.當然在此之前應該把實體記憶體給算出來.這裡可以使用bios中斷來獲取實體記憶體%include "boot.inc" section loader vstart=loader_base_addr ;-------

80386學習(五) 80386機制虛擬記憶體

一. 頁式記憶體管理介紹   80386能夠將記憶體分為不同屬性的段,並通過段描述符、段表以及段選擇子等機制,通過段基址和段內偏移量計算出線性地址進行訪問,這一記憶體管理方式被稱為段式記憶體管理。   這裡要介紹的是另一種記憶體管理的方式:80386在開啟了分頁機制後,便能夠將實體記憶體劃分為一個個大小相同且

記憶體的管理和機制

一、問題提出: 我們經常會使用malloc()以及free()函式進行堆區記憶體申請與釋放。那麼你是否會這樣做: int * p = malloc(0);/*malloc分配了0個位元組嗎,如果是那麼p指向誰呢,是NULL嗎*/ free(p);/*假如malloc分配了0個位元組,p指向了NU

Linux機制之概述--Linux記憶體管理(六)

1 分頁機制 在虛擬記憶體中,頁表是個對映表的概念, 即從程序能理解的線性地址(linear address)對映到儲存器上的實體地址(phisical address). 很顯然,這個頁表是需要常駐記憶體的東西, 以應對頻繁的查詢對映需要(實際上,現代支援VM的處理器都有一個叫TLB的硬體級頁表快取部件

Linux機制機制的演變--Linux記憶體管理(七)

1 頁式管理 1.1 分段機制存在的問題 分段,是指將程式所需要的記憶體空間大小的虛擬空間,通過對映機制對映到某個實體地址空間(對映的操作由硬體完成)。分段對映機制解決了之前作業系統存在的兩個問題: 地址空間沒有隔離 程式執行的地址不確定 不過分段方法存在一個嚴重的問題:記憶體的使用效率

xv6學習筆記 機制記憶體管理

XV6分頁機制、記憶體管理 報告內容 0. mmu.h的閱讀 mmu.h原始碼中給出了XV6虛擬地址的構成,及所代表的含義 mmu.h中還有頁表的相關資訊,每個頁目錄都與1024條記錄,每一個頁表中也有1024條記錄,每一頁的大小4096位元組,也就是4kb。 // Pag

記憶體定址之機制

寫在前面: 分頁機制完成線性地址到實體地址的轉換 80x86 規定分頁機制是可選的。分段和分頁沒有什麼必然聯絡,分段可以說是 Intel 的 CPU 一直保持著的一種機制,而分頁只是保護模式下的一種記憶體管理策略。想開啟分頁機制,CPU必須工作在保護模式,而工

Windows記憶體機制

大多數現代的作業系統都支援虛存, 這使得系統上的每個程式都擁有自己的地址空間. 每當程式讀取記憶體時, 都必須指定一個地址. 對於每個程序, 該地址必須轉換為實際的實體記憶體地址. 例如, 若我們的MzfHips.exe 程式需要的資料在虛擬記憶體地址的0x0041FF10處, 則實際的實體地址可能被對映為0

Linux核心原始碼分析--記憶體管理(一、機制

        Linux系統中分為幾大模組:程序排程、記憶體管理、程序通訊、檔案系統、網路模組;各個模組之間都有一定的聯絡,就像蜘蛛網一樣,所以這也是為什麼Linux核心那麼難理解,因為不知道從哪裡開始著手去學習。很多人會跟著系統上電啟動 BIOS-->bootse

Linux記憶體地址的分段、機制(上)

在深入學習Linux核心原始碼之前,需要先對Linux執行的硬體基礎有個大概的認識,主要包括CPU中的暫存器和磁碟。 1.i386暫存器和系統指令 在Linux系統中使用的主要包括i386暫存器中的16位標誌暫存器,4個記憶體管理暫存器和4個控制暫存器及

【淺談】x86記憶體管理的分段機制

最近一直在接著作業系統的課程,著手跟著os.dev上的大神的文件寫一個小型的核心,然後前期的東西自己一直在看也沒時間寫Blog,最近做到了記憶體管理這裡,看了Jamesmolloy的文件還有一些os.dev.org上的關於memorymanage的東西,總覺的還是寫點東西吧

深入詳解保護模式下的記憶體機制

以下是Intel文件中關於分頁機制的詳細描述:IA-32 Memory Models When employing the processor’s memory management facilities, programs do not       — 使用處理器記憶體管理設施時程式不會 directly

Linux的記憶體定址——淺談分段和機制

本文會以80x86架構,linux2.6為例,簡單介紹記憶體的分段和分頁機制。1. 三種記憶體地址關於記憶體地址,首先要了解它有三種,分別是邏輯地址、線性地址和實體地址。把邏輯地址轉換為線性地址是由一個叫做分段單元的硬體電路完成的。同樣地,還有一個叫做分頁單元的硬體電路負責把

Linux機制機制的實現詳解--Linux記憶體管理(八)

[注意] 如果您當前使用的系統並不是linux,或者您的系統中只有一份linux原始碼,而您又期待能夠檢視或者檢索不同版本的linux原始碼 LXR (Linux Cross Reference)是比較流行的linux

Linux記憶體管理解析(一) : 分段與機制

背景 : 在此文章裡會從分頁分段機制去解析Linux記憶體管理系統如何工作的,由於Linux記憶體管理過於複雜而本人能力有限。會盡量將自己總結歸納的部分寫清晰。 從真實模式到保護模式的定址方式的不同 :    16位CPU的定址方式 : 在 8086 CPU 中,提供了兩類暫存器來進行定址,分別為段

【自制作業系統05】開啟記憶體機制

通過前四章的努力,我們成功將控制權轉交給了 loader.asm 這個程式,並且從真實模式跨越到了保護模式。第四章講保護模式的時候我說過,這是我們作業系統的第一個精彩之處。但其實這只是針對之前我們進行的只是無意義的輸出,以及硬碟的載入等工作。但到了這一章,之前一步步的努力進入到了保護模式,也只能說是做了很多苦

作業系統:x86下記憶體機制 (1)

前置知識: 分段的概念(當然手寫過肯定是墜吼的 ##為什麼要分頁 當我們寫程式的時候,總是傾向於把一個完整的程式分成最基本的資料段,程式碼段,棧段。並且普通的分段機制就是在程序所屬的LDT中把每一個段給標識出來。但是在實際運用中,大多數程序不會無限地執行下去。當程序結束之後它佔有的記憶體空間也會被釋放。

Linux內存尋址之機制

緩存 itl ans linux 存儲器 apt target tar linux中 http://blog.xiaohansong.com/2015/10/05/Linux內存尋址之分頁機制/ 在上一篇文章Linux內存尋址之分段機制中,我們了解邏輯地址通過分段機制轉換為