- 论坛徽章:
- 0
|
本帖最后由 lymickey 于 2011-07-06 10:04 编辑
以下是ULK 第三版中关于 page global directory在 内存小于896MB的等价初始化它的代码:
pgd = swapper_pg_dir + pgd_index(PAGE_OFFSET); /* 768 */
phys_addr = 0x00000000;
while (phys_addr < (max_low_pfn * PAGE_SIZE)) {
pmd = one_md_table_init(pgd); /* returns pgd itself */
set_pmd(pmd, _ _pmd(phys_addr | pgprot_val(_ _pgprot(0x1e3))));
/* 0x1e3 == Present, Accessed, Dirty, Read/Write,
Page Size, Global */
phys_addr += PTRS_PER_PTE * PAGE_SIZE; /* 0x400000 */
++pgd;
}
有两点不明白:
1、 是不是小于896M 以下的都这样作连续映射?
2、 为何没有先生成第四级 page table的entry(pte),而后再使pgd (page global directory )entry项指向这个生成的pte,最后再让pte中的内容为phys_addr | pgprot_val(_ _pgprot(0x1e3))
而这里是没有生成pte, 而是直接让pgd的内容为phys_addr | pgprot_val(_ _pgprot(0x1e3))...,也就是说page table没有页表项,没有12bit的flags进行控制? |
|