我正在制作一个将运行 GNU/Linux 操作系统的硬件项目,我有一个问题。(编辑:它是基于 ARM 的)
Linux 内核如何准确地知道连接到 CPU 的硬件类型,我的意思是它如何知道这是一个 RAM,那是一个驱动器……等等。
特别是对于网络接口,如果系统有多个以太网网卡和多个 WiFi 收发器,它如何知道哪个是哪个以及如何知道它们如何在硬件上连接(也许它们与多路复用器连接,也许与 I2C 、 SPI .. 。ETC)。
答案1
所有这些非常低水平的工作当然取决于……建筑学。
对于最常见的 (x86/IBM PC),BIOS 将为良好的启动提供很大帮助。如果你收到了,请查看你的引导日志,它将开始查询 BIOS:
BIOS提供的物理RAM映射:
再往下,您可能会注意到类似的内容:
BIOS-e820: [mem 0x00000000cff80000-0x00000000cff8dfff] ACPI 数据
这些是 BIOS 提供的表,操作系统可以依赖这些表来获取有关外设的附加信息……(众所周知,BIOS 在这方面或多或少有些问题)
另一方面,您会得到 ARM SoC,每个供应商都以自己的方式支持外设(通常是闭源),当然,他们从未就任何 BIOS 等效项达成一致。这种情况引出了 Linus Torvald 的一些名言:
我希望 SoC ARM 设计者死于一场极其痛苦的事故。 […] Gaah,伙计们,这整个 ARM 的事情真是太他妈的痛苦了。
如果您的项目基于那种硬件……那么……祝您好运!您可能必须对内存范围进行暴力破解。 (写下并考虑会发生什么)
然后是更少的依赖于架构的信息数据。关于标准总线上的设备的那些:
为了ISA设备(现在主要是串行/并行端口),您需要依靠一些反复试验的方法来读取非常有限的数量通常端口地址来考虑它的样子。
对于插入的设备PCI公共汽车、PCI配置空间是一个标准,可以实现标准(架构独立)枚举和初始化方法。
无论如何,如果您的硬件不能依赖标准化方法进行探测,您将独自回答您的问题@电信公司建议:
在 ARM 上,标准似乎是硬件的设计者(或逆向工程人员,视情况而定)必须以以下形式描述它:设备树数据,然后由特定于硬件的引导加载程序与内核文件和可能的 initramfs 文件一起加载。因此,如果您的硬件项目使用的架构不包括 PCI 或 PCIe 等标准化、可自动探测的主总线,那么您,硬件设计人员将必须为 Linux 内核提供该信息。
答案2
x86 架构描述了 Linux 内核在启动过程中枚举的标准 PC 组件(接口包括 PCI、PCI-E、RAM 等)。某些总线允许动态连接/分离设备,例如 USB 或 SATA。您的问题不是特定于 Linux/Unix 的。