Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Linux內核系列—6.操作系統開發之內存分頁機制,linux分頁

Linux內核系列—6.操作系統開發之內存分頁機制,linux分頁

編輯:關於android開發

Linux內核系列—6.操作系統開發之內存分頁機制,linux分頁


a.概述

頁尺寸是4KB,頁表每個表項占4字節,CR3寄存器給出了頁目錄的物理基地址;頁目錄給出了所有頁表的物理地址,而每個頁表給出了它所包含的頁的物理地址。

處理器的頁部件專門負責線性地址到物理地址的轉換工作。它首先將段部件送來的32位線性地址截成3段,分別是高10位、中間的10位和低12位。高10位是頁目錄的索引,中間10位是頁表的索引,低12位則作為頁內偏移來用。

假如某個任務加載後,操作系統根據它的實際情況在其4GB虛擬地址空間裡創建了一個段,段的起始地址為0x00800000,段界限值為0x5000,字節粒度。當該任務執行時,段寄存器DS指向該段。又假設執行了下面一條指令:

mov edx,[0x1050]

此時,段部件會輸出線性地址0x00801050。在沒有開啟分頁機制時,這就是要訪問的物理內存地址,但現在開啟了分頁機制,這是一個虛擬地址,要經過頁部件的轉換才能得到物理地址。

當前任務頁目錄的物理地址在處理器的CR3寄存器中,假設它的內容為0x00005000.段管理部件輸出的線性地址是0x00801050,其二進制的形式為0000 0000 1000 0000 0001 0000 0101 0000.高10位為0000000010,也就是十六進制的0x002,它是頁目錄表內的索引,處理器將它乘以4(因為每個目錄項為4字節),作為偏移量訪問頁目錄。最終,處理器從物理地址00005008處取得頁表的物理地址0x08001000.

頁目錄表的表項簡稱PDE,頁表的表項簡稱PTE。分頁機制是否生效的開關位於cr0的最高位PG位。如果PG=1,則分頁機制生效。

b.源碼

PageDirBase		equ	200000h	; 頁目錄開始地址: 2M
PageTblBase		equ	201000h	; 頁表開始地址: 2M+4K

LABEL_DESC_PAGE_DIR: Descriptor PageDirBase, 4095, DA_DRW;Page Directory
LABEL_DESC_PAGE_TBL: Descriptor PageTblBase, 1023, DA_DRW|DA_LIMIT_4K;Page Tables

SelectorPageDir		equ	LABEL_DESC_PAGE_DIR	- LABEL_GDT
SelectorPageTbl		equ	LABEL_DESC_PAGE_TBL	- LABEL_GDT

; 啟動分頁機制 --------------------------------------------------------------
SetupPaging:
    ...

PageDirBase和PageTblBase指定了頁目錄表和頁表在內存中的位置。頁目錄表位於地址2MB處,有1024個表項,占用4KB空間。

PDE(左)和PTE(右)格式如下:

cr3的結構如下圖,cr3又叫PDBR,它的高20位將是頁目錄表首地址的高20位,頁目錄表首地址的低12位會是零,也就是說,頁目錄表會是4KB對齊的。類似的,PDE中的頁表基址以及PTE中的頁基址也是用高20位來表示4KB對齊的頁表和頁。

運行結果如下:

 

一個碼農的日常 

源碼

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved