1. 程式人生 > >核心介面函式

核心介面函式

記憶體管理相關的

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);