微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux 内核初始化 - 何时解析设备树 blob 并加载树节点?

如何解决Linux 内核初始化 - 何时解析设备树 blob 并加载树节点?

我想为 Linux 初始化建立一个里程碑路线图,以便我轻松理解。 (对于嵌入式系统)这是我得到的:

  1. 引导加载程序将内核加载到 RAM 并启动它
  2. Linux 内核进入 head.o,启动 start_kernel()
  3. 找到 cpu 架构,启动 MMU。
  4. setup_arch() 被调用,设置 cpu
  5. 内核子系统已加载。
  6. do_initcalls() 被调用,带有 *_initcall() 和 module_init() 函数的模块被启动。
  7. 然后运行 ​​/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 初始化,我认为我们可以在列表中添加一些内容。

  1. 按下START按钮,触发复位信号

  2. CS:IP 修复到 BIOS 0XFFFF0 地址

  3. 跳转到 BIOS 的开始

  4. 自检,启动键盘等硬件设备,实模式IDT & GDT

  5. 加载引导加载程序,如 grub2 或 syslinux。

  6. Bootloader 将内核加载到 RAM 并启动它(boot.img->core.img)。

  7. A20 打开,调用 setup.s,切换到保护模式

  8. Linux内核进入head.o,IDT&GDT刷新,decompress_kernel(),启动start_kernel()

  9. INIT_TASK(init_task) 创建

  10. trap_init()

  11. 找到CPU架构,启动MMU(mmu_init())。

  12. setup_arch() 被调用,设置 CPU。

  13. 内核子系统已加载。

  14. do_initcalls() 被调用,带有 *_initcall() 和 module_init() 函数的模块被启动。

  15. rest_init() 将创建进程 1 和 2,换句话说,/sbin/init(或类似的)并运行 kthreadd。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。