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

moz*_*ors 1 linux-kernel device-tree

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

  1. Bootloader 将内核加载到 RAM 并启动它
  2. Linux内核进入head.o,启动start_kernel()
  3. CPU架构找到,MMU启动。
  4. setup_arch() 被调用,设置 CPU。
  5. 内核子系统已加载。
  6. do_initcalls() 被调用,并且带有 *_initcall() 和 module_init() 函数的模块被启动。
  7. 然后运行 ​​/sbin/init (或类似的)。

我不知道这里究竟什么时候处理devicetree。是在处理 do_initcall() 函数时还是在处理之前?一般来说,何时解析 devicetree,何时处理树节点?预先非常感谢您。

非常感谢对我的想法的任何纠正。

tyC*_*hen 5

这是个好问题。

\n

首先,我想你已经知道内核会使用DT中的数据来识别具体的机器,在一般跨平台或硬件使用的情况下,我们需要它在启动初期建立起来,以便它有机会运行特定于机器的修复。

\n

以下是我从Linux 内核文档中摘录的一些信息。

\n
\n

在大多数情况下,机器身份无关紧要,内核将根据机器\xe2\x80\x99s 核心 CPU 或 SoC 选择设置代码。例如,在 ARM 上,arch/arm/kernel/setup.c 中的 setup_arch() 将调用 arch/arm/kernel/devtree.c 中的 setup_machine_fdt(),该函数会搜索 machine_desc 表并选择与设备树数据最匹配的 machine_desc 。它通过查看根设备树节点中的 \xe2\x80\x98兼容\xe2\x80\x99 属性,并将其与 struct machine_desc 中的 dt_compat 列表(在 arch/arm/include/ 中定义)进行比较来确定最佳匹配。 asm/mach/arch.h(如果你\xe2\x80\x99 好奇的话)。

\n
\n

至于Linux初始化,我认为我们可以在列表中添加一些内容。

\n
    \n
  1. 放上START按钮,复位信号触发

    \n
  2. \n
  3. CS:IP 修复至 BIOS 0XFFFF0 地址

    \n
  4. \n
  5. 跳转到BIOS的开始处

    \n
  6. \n
  7. 自检、键盘等硬件设备启动、实模式IDT、GDT

    \n
  8. \n
  9. 加载 Bootloader,如 grub2 或 syslinux。

    \n
  10. \n
  11. 引导加载程序将内核加载到 RAM 并启动它(boot.img->core.img)。

    \n
  12. \n
  13. A20 打开,调用setup.s,切换到保护模式

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

    \n
  16. \n
  17. INIT_TASK(init_task) 创建

    \n
  18. \n
  19. trap_init()

    \n
  20. \n
  21. CPU 架构找到,MMU 启动(mmu_init())。

    \n
  22. \n
  23. setup_arch() 被调用,设置 CPU。

    \n
  24. \n
  25. 内核子系统已加载。

    \n
  26. \n
  27. do_initcalls() 被调用,并且带有 *_initcall() 和 module_init() 函数的模块被启动。

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

    \n
  30. \n
\n