編輯:關於android開發
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對齊的頁表和頁。
運行結果如下:
【源碼】
初識 Android,初識android 創建博客有一年的時間了,一直沒把它用起來,頗感慚愧。近日突感有寫博客的沖動,更可怕的是這種沖動似乎比我體內的洪荒之力更為凶猛。
Android listview和ListAdapter搭配使用,androidlistadapterListView時Android中自帶的數據顯示控件,要使用List
Android Studio關於SVN的相關配置及從SVN檢出項目,androidsvn一、安裝配置: 如圖,安裝時必須自定義選擇 command line 否則不會安裝
Android 系統API實現數據庫的增刪改查和SQLite3工具的使用,androidsqlite3在《Android SQL語句實現數據庫的增刪改查》中介紹了使用sq