ERROR: reserving fdt memory region failed 错误分析

文章讲述了在使用DTS时遇到的错误,即`ERROR:reservingfdtmemoryregionfailed`,源于boot_fdt_add_mem_rsv_regions函数中处理reserved-memory节点时,内存申请超界。分析了错误原因并涉及到LinuxDeviceTreeSpecification(DTS)的内存预留机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改DTS 出现下面错误

ERROR: reserving fdt memory region failed

在 boot_fdt_add_mem_rsv_regions调用boot_fdt_reserve_region前加入打印:

void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
{
uint64_t addr, size;
int i, total, ret;
int nodeoffset, subnode;
struct fdt_resource res;
enum lmb_flags flags;

if (fdt_check_header(fdt_blob) != 0)
	return;

/* process memreserve sections */
total = fdt_num_mem_rsv(fdt_blob);
for (i = 0; i < total; i++) {
	if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
		continue;
	boot_fdt_reserve_region(lmb, addr, size, LMB_NONE);
}

/* process reserved-memory */
nodeoffset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
if (nodeoffset >= 0) {
	subnode = fdt_first_subnode(fdt_blob, nodeoffset);
	while (subnode >= 0) {
		/* check if this subnode has a reg property */
		ret = fdt_get_resource(fdt_blob, subnode, "reg", 0,
				       &res);
		if (!ret && fdtdec_get_is_enabled(fdt_blob, subnode)) {
			flags = LMB_NONE;
			if (fdtdec_get_bool(fdt_blob, subnode,
					    "no-map"))
				flags = LMB_NOMAP;
			addr = res.start;
			size = res.end - res.start + 1;
			boot_fdt_reserve_region(lmb, addr, size, flags);
		}

		subnode = fdt_next_subnode(fdt_blob, subnode);
	}
}

}

发现错误和LINUX DTS 对应的保留内存对应

分析发现是保留内存申请太大超界导致异常。

Booting using the fdt blob at 0x12000000
2xx 800000 12000000 0
2xx 1000000 13000000 0
ERROR: reserving fdt memory region failed (addr=13000000 size=1000000 flags=0)
vpu_cma_region:resion@0x12000000{
compatible = “shared-dma-pool”;
reg = <0x12000000 0x1000000>;
reusable;
};

	csi_cma_region:resion@0x12800000{
		compatible = "shared-dma-pool";
		reg = <0x13000000 0x800000>;
		reusable;
	};

boot_fdt_add_mem_rsv_regions–从reserved-memory节点获取保留内存信息。申请保留内存,LINUX DTS 如果保留内存错误会导致异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值