ARM linux系統中的PCI列舉,是BIOS還是linux做的?如果我在 linux 啟動之前不為 PCIe 做任何事情怎麼辦?
我在某處讀到 PCI 列舉(查找匯流排和設備、功能)是由 x86 系統中的 BIOS 完成的。(今天我在韓國網路文件中再次看到它:https ://melonicedlatte.com/computerarchitecture/2019/11/27 /234300.html )。那麼基於arm64的系統呢?我從https://patchwork.kernel.org/project/linux-pci/patch/1404422876-1160-1-git-send-email-tinamdar@apm.com/發現arm64 使用 UEFI 進行 PCIe 初始化,還發現你-boot 支持 arm64 的 PCIe。那麼,如果我不使用 UEFI 韌體並使用 u-boot 並且在 u-boot 期間不對 PCIe 做任何事情,作業系統(linux)會進行列舉嗎?(當然我為 PCI 和我的 PCIe 控制器配置了 linux)。
這裡有很多東西要解壓:
PCI 列舉
PCI與PCIe 不同。剩下的問題是關於 PCIe,所以我假設這是關於 PCIe,而不是 PCI。
PCIe 嚴格來說沒有列舉。因為它不是匯流排,而是點對點連結的網路,帶有網橋(在電腦網路中,您可以將這些網路交換機稱為網路交換機)。網路中的任何一點都不需要知道整個網路本身就可以執行。沒有bus,所以沒有bus enumeration。
作業系統需要知道那裡有哪些設備。這可以通過查詢所有下游連接設備的根聯合體來實現,每個設備本身都是所有下游連接設備的橋接器。
這一切都可以由作業系統完成,它可以(與 PCI 不同,通常)在任何時候都沒有損害,因此,作業系統本身就是這樣做的。然後它所做的實際上是設置找到的硬體,為其提供記憶體映射區域等等。Linux 會進行這種列舉。
存在一個例外:需要啟動的設備(即網路介面、NVMe、圖形控制器……),而韌體甚至需要這些設備來執行作業系統。顯然,首先需要找到這些。所以:您的主機板韌體也可以做到這一點。
這與您的 CPU 架構無關——它只需要完成,無論您使用的是 x86 還是 arm。在我們通常所說的“嵌入式”設備上,您可以自己編寫或配置您的韌體,這樣它就不必嘗試找出哪些設備在哪裡。它仍然需要與之交談並設置設備。所以,同樣的故事:“非全網路”列舉,而是預配置設備的列舉。
在 x86 系統中由 BIOS 完成
“BIOS”是您的系統韌體的 API。實際韌體可能會進行一些初始化,但它的“BIOS”部分早於 PCIe;它與此無關。
“UEFI”只是另一個 API。更現代。
arm64 使用 UEFI 進行 PCIe 初始化
究竟什麼是“PCIe 初始化”?你需要在這裡非常精確。
同樣,ARM64 與您是否擁有 PCIe 或您的韌體如何與 PCIe 互動無關。只是不同的東西。你可以擁有一個非常類似於 PC 的電腦架構和帶有 ARM、PowerPC 或……CPU 的韌體,你也可以擁有一個非常非 PC 架構的內部 x86。
此外,UEFI 可以是任何東西;這個名字的字面意思是“可擴展的韌體介面”。UEFI 模組提供了一個成熟的 Web 伺服器!這些當然需要其他 UEFI 模組來提供 TCP/IP 堆棧,並且這些需要網路介面驅動程序,並且需要做一些 PCIe 列舉來查找網路介面並與之通信。
但是,您也可以建構一個不包含此類內容的 UEFI,因此不需要進行 PCIe 列舉。
但是:不知何故,某處,您將需要載入您的軟體引導載入程序/作業系統。在許多電腦上,包含它的儲存設備只能通過 PCIe 訪問。因此,需要進行某種設置。
在其他方面,例如嵌入式 x86 SoC 或某些 ARM SoC,引導載入程序位於某些 eMMC 上,並且或多或少直接連接到 CPU。這一切都取決於您的電腦的設計!
**CPU架構與外圍介面設計關係不大。**這些只是單獨的事情。
例如,Playstation 4 是 x86 並且具有 PCIe,但它不是 PC,不會嘗試具有 BIOS,硬體沒有與 PC 兼容的計時器或中斷控制器。
然後,如果我不使用 UEFI 韌體並使用 u-boot a
正如 UEF 介面名稱所暗示的那樣,UEFI 只是您的韌體提供(或不提供)的軟體 API。這與它在內部對硬體所做的事情幾乎沒有關係。