如何解决Linux 内核初始化 - 何时解析设备树 blob 并加载树节点?
我想为 Linux 初始化建立一个里程碑路线图,以便我轻松理解。 (对于嵌入式系统)这是我得到的:
- 引导加载程序将内核加载到 RAM 并启动它
- Linux 内核进入 head.o,启动 start_kernel()
- 找到 cpu 架构,启动 MMU。
- setup_arch() 被调用,设置 cpu。
- 内核子系统已加载。
- do_initcalls() 被调用,带有 *_initcall() 和 module_init() 函数的模块被启动。
- 然后运行 /sbin/init(或类似的)。
我不知道这里什么时候处理设备树。是在处理 do_initcall() 函数时还是在此之前? 一般什么时候解析devicetree,什么时候处理树节点? 预先非常感谢您。
非常感谢对我的想法的任何纠正。
解决方法
这是个好问题。
首先,我想你已经知道内核会使用 DT 中的数据来识别特定的机器,如果跨平台或硬件的一般使用,我们需要在早期启动时建立它,以便它具有有机会运行特定于机器的修复程序。
以下是我从 linux kernel documents 中摘录的一些信息。
在大多数情况下,机器身份无关紧要,内核会根据机器的核心 CPU 或 SoC 选择设置代码。例如在 ARM 上,arch/arm/kernel/setup.c 中的 setup_arch() 将调用 arch/arm/kernel/devtree.c 中的 setup_machine_fdt(),它搜索 machine_desc 表并选择最匹配设备树数据的 machine_desc .它通过查看根设备树节点中的“兼容”属性来确定最佳匹配,并将其与 struct machine_desc 中的 dt_compat 列表(在 arch/arm/include/asm/mach/arch.h 中定义,如果您很好奇)。
至于 Linux 初始化,我认为我们可以在列表中添加一些内容。
-
按下START按钮,触发复位信号
-
CS:IP 修复到 BIOS 0XFFFF0 地址
-
跳转到 BIOS 的开始
-
自检,启动键盘等硬件设备,实模式IDT & GDT
-
加载引导加载程序,如 grub2 或 syslinux。
-
Bootloader 将内核加载到 RAM 并启动它(boot.img->core.img)。
-
A20 打开,调用 setup.s,切换到保护模式
-
Linux内核进入head.o,IDT&GDT刷新,decompress_kernel(),启动start_kernel()
-
INIT_TASK(init_task) 创建
-
trap_init()
-
找到CPU架构,启动MMU(mmu_init())。
-
setup_arch() 被调用,设置 CPU。
-
内核子系统已加载。
-
do_initcalls() 被调用,带有 *_initcall() 和 module_init() 函数的模块被启动。
-
rest_init() 将创建进程 1 和 2,换句话说,/sbin/init(或类似的)并运行 kthreadd。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。