2013年08月12日 星期一 19:17
pgd_idx = pgd_index(PAGE_OFFSET); /* 3 */ for (i=0; i<pgd_idx; i++) set_pgd(swapper_pg_dir + i, _ _pgd(_ _pa(empty_zero_page) + 0x001)); /* 0x001 == Present */ pgd = swapper_pg_dir + pgd_idx; phys_addr = 0x00000000; for (; i<PTRS_PER_PGD; ++i, ++pgd) { pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE); set_pgd(pgd, _ _pgd(_ _pa(pmd) | 0x001)); /* 0x001 == Present */ if (phys_addr < max_low_pfn * PAGE_SIZE) for (j=0; j < PTRS_PER_PMD /* 512 */ && phys_addr < max_low_pfn*PAGE_SIZE; ++j) { 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; /* 0x200000 */ } } swapper_pg_dir[0] = swapper_pg_dir[pgd_idx];
以上代码是《深入理解linux内核》第二章中当RAM大于4096MB时的内核页表初始化的代码。
其中代码pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);可知pmd是一个页地址。
代码set_pmd(pmd, _ _pmd(phys_addr | pgprot_val(_ _pgprot(0x1e3))));应该是设置一个pmd项,那么其中第一个参
数pmd应该是第几项,但这里上面的代码中却表示pmd是一个地址。而且看下面的代码pmd并无变化,那么所有的设
置在重复设置同一项,所以这里的pmd是不是应该改为变量j呢?
Zeuux © 2024
京ICP备05028076号