memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单。负责page allocator初始化之前的内存管理和分配请求。 分析memblock算法,可以从几点入手: memblock算法初始化; memblock算法管理内存的申请和释放; memblock算法前的准备: 前面已经分析了linux系统在初始化的过程中,使用int 15...
定义的memblock为全局变量,在定义的时候就进行了初始化。初始化的时候,regions指向的也是静态全局的数组,其中数组的大小为INIT_MEMBLOCK_REGIONS,也就是128个,限制了这些内存块的个数了,实际在代码中可以看到,当超过这个数值时,数组会以2倍的速度动态扩大。 static struct memblock_region memblock_memory_init_regions[...
先在linux-4.12\init#488 位置的asmlinkage __visible void __init start_kernel(void)内核启动函数中 , 调用setup_arch(&command_line);函数 , 然后再调用 ARM64 体系架构对应的源码 , linux-4.12\arch\arm64\mm\init.c#362 位置的void __init arm64_memblock_init(void)函数 , 该函数是 初始化 memblock...
early_init_fdt_scan_reserved_mem/* 添加/删除就是初始化这两个全局数组 */staticstructmemblock_regionmemblock_memory_init_regions[INIT_MEMBLOCK_REGIONS];//128staticstructmemblock_regionmemblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS];//161 early_init_dt_scan_memory() 中会检索 device_type...
arm64的memblock初始化位于arch/arm64/mm/init.c。初始化过程,首先如上节先将物理内存加入到memblock.memory中,然后在函数arm64_memblock_init中初始化memblock。 //start_kernel() ->setup_arch() ->arm64_memblock_init()void__initarm64_memblock_init(void){consts64linear_region_size=BIT(vabits_actual-...
内存管理是操作系统内核中最复杂的部分之一, start_kernel函数在内核启动第一个init进程前初始化了所有的内核特性(包括那些依赖于不同架构的特性),你也许还记得引导时创立的临时页表,但复杂的内存管理部分还没有开始,当start_kernel函数被调用时,我们会看到初期内存管理到更复杂的内存管理数据结构和技术的转变,为了更...
1.1.1.2memblock初始化 以上是memblock的三个结构体和相关函数说明,下面来看下memblock的初始化。 内核编译时候,会分配好memblock结构所需要的内存空间。 在文件mm/memblock.c文件中,如下所示: staticstructmemblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock; ...
内核初始化阶段是用内存分配器 memblock 进行管理,因为内核后期使用的内存分配器初始化过程中有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体,如伙伴分配器,那么伙伴分配器如何获取内存来初始化自己呢 ?为了达到这个目标,我们先实现一个满足要求的但是可能效率不高的内存分配器。用它来负责系统...
系统初始化的时候buddy系统,slab分配器等并没有被初始化好,当需要执行一些内存管理、内存分配的任务,就引入了一种内存管理器bootmem分配器。 当buddy系统和slab分配器初始化好后,在mem_init()中对bootmem分配器进行释放,内存管理与分配由buddy系统,slab分配器等进行接管。
2.初始化源文件“mm/memblock.c”定义了全局变量memblock,把成员bottom_up初始化为假,表示从高地址向下分配。ARM64内核初始化memblock分配器的过程是:(1)解析设备树二进制文件中的节点“/memory”,把所有物理内存范围添加到memblock. memory,具体过程参考3.6.3节。