Linux

Linux I/O 共享記憶體訪問

  • November 12, 2017

我對 linux 如何管理 I/O 共享記憶體以與使用它的設備進行通信感到非常困惑。

如果我理解正確,linux核心開始映射在0x100000(以避免第一兆字節的遺留ram數據並儲存在連續的記憶體位置),然後在進入保護模式後:

  • 在 32 位系統上有這樣的映射

在此處輸入圖像描述

ZONE_NORMAL 應該低於 896 MB,因此核心線性 1GB 和物理 896 MB 之間的映射始終是可能的。讓我們暫時忽略 ZONE_DMA(我讀到這僅適用於舊系統,因為 PCI 現在可以在記憶體中的任何地方使用 DMA 傳輸)

  • 在 64 位系統上,核心線性地址空間應該從 PAGE_OFFSET= 0xffff810000000000 開始

在這兩種情況下,如果核心空間中的地址大於 PAGE_OFFSET,則應參考 ioremap 映射(通過分頁解決),如果它低於 PAGE_OFFSET,則可以通過簡單的 NEW_ADDRESS = OLD_ADDRESS - PAGE_OFFSET 來解決。它是否正確?

額外的問題:當核心啟動並執行並且整理完成後,它是否仍然物理地駐留在 0x100000 和前後(在第一個 GB 內)?即使在 64 位系統上?

在 PC 上,硬體記憶體映射的 IO 範圍由 BIOS 分配到 3GiB 到 4GiB 之間的物理記憶體地址。當驅動程序請求訪問記憶體時,核心會將其映射到核心虛擬地址空間中的某個位置。

您的其他兩個問題似乎都與共享記憶體無關,但是:

在這兩種情況下,如果核心空間中的地址大於 PAGE_OFFSET,則應參考 ioremap 映射(通過分頁解決),如果它低於 PAGE_OFFSET,則可以通過簡單的 NEW_ADDRESS = OLD_ADDRESS - PAGE_OFFSET 來解決。它是否正確?

精神上,是的。無論哪種情況,硬體都使用頁表。

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