系统启动时的内存操作 二
伙伴算法 三
slab 分配器 四
slob 分配器 五
slub 分配器 六
kmalloc 和 kfree 七
vmalloc 和 vfree 八
glibc 中的 malloc 和 free 九
参考资料 一
[[Anchor(NBE1)]]系统启动时的内存操作 1
pg0 的位置和尺寸 当系统刚刚启动时,在分页功能未打开前,线性地址和物理地址是一一对应的
刚开启分页功能时,pg0 的内存地址是 在编译内核时定义好的,见 arch\i386\kernel\vmlinux
S,大小为 4096 字节,启始地址紧跟内核在内存中物理地址
由于 内核保护模式代码启始位置为0x100000,所以 pg0 地址=0x100000+内核保护模式代码尺寸
对 pg0 的操作主要是开启分页机制时填写页面描述表信息,上一节在第一次页寻址设置中已经详细介绍
内存位图的内存操作 内存位图是系统设置区域和页面管理前的内存使用状态表
1 内存位图的位置和尺寸 位图 contig_page_data
bdata->node_bootmem_map 的起始地址跟在init_pg_tables_end 的后面
大小等于所有物理页面数除以 32,即每一位代表一个页面
首先我们看文件 arch/i386/kernel/setup
c 中的 setup_memory 函数 min_low_pfn = PFN_UP(init_pg_tables_end); 然后看同样文件中的函数 setup_bootmem_allocator bootmap_size = init_bootmem(min_low_pfn, max_low_pfn); 在init_bootmem 中min_low_pfn 是init_pg_tables_end 的页框号 最终在函数init