Linux

ioremap和文件操作mmap有什麼區別?

  • February 15, 2016

我目前正在為 Ubuntu 開發 PCI 設備驅動程序。我有一些關於 PCI 驅動程序的範常式式碼,但我很難理解 ioremap 和 file_operation.mmap。

文件操作mmap說明:

記憶體映射是現代 Unix 系統最有趣的特性之一。就驅動程序而言,可以實現記憶體映射來為使用者程序提供對設備記憶體的直接訪問。映射設備意味著將一系列使用者空間地址與設備記憶體相關聯。每當程序在分配的地址範圍內讀取或寫入時,它實際上是在訪問設備。

ioremap的說明:

在許多系統上,根本無法以這種方式直接訪問 I/O 記憶體。所以必須先建立一個映射。這就是ioremap函式的作用。該函式專門設計用於為I/O記憶體區域分配虛擬地址。

以上描述均來自“makelinux”。但我仍然不確定我是否正確理解這兩個函式之間的區別。目前,我是這樣理解的fops.mmap:(文件操作 mmap)將一系列使用者空間地址與設備記憶體相關聯。這意味著對於 pci 設備,我們BAR使用fops.mmap. 並且ioremap,我們為這些“真實地址”做虛擬地址映射fops.mmap

如果我錯了,有人可以告訴我嗎?謝謝~

PS。我也在 Ubuntu 社區發布了這個,希望我沒有違反任何規則。

我建議你看看LDD3 的書,它是免費的。它確實在第 9 章,第 249 頁中解釋了 ioremap。另請參閱 APIU 第 3 版,第 14.8 章,第 525 頁。讓我總結一下,盡我所能:

ioremap是一個核心函式,它允許通過稱為 I/O 映射記憶體的機制訪問硬體。記憶體中的某些地址被 CPU 和 RAM 之間的主機板截獲並重定向到其他硬體,如磁碟或鍵盤。不確定您是否可以通過指針或其他一些核心函式使用通常的定址。

I/O 記憶體只是設備通過匯流排向處理器提供的類似 RAM 的區域。此記憶體可用於多種用途,例如保存影片數據或乙太網數據包,以及實現與 I/O 埠類似的設備寄存器(即,它們具有與讀取和寫入相關的副作用)。

mmap是使用者空間中可用的系統呼叫,它將程序記憶體區域映射到文件的內容,而不是 RAM。當您通過通常的指針取消引用訪問該映射的記憶體區域時,核心將其轉換為文件操作。本質上,寫入記憶體變成了寫入文件。這只是呼叫 write() 的一種更奇特的方式。

記憶體映射 I/O 讓我們將磁碟上的文件映射到記憶體中的緩衝區,這樣,當我們從緩衝區獲取字節時,就會讀取文件的相應字節。同樣,當我們在緩衝區中儲存數據時,相應的字節會自動寫入文件。這讓我們可以在不使用讀取或寫入的情況下執行 I/O。

*(旁注)*我認為第一個稱為“IO 映射記憶體”,第二個稱為“記憶體映射 IO”。難怪你會感到困惑。

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