arm32頁表對映過程(一)

2021-08-21 08:44:03 字數 2090 閱讀 4880

在完成前面memory size的初始化之後,下面就是頁表的映**,具體過程如下:

start_kernel()->setup_arch()->paging_init()

void __init paging_init(const struct machine_desc *mdesc)

(1)主要是mem_type的初始化。

(2)呼叫pmd_clear清除kernel初始化過程中建立的一級頁表項的內容。

(3)呼叫map_lowmem()重新建立從實體地址起始點到high_mem的起始點的一一對映。

先看prepare_page_table()函式:

static inline void prepare_page_table(void)

(1)呼叫pmd_clear清理0~modules_vaddr所對應的一級頁表項內容。

(2)呼叫pmd_clear清理modules_vaddr~page_offset所對應的一級頁表項內容.

(3)呼叫pmd_clear清理第乙個memblock尾~vmalloc_start所對應的一級頁表項內容.這裡有個疑問就是為何沒有清理第乙個memblock對應的頁表內容,個人認為應該是第乙個memblock對應的都是kernel的text, data,stack,不能清理這一部分內容。

下面要說一下pmd_off_k()函式:

static inline pmd_t *pmd_off_k(unsigned long virt)

#define pgd_index(addr) ((addr) >> pgdir_shift)

#define pgdir_shift  21

#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))

/* to find an entry in a kernel page-table-directory */

#define pgd_offset_k(addr) pgd_offset(&init_mm, addr)

#define kernel_ram_vaddr (page_offset + text_offset)

text_offset := $(textofs-y)

textofs-y := 0x00008000

當virt=0時,pgd_offset=0xc0004000,我們可以認為此位址存放的就是第0個pgd所對應的所有二級頁表的第0個的位址

當virt=1時,pgd_offset=0xc0004008,

當virt=2時,pgd_offset=0xc0004010,

以此類推。。。

我們發現每兩個pgd_offset之間都相差8位元組,經過仔細研究發現主要是pgd_t為unsigned long行的陣列,且陣列元素為2,固陣列的長度為8位元組,所以每兩個pgd的陣列的首位址之間的差距為8位元組。由以上定義可得,以及頁表範圍pgd範圍為31~21(一般linux為31~20),也就是2048(一般linux為4096)個,而每個大小為8(一般linux為4)位元組,所以pgd table的總大小為16k,剛好是從0xc0004000~0xc0008000,此設計是為了保持和arm的mmu保持一致。而從0xc0008000開始存放的時kernel image。

typedef unsigned long pte_t;

typedef unsigned long pmd_t;

typedef unsigned long pgd_t[2];

另外由於用例的32系統為2級對映,固pgd=pud=pmd,即,pgd_offset_k的值為pmd_offset_k的值:

static inline pud_t * pud_offset(pgd_t * pgd, unsigned long address)

static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)

以上為建立頁面對映前的準備工作,下面將從map_lowmem()函式研究頁表對映的建立。

arm64 頁表對映

armv8最多支援48根位址,4級頁表,這樣最多支援user space和kernnel space 分別是256tb 其中user space佔據低端位址 kernel可以支援48 42 39 根位址 config arm64 va bits 39 is not set config arm64 ...

arm32下物件陣列的逆向分析

0x0 概述 最近學習arm32的逆向分析,寫了一些 對照著彙編看。下邊分析了物件陣列的彙編實現。0x1 c語言 c語言 如下 include class cnumber cnumber int m nnumber float m fnumber int main int argc,char arg...

ARM32入門學習筆記之 GPIO庫

函式名描述 gpio init 根據gpio initstruct中指定的引數初始化外設gpiox暫存器 gpio readinputdatabit 讀取指定埠管腳的輸入 gpio readinputdata 讀取指定的gpio埠輸入 gpio readinputdatabit 讀取指定埠管腳的輸出...