所以我正在寻求学习嵌入式 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/