arm64_memblock_init

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

本文来分析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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值