setup_machine_fdt

本文来分析setup_machine_fdt函数的代码
1.先讨论下dtb的物理地址变量__fdt_pointer
2.关于fixmap_remap_fdt已经在https://blog.youkuaiyun.com/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>;
};
在新唐NUC977开发板上,`machine_desc`结构体扮演着至关重要的角色,它几乎影响着整个kernel的启动流程。对于开发板ID、IRQs、DMA、视频RAM、SMP和内存管理等关键硬件特性与功能的初始化,都与该结构体密切相关。在NUC977的kernel启动过程中,`machine_desc`结构体的实例是根据硬件配置被创建的,它定义了一组特定于平台的参数和函数指针。 参考资源链接:[新唐NUC977开发板Kernel启动流程深度剖析](https://wenku.youkuaiyun.com/doc/6471a6fed12cbe7ec30106d0?spm=1055.2569.3001.10343) 当系统启动时,首先会调用`start_kernel()`函数,这是Linux内核初始化的主入口。在这个函数的早期阶段,`setup_arch()`函数会被调用,它的职责是获取机器类型和相关硬件信息,准备内核的底层架构。此时,`machine_desc`结构体通过`setup_machine_fdt()`函数被填充,该函数读取设备树(Device Tree)信息,从中提取出`machine_desc`所需的参数。 `machine_desc`结构体中的`nr_irqs`字段记录了中断请求的数量,这对于中断管理模块来说是基础数据。`dma_zone_size`字段定义了DMA区域的大小,它是内存管理模块确定DMA可用内存范围的关键依据。视频RAM的地址范围则影响到图形初始化和显示性能,对于需要图形界面的应用至关重要。 SMP支持是现代多核处理器系统的标准配置,`machine_desc`中的`smp`结构体提供了SMP操作的支持,如处理器间同步、启动其他处理器等。`fixup`、`reserve`、`map_io`和`init_early`等函数指针,则分别在不同的初始化阶段被调用,用于处理特定的硬件配置和初始化任务。 启动流程的最后阶段,内存管理器会根据`machine_desc`提供的内存布局信息来初始化内存区域,中断系统也会根据其描述来完成最终的初始化。 因此,`machine_desc`不仅是kernel启动流程中不可或缺的结构体,也是深入理解NUC977开发板硬件特性和kernel底层行为的关键。《新唐NUC977开发板Kernel启动流程深度剖析》一书提供了对这一过程的详细解读,帮助开发者更好地理解如何通过`machine_desc`来定制和优化kernel的启动过程。 参考资源链接:[新唐NUC977开发板Kernel启动流程深度剖析](https://wenku.youkuaiyun.com/doc/6471a6fed12cbe7ec30106d0?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值