Linux内核内存大小,在ARM Linux中,各种设备的相关属性描述都采用DTS方式来呈现。DTS是device tree source
的简称,最早是由PowerPC等其他体系结构使用的FDT(Flattened Device Tree)转变过来的,ARM Linux社区自2011年被Linus Torvalds公开批评之后开始全面支持DTS,并且删除了大量的冗余代码。
在ARM Vexpress平台中,内存的定义在vexpress-v2p-ca9.dts文件中。该DTS文件定义了内存的起始地址为0x60000000,大小为0x40000000,即1GB大小内存空间。
[arch/arm/boot/dts/vexpress-v2p-ca9.dts]
memory@60000000 {
device_type = "memory";
reg = <0x60000000 0x40000000>;
};
内核在启动的过程中,需要解析这些DTS文件,实现代码在early_init_dt_scan_memory()
函数中。代码调用关系为:start_kernel()->setup_arch()->setup_machine_fdt()->early_init_dt_scan_nodes()->early_init_dt_scan_memory()。
[drivers/of/fdt.c]
int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
int depth, void *data)
{
const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
const __be32 *reg, *endp;
int l;
if (strcmp(type, "memory") ! = 0)
return 0;
reg = of_get_flat_dt_prop(node, "reg", &l);
endp = reg + (l / sizeof(__be32));
while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
u64 base, size;
base = dt_mem_next_cell(dt_root_addr_cells, ®);
size = dt_mem_next_cell(dt_root_size_cells, ®);
if (size == 0)
continue;
early_init_dt_add_memory_arch(base, size);
}
return 0;
}
解析“memory”描述的信息从而得到内存的base_address和size信息,最后内存块信息通过early_init_dt_add_memory_arch ()->memblock_add()函数添加到memblock子系统中。
酷客网相关文章:
评论前必须登录!
注册