本文来分析arm64_memblock_init函数的代码
这个函数的主要作用是初始化memblock。关于memory的区间范围,已经在setup_machine_fdt函数中添加进来。这里主要是remove掉no-map的区域,并reserve一些关键区域:如kernel镜像、dtb块、ramdisk镜像和device tree中的一些需要reserve的节点。
查看代码发现,有对ramdisk和kernel进行reserve,没有dtb,因为在setup_machine_fdt中已经完成了。
除此之外,就是要从dts中解析memreserve and reserved-memory,进行memblock reserve和memblock remove(no-map的不归kernel管)
还申请了一个公共的CMA区域:16MB
之后memblock就算初始化完成,可以进行resize了
void __init arm64_memblock_init(void)
{
// RAM的起始物理地址,1GB对齐
// For [0x10000000, 0xffffffff], memstart_addr = 0x0
// For [0x40000000, 0xffffffff], memstart_addr = 0x40000000
// For [0x80000000, 0xffffffff], memstart_addr = 0x80000000
memstart_addr = round_down(memblock_start_of_DRAM(),
ARM64_MEMSTART_ALIGN);
// reserve [initrd_start, initrd_end)
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
u64 base = initrd_start & PAGE_MASK;
u64 size = PAGE_ALIGN(initrd_end) - base;
memblock_remove(base, size); /* clear MEMBLO

本文详细解析ARM64架构下memblock_init函数的工作原理,重点介绍如何初始化内存区块,包括移除no-map区域、预留关键内存区,如kernel、ramdisk及设备树节点,同时解析dts文件中的memreserve和reserved-memory属性。
最低0.47元/天 解锁文章

1451

被折叠的 条评论
为什么被折叠?



