為什麼PCI設備共享相同的位址空間?

為什麼PCI設備共享相同的位址空間?

當電腦啟動時,BIOS 或作業系統會偵測每個 PCI 裝置以詢問它需要多少位址空間。然後,它分配適當的空間並告訴每個 PCI 裝置其空間從哪裡開始,以便 PCI 裝置可以回應該範圍內的讀寫請求。

我的問題是為什麼所有設備都需要從同一位址空間分配塊。為什麼不給每個設備一個自己的位址空間呢?

在印刷電路板上,已經有一種「帶外」方式來區分 PCI 設備:IDSEL 線。 這是在 PCI 枚舉期間、在每個裝置分配其空間之前使用的內容。 那麼為什麼不將其也用於枚舉後訪問,並在 PCI 設備上保存一些解碼邏輯呢?會不會以某種方式變慢,或什麼?

答案1

一般來說,他們不需要共享相同的地址空間。分離設備的位址空間正是 IOMMU 的用途,並且出於多種原因可能很有用:

  • 它可以安全地允許虛擬機器透過本機驅動程式直接存取實體硬體。
  • 它將設備的尋址能力與實體位址空間分離。換句話說,它讓您的裝置只能在實體記憶體中的任何位置(甚至在第一個 4G 以上)進行 32 位元尋址存取資料。
  • 它可以讓您更徹底地隔離設備,從而顯著提高系統的安全性。

至於為什麼這不是預設行為,以及為什麼不使用 IDSEL 線,我真的不能說,因為我對 PCI 設計的歷史了解不多。我的第一個猜測是,它最初是為了更容易地將 ISA 卡的驅動程式移植到 PCI(ISA 假定平坦的共用位址空間)。此外,IOMMU 並不是最容易設計的硬件,直到最近才在 x86 平台上廣泛使用(並且仍然不能保證,許多 Intel 晶片仍然沒有它們,並且許多低端 AMD 晶片也不要)。

可能值得指出的是,使用 PCI Express,跨裝置共用位址空間實際上有一個優點,即它可以讓您進行裝置到裝置的傳輸(儘管大多數平台不能正確支援這一點),這可以在使用RDMA 的大型網格設定中非常有用(您可以直接從遠端設備獲取數據,無需遠端系統的作業系統在傳輸設定後進行調解)。

答案2

對於x86系統,CPU本身只能存取兩個位址空間:普通記憶體位址空間和IO位址空間。其他系統可能只有一個位址空間(例如ARM、powerpc等)。從 PCI 設備的角度來看,這兩個位址空間是分開的——使用不同的命令來存取每個位址空間,而橋接器對於每個位址空間都有單獨的配置暫存器。然而,由於CPU只能存取這兩個位址空間,因此所有連接的裝置都必須對應到這兩個位址空間。因此,與其說這是 PCI 的限制,不如說是系統其餘部分架構的限制。

我還應該提到的是,當 PCI 開發時,還沒有 IOMMU 這樣的東西,這是一個相對較新的添加。

相關內容