在完成前面memory size的初始化之后,下面就是页表的映射了,具体过程如下:
start_kernel()->setup_arch()->paging_init()
void __init paging_init(const struct machine_desc *mdesc)
{
void *zero_page;
build_mem_type_table();-------------------------------------(1)
prepare_page_table();---------------------------------------(2)
map_lowmem();-----------------------------------------------(3)
memblock_set_current_limit(arm_lowmem_limit);
dma_contiguous_remap();
early_fixmap_shutdown();
devicemaps_init(mdesc);
kmap_init();
tcm_init();
top_pmd = pmd_off_k(0xffff0000);
/* allocate the zero page. */
zero_page = early_alloc(PAGE_SIZE);
bootmem_init();
empty_zero_page = virt_to_page(zero_page);
__flush_dcache_page(NULL, empty_zero_page);
}
(1)主要是mem_type的初始化。
(2)调用pmd_clear清除kernel初始化过程中建立的一级页表项的内容。