内核接口函数

内存管理相关的

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

猜你喜欢

转载自blog.csdn.net/chengbeng1745/article/details/85048599