- 论坛徽章:
- 0
|
- 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呢? |
|