内存知识梳理2. 不同架构页表建立入口比较

来源:互联网 发布:大数据徐子沛pdf 编辑:程序博客网 时间:2024/05/20 18:45

前面分别梳理了ARM 和 X86架构内存页表的建立过程, 先简单回顾下初始化的过程:

ARM32:

setup_arch  -->paging_init    -->map_lowmem      -->create_mapping        -->alloc_init_pud          -->alloc_init_pmd            -->alloc_init_pte

ARM64的过程和ARM32很接近, 只是没有用到pmd:

setup_arch  -->paging_init    -->map_mem      -->create_mapping        -->alloc_init_pud          -->alloc_init_pmd            -->set_pmd            -->alloc_init_pte


其他架构大多数采用ARM 类似的过程, 由各自的 setup_arch 调用自己的paging_init(), 以Linux 3.10.0 内核为例, 符合这一规则的架构如下:

Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\alpha\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\arm64\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\arm\kernel):extern void paging_init(struct machine_desc *desc);Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\arm\kernel):paging_init(mdesc);Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\avr32\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\blackfin\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\c6x\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\cris\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\frv\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\h8300\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\ia64\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m32r\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\metag\kernel):paging_init(heap_end);Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\mips\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\mn10300\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\openrisc\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\parisc\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\s390\kernel):        paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\score\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\sh\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\tile\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\unicore32\kernel):paging_init();Setup.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\xtensa\kernel):paging_init();Setup.h (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\unicore32\kernel):extern void paging_init(void);Setup_32.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\powerpc\kernel):paging_init();Setup_32.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\sparc\kernel):paging_init();Setup_64.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\powerpc\kernel):paging_init();Setup_64.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\sparc\kernel):paging_init();Setup_mm.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m68k\kernel):extern void paging_init(void);Setup_mm.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m68k\kernel):paging_init();Setup_no.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m68k\kernel):paging_init();Srmmu.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\sparc\mm):prom_printf("Something wrong, can't find cpu node in paging_init.\n");Sun3mmu.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m68k\mm):void __init paging_init(void)Um_arch.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\um\kernel):paging_init();

paging_init:

Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\alpha\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\avr32\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\blackfin\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\c6x\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\cris\arch-v10\mm):paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\cris\arch-v32\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\frv\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\h8300\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\hexagon\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\hexagon\mm):paging_init();  /*  See Gorman Book, 2.3  */Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m32r\mm):void __init paging_init(void);Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m32r\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\m68k\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\metag\mm):void __init paging_init(unsigned long mem_end)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\microblaze\mm):static void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\microblaze\mm):paging_init();Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\mips\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\mn10300\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\openrisc\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\parisc\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\s390\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\score\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\sh\mm):void __init paging_init(void)Init.c (y:\code\kernel\linux-3.10.0\linux-3.10.0-514.el7\arch\tile\mm):void __init paging_init(void)


与上面的过程不太一样的是特立独行的X86:

setup_arch  --> init_mem_mapping    -->init_memory_mapping      -->kernel_physical_mapping_init

自此,内存页表梳理告一段落,

原创粉丝点击