Linux 記憶體管理 — 線性空間與實體記憶體

來源:互聯網
上載者:User

反映了如下資訊:

1、 進程的4G 線性空間被劃分成三個部分:進程空間(0-3G)、核心直接映射空間(3G – high_memory)、核心動態映射空間(VMALLOC_START - VMALLOC_END)

2、 三個空間使用同一張頁目錄表,通過 CR3 可找到此頁目錄表。但不同的空間在頁目錄表中頁對應不同的項,因此互相不衝突

3、 核心初始化以後,根據實際實體記憶體的大小,計算出 high_memory、VMALLOC_START、VMALLOC_END 的值。並為“核心直接映射”空間建立好映射關係,所有的實體記憶體都可以通過此空間進行訪問。

4、 “進程空間”和“核心動態映射空間”的映射關係是動態建立的(通過缺頁異常)

假設在有三個線性地址 addr1, addr2, addr3 ,分別屬於三個線性空間,但是最終都映射到物理頁面1:

1、 三個地址對應不同的頁表和頁表項

2、 但是頁表項的高 20bit 肯定是1,表示物理頁面的索引號是1

3、 同時,根據高 20 bit,可以從 mem_map[] 中找到對應的 struct page 結構,struct page 用於管理實際的物理頁面(紅線)

4、 從線性地址,根據頁目錄表,頁表,可以找到物理地址

5、 Struct page 和物理地址之間很容易互相轉換

6、 從物理地址,可以很容易的反推出在核心直接映射空間的線性地址(藍線)。要想得到在進程空間或者核心動態映射空間的對應的線性地址,則需要遍曆相應的“虛存區間”鏈表。

關於頁目錄表:

      1、 每個進程有一個屬於自己的頁目錄表,可通過 CR3 寄存器找到

2、 而核心也有一個獨立於其它進程的頁目錄表,儲存在 swapper_pg_dir[] 數組中

3、 當進程切換的時候,只需要將新進程的頁目錄把地址載入到 CR3 寄存器中即可

4、 建立一個新進程的時候,需要為它分配一個 page,作為頁目錄表,並將 swapper_pg_dir[] 的高 256 項拷貝過來,低 768 項則清0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.