标签:early scan setup machine init fdt memory dt
本文来分析setup_machine_fdt函数的代码
1.先讨论下dtb的物理地址变量__fdt_pointer
2.关于fixmap_remap_fdt已经在https://blog.csdn.net/snail_coder/article/details/94023887中谈论,这里不再提
3.谈论下early_init_dt_scan函数
关于__fdt_pointer
这个参数是由bootloader启动kernel时透过x0寄存器传递过来的,bootloader也就传递了这么一个参数过来,只是透过这个地址能获取到更多参数。
// kernel/msm-4.9/arch/arm64/kernel/head.S
preserve_boot_args:
mov x21, x0 // x21=FDT
__primary_switched:
str_l x21, __fdt_pointer, x5 // Save FDT pointer
顺便说下,这个保存的是物理地址,变量initial_boot_params保存的则是虚拟地址
fixmap_remap_fdt函数会返回dtb映射完成后的虚拟地址,这个虚拟地址之后会保存在initial_boot_params变量中:
setup_machine_fdt
early_init_dt_scan
early_init_dt_verify
bool __init early_init_dt_verify(void *params)
{
......
/* Setup flat device-tree pointer */
initial_boot_params = params;
......
}
最后看early_init_dt_scan函数
和内存初始化相关联的就是early_init_dt_scan_memory,其中会找到device_type = "memory"所在的node,获取到内存布局信息。
需要注意的是,dtb中这个内容不是静态的:在编译器件没有这个node,它是在bootloader中根据实际的内存状态添加进来的。
有个这个,memblock就知道内存的地址范围了。
early_init_dt_scan
early_init_dt_scan_nodes
early_init_dt_scan_memory
early_init_dt_add_memory_arch
memblock_add
// dts
memory {
device_type = "memory";
reg = <0x0 0x10000000 0x0 0x70000000 0x0 0x80000000 0x0 0x80000000>;
};
标签:early,scan,setup,machine,init,fdt,memory,dt 来源: https://blog.csdn.net/y658t/article/details/94039723
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。