本文共 933 字,大约阅读时间需要 3 分钟。
从 arch/arm/kernel/head.S 中的 stext 到 内核 rest_init 的 system_state = SYSTEM_SCHEDULING;分析 整个内存的启动过程至于 为什么不分析 arch/arm/boot/compressed/head.S 中的start 到 arch/arm/kernel/head.S 中的 stext因为 这个过程可以不跑的话, linux 也能运行起来之前在 https://blog.csdn.net/u011011827/article/details/115944495 分析 过,此过程 跑不跑 带来的效果的是一样的
整个过程可以分段为5个阶段A arch/arm/kernel/head.S 中的 stext符号 - __turn_mmu_on符号----此时开了MMU,开启了虚拟内存时代B __turn_mmu_on符号 - setup_arch->paging_init->bootmem_init->memblock_allow_resize返回----此时memblock初始化完成,开启了基于虚拟内时代的 memblock内存管理器时代C setup_arch->paging_init->bootmem_init->memblock_allow_resize返回 - mm_init->mem_init返回----此时memblock消亡,buddy初始化完成,开启了基于虚拟内时代的 buddy内存管理器时代D mm_init->mem_init返回 -> mm_init->kmem_cache_init返回----此时slab建立,开启了基于 buddy内存管理器时代 的 slab内存管理器时代E mm_init->kmem_cache_init返回 -> mm_init->vmalloc_init返回----此时vmalloc建立,----此时,buddy,slab,vmalloc 三个内存管理器 共同提供 内存申请释放服务---- buddy 负责 大额内存申请---- slab 向 buddy 申请大额内存后,提供给用户小额内存借贷---- vmalloc