無論 Linux 核心運行在什麼平台上,它都是如何運作的?

無論 Linux 核心運行在什麼平台上,它都是如何運作的?

我在這裡特別想知道的是:無論底層硬體如何,Linux 核心如何在所有不同的 PC 上運作。

或者一般來說,任何核心(微軟的 NT 核心、mac os 和 Linux)如何在任何 PC 上工作,無論 PC 的硬體配置如何。

這裡用一個場景來解釋我的問題:與PC-2相比,PC-1的藍牙、鍵盤、wifi等配置不同,並且由不同的製造商開發。為了使所有這些硬體都能正常工作,我想核心應該具有特定於硬體的程式碼來啟用這些硬體。我相信內核有設備驅動程式層,它應該在哪裡啟用這些硬體?或者它只是從其他地方加載設備特定的固件?硬體特定程式碼到底位於核心中的哪裡?另外,在消除疑問的同時,我遇到了 HAL、BSP。這些是什麼以及這些層在核心中的位置?

答案1

我在這裡特別想知道的是,無論底層硬體如何,Linux 核心如何在所有不同的電腦上運作

首先,只要核心是針對特定架構編譯的,它就可以在任何 PC 上運行。對於通用計算機,架構往往是相同的 (x86_64/amd64),但當您處理嵌入式裝置時,這種情況會改變。

設備樹

除了編譯之外,核心本身與硬體無關。我給你設備樹

Linux 核心處理不可發現硬體的方式是透過裝置樹。這告訴核心有關 CPU、記憶體、匯流排、透過 I2C、SPI 連接的裝置等資訊。設備佈局不是硬編碼的,而是可以透過設備樹進行更改。當你理解它時,這一切真的很神奇。設備樹還透過參數告訴核心應該為特定設備使用哪個驅動程式compatible

設備樹可以以各種不同的方式存儲,具體取決於內核的編譯方式,但通常可以在/proc/device-tree或下看到層次結構/sys/firmware/devicetree/base

對於 USB 裝置之類的東西,這一切都由 USB 驅動程式處理。核心具有用於控制鍵盤和滑鼠等東西的基本程式碼。一些供應商有自訂驅動程序,然後隨設備一起提供。

模組

對於驅動程序,Linux 核心使用稱為核心模組。所有模組都可以在 下找到/lib/modules。有兩種類型的模組:可載入模組和內建模組。您可以使用該命令查看所有已載入的模組lsmod。當核心在裝置樹中找到某個裝置時,或甚至當您將裝置插入周邊時,它會查看是否有可以為該裝置載入的模組,並且該模組將成為該裝置的驅動程式。

可載入模組的好處是它可以使核心映像保持更小。這些模組可以單獨編譯。內建模組被編譯到核心中,從而增加了實際圖像大小。您也可以在核心執行時間編譯模組並將其載入到核心中,但這是一個完全不同的主題。

中央銀行

當供應商為其自己的硬體(包括處理器和連接的硬體)提供核心和一堆特定模組時,您就進入了 BSP(板支援套件)。有時供應商會對現有模組進行變更或隨核心提供自訂模組。一些供應商對核心本身進行了更改,整個自訂套件成為 BSP。這種情況在嵌入式世界中經常發生。

哈爾

HAL(硬體抽象層)可以與 BSP 同義。我還沒有看到它在 Linux 世界中得到如此多的使用,但是當你進入微控制器時,它的使用非常頻繁。本質上,HAL 是一組用於存取硬體的庫,使與硬體的介面變得更加容易。例如,使用 WiFi 晶片,它會為您提供連接到 AP、掃描網路、建立存取點等的基本例程,從這個意義上來說,它有點像驅動程式。

相關內容