linux-kernel - 嵌入式 Linux 新手问题

标签 linux-kernel embedded boot device-tree rootfs

所以我正在寻求学习嵌入式 Linux,并且有一些我似乎无法找到答案的问题。

1) 内核编译时是否依赖dtb/dts文件?我认为内核只需要知道芯片架构(即arm),并且dtb文件是由引导加载程序(uBoot)加载的,因此内核只需要加载由dtb文件配置的驱动程序。

2) 混合和匹配:我的印象是,我可以混合和匹配引导加载程序、dtb、内核、rootfs 和模块的任意组合,如下所示

  • 内核:必须知道它是为哪个芯片编译的
  • dtb:必须了解主板详细信息和芯片,即多少 RAM,为 SPI 配置 GPIO
  • 引导加载程序:必须知道芯片,并且 uEnv.txt 必须具有内核和 dtb 位置的参数
  • rootfs:完全独立
  • 模块:必须使用特定版本的内核编译

3) 驱动程序:如果我想加载 SPI 驱动程序,我是否需要任何特定的东西,或者内核是否知道如何操作它,因为 dtb 文件设置了所需的寄存器?

4) 模块:这些模块是否仅依赖于内核,或者它们是否需要了解有关芯片和主板的信息(当我说芯片时,我的意思是它们是否需要了解的不仅仅是简单的 ARM 或 x86 架构)?

预先感谢您,我知道这些是一些基本问题,但感谢您的帮助。

最佳答案

1) Does the kernel depend on the dtb/dts files when compiling? I thought that the kernel only needs to know the chip architecture (i.e. arm) and the dtb file is loaded by the boot loader (uBoot [sic]) so therefore the kernel only needs to load its drivers which are configured by the dtb file.

Linux 内核的编译不依赖于设备树。
内核的编译确实取决于芯片架构,但编译哪些代码模块取决于主板配置和功能选择。
顺便说一句,它是用于通用启动的 U-Boot,而不是 microBoot。

2) Mixing and matching: I'm under the impression that I can mix and match any combination of boot loader, dtb, kernel, rootfs, and modules given the following

kernel: must know which chip it is compiled for
dtb: must know the board details and chip, i.e. how much ram, configure a GPIO for SPI boot loader: must know the chip and uEnv.txt must have params for the kernel and dtb location
rootfs: completely independent
modules: must be compiled with the specific version of kernel

基本上是正确的,但通常不会过度尝试“混合匹配”。通常有最佳或首选(或至少合适)的选择。
我假设您所说的“rootfs”是指 rootfs 的文件系统类型,而不是 rootfs 的某些镜像。 (参见下面的附录。)

3) Drivers: If I want to load a SPI driver do I need anything specific or

“SPI 驱动程序”有两种类型,主机驱动程序和协议(protocol)驱动程序。
SPI 主设备驱动程序用于作为单接口(interface)主设备的 SPI Controller 芯片。这通常是一个平台驱动程序,并且在 /dev 中没有设备节点。
对于每个 SPI 从设备,都必须有一个协议(protocol)驱动程序。该驱动程序通常在 /dev 中有一个设备节点。

will the kernel know how to operate this because the dtb file setup the required registers?

设备树必须指定哪个驱动程序适用于哪个设备以及分配/分配给每个设备的任何/所有资源。

dtb 文件不“设置”任何东西。这只是配置数据;没有可执行代码。设备驱动程序通常在其探测或初始化阶段负责获取/分配其资源。

4) Modules: Are these just dependent on the kernel or do they need to know something about the chip and board?

您对“模块”的使用不明确。源代码文件有时称为“模块”。想必您真正的意思是可加载内核模块。

尽管大多数人(仅)将内核模块与设备驱动程序相关联,但其他内核服务(例如文件系统和网络协议(protocol)处理程序)也可以构建为模块。 内核模块与静态链接(即内置在内核中)的主要理由是为了运行时可配置性(这反过来又提高了内存效率)。可选功能、服务和驱动程序可以从启动的内核中删除,但仍可以在以后需要时加载。

可加载模块“依赖于”内核,仅仅是因为正确执行的链接要求。 “芯片和主板知识”的程度显然取决于模块的功能,就像任何其他内核代码一样。

附录

when I say rootfs I am referring to a prebuilt rootfs

内核镜像和(预构建的)rootfs 镜像并非“完全独立”。
rootfs 镜像中的可执行二进制文件和共享库必须与内核功能兼容。更重要的是,由于内核可加载模块安装在 rootfs 中,而不是与内核镜像一起安装,并且这些模块可以严格绑定(bind)到内核版本的特定构建,因此将内核镜像与 rootfs 镜像配对是有意义的。

关于linux-kernel - 嵌入式 Linux 新手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26951292/

相关文章:

c - 如何解决Linux内核中C中的错误 "initializer element is not constant"

c - 仅链接库中的某些符号

c - 如何完全释放定时器(timer_list)?

c - 复位 vector 在现代处理器中的意义

linux - Linux中多核处理器从实模式到保护模式的转变

linux - 使用 pfsend 丢包的原因是什么

linux-kernel - 更改 .config 文件后需要构建整个内核吗?

c - 如何通过DMA传输数据到UART0 NXP LH79524?

android - 如果应用程序尚未运行,广播接收器不会收到 ACTION_BOOT_COMPLETED?

c - 为什么 Linux 内核使用它所使用的数据结构?