pagetable_init() --> kernel_physical_mapping_init() --> one_page_table_init()
one_page_table_init(pmd_t *pmd)初始化pmd索引的页表项(将该项索引的物理页面的首地址填写到pmd中),并返回pmd索引的物理页面的首地址(线性地址)
static
pte_t
*
__init one_page_table_init(pmd_t
*
pmd)
{
if (pmd_none(*pmd)) {
pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
if (page_table != pte_offset_kernel(pmd, 0))
BUG();

return page_table;
}
return pte_offset_kernel(pmd, 0);
}
one_page_table_init(pmd_t *pmd)初始化pmd索引的页表项(将该项索引的物理页面的首地址填写到pmd中),并返回pmd索引的物理页面的首地址(线性地址)













#define
__pmd(x) ((pmd_t) { __pud(x) } )
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)