内存管理相关的
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);