Linux-Kernel

Linux硬體介面

  • July 17, 2022

我正在製作一個將執行 GNU/Linux 作業系統的硬體項目,我有一個問題。(編輯:它是基於 ARM 的)

Linux 核心如何確切地知道連接到 CPU 的硬體類型是什麼,我的意思是它是如何知道這是一個 RAM 並且那是一個驅動器……等等。

特別是對於網路介面,如果系統有多個乙太網 NIC 和多個 WiFi 收發器,它如何知道哪個是哪個以及如何知道它們是如何在硬體方面連接的(可能它們與多路復用器連接,可能與 I2C、SPI .. 。ETC)。

所有這些非常低級的工作當然將取決於……架構

對於最常見的(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 配置空間是一個標準,可以實現標準(獨立於架構)的列舉和初始化方法。


在任何情況下,如果您的硬體不能依賴標準化的探測方法,您將按照@telcoM 的建議自行回答您的問題:

在 ARM 上,標準似乎是硬體的設計者(或逆向工程師,視情況而定)必須以設備樹數據的形式描述它,然後由特定於硬體的引導載入程序與核心文件和可能的 initramfs 文件。因此,如果您的硬體項目使用的架構不包括標準化的、可自動探測的主匯流排(如 PCI 或 PCIe),那麼是的,硬體設計人員必須為 Linux 核心提供該資訊。

引用自:https://unix.stackexchange.com/questions/710157