1. 程式人生 > >虛擬地址空間的深度剖析

虛擬地址空間的深度剖析

1.為什麼引用虛擬記憶體:

        當我們執行一個程式時,會將程式全部裝入記憶體,然後執行。但是在執行時經常會出現一些問題:

(1)繼承地址空間沒有隔離,沒有許可權保護

         由於程式都是訪問實體記憶體,所以一個程序可以修改其他程序的記憶體資料,甚至修改核心地址空間的資料,很不安全。

(2)記憶體使用的效率極低

         當記憶體空間不足時,要將其他程式暫時拷貝到硬碟,讓後再將新的程式裝入記憶體執行。由於大量的資料裝入裝出,記憶體的 效率就會十分的低下。

(3)程式執行的地址不明確

          因為記憶體地址都是隨機分配的,所以程式執行的地址也是不確定的。

   存在這麼多的問題那麼我們如何將計算機有限的實體記憶體分配給多個程式使用呢?

    我們在這裡加入了一箇中間層,即使用一種間接的地址訪問方法。我們把程式給出的地址看作是一種虛擬地址(這個地址空間是虛擬的,不是實際存在的),然後通過某些對映的方法,將這個虛擬地址轉換成實際的實體地址。這就多個程式可以同時執行且各個程式之間能夠訪問的實體記憶體區域不重疊,也杜絕了程式直接操作地址的現象,同時也提高實體地址的使用效率。這種呈現出比實際擁有的地址空間大得多的記憶體我們叫做虛擬記憶體。

2.這是一個4G的實體記憶體空間

Linux核心把虛擬地址空間分為兩部分:使用者程序空間,核心程序空間。

如下圖所示:

在快取原理中,換入/換出的資料以塊為最小單位。在記憶體管理時,頁是地址空間的最小單位。
虛擬地址空間劃分為多個固定大小的虛擬頁(VP),實體地址空間(DRAM記憶體)劃分為多個固定大小的物理頁(PP),
虛擬頁和物理頁的大小是一樣的,通常為4KB。

3.虛擬地址的工作原理

虛擬儲存器是由硬體和作業系統自動實現儲存資訊排程和管理的。它的工作過程包括6個步驟:
①中央處理器訪問主存的邏輯地址分解成組號a和組內地址b,並對組號a進行地址變換,即將邏輯組號a作為索引,查地址變換表,以確定該組資訊是否存放在主存內。
②如該組號已在主存內,則轉而執行④;如果該組號不在主存內,則檢查主存中是否有空閒區,如果沒有,便將某個暫時不用的組調出送往輔存,以便將這組資訊調入主存。
③從輔存讀出所要的組,並送到主存空閒區,然後將那個空閒的物理組號a和邏輯組號a登入在地址變換表中。
④從地址變換表讀出與邏輯組號a對應的物理組號a。
⑤從物理組號a和組內位元組地址b得到實體地址。
⑥根據實體地址從主存中存取必要的資訊。

4.虛擬地址作用總結
()1)虛擬記憶體管理可以控制實體記憶體的訪問許可權 
         訪問的虛擬頁若沒有讀寫許可權,則觸發一個保護異常,終止程序。
(2)虛擬記憶體讓每個程序有獨立的地址空間
         對於私有區域來說,當不同程序對該區域做修改時,會觸發寫時拷貝,為新程序維護私有的虛擬地址空間。
(3)VA到PA的對映會給分配和釋放記憶體帶來方便。
         實體記憶體不連續的地址,可對映到連續的虛擬記憶體地址。
(4)記憶體效率高
          使用了頁面排程,不會造成大量的資料裝入裝出。

5:計算機輸出步驟

例如在計算機中編譯執行一個hello world.c程式,它會在很短的時間內輸出一個”hello world”,但是計算機把其中的幾個步驟隱藏了,並沒有像我們展示,分別是:預編譯-> .i、編譯-> .s、彙編-> .o、連線、生成可執行檔案-> .exe。

這幾個步驟的詳細工作為:

預編譯:處理與編譯指令(#define  #include #if #elif )、新增行號和檔案表示、刪除註釋、#pragma

編譯: 詞法分析、語法分析、語義分析、程式碼優化

彙編:把指令翻譯成二進位制

連結:合併段和符號表、符號解析、分配地址和空間、符號重定位

生成可執行檔案:建立虛擬地址空間到實體記憶體的對映(建立核心對映結構體)、建立頁目錄和頁表、載入指令和資料、程式的入口地址寫入PC暫存器。