核心介面函式
阿新 • • 發佈:2018-12-17
記憶體管理相關的
1.1 p
1.1 pte_offset_kernel
pte = pte_offset_kernel(pmd, vaddr); //頁目錄項的某一項的線性地址, // // // #define pte_offset_kernel(dir, address) \ ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) // dir就是頁目錄項其中一項的線性地址。*(dir)就是頁目錄項中儲存的頁表實體地址加上12位屬性值 // ((pte_t *) pmd_page_kernel(*(dir)) 就是這個頁目錄項指向的頁表的基地址(線性地址)加上address在頁中偏移量。 // 這個函式的作用就是 找出address所屬的頁地址,存放相應的頁表中的地址。 // 比如addr=0xC2345678,這個地址是頁表第3項存放的是其所屬的頁地址,頁表第3項的地址是0xC0000008 // 呼叫這個函式後返回的地址是0xC000008 #define pmd_page_kernel(pmd) \ ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) //pmd也就是頁目錄存的,頁表的物理的前20位,加上12位的屬性 //這個函式就是把頁目錄項中,存的頁表地址,先去掉12位屬性,然後通過__va轉換成線性地址
例子
284 pgd = swapper_pg_dir + pgd_index(vaddr); 285 pud = pud_offset(pgd, vaddr); 286 pmd = pmd_offset(pud, vaddr); 287 pte = pte_offset_kernel(pmd, vaddr);