LDD3 第15章 記憶體對映和DMA
阿新 • • 發佈:2018-11-10
本章內容分為三個部分:
- 第一部分講述了mmap系統呼叫的實現過程。將裝置記憶體直接對映到使用者程序的地址空間,儘管不是所有裝置都需要,但是能顯著的提高裝置效能。
- 如何跨越邊界直接訪問使用者空間的記憶體頁,一些相關的驅動程式需要這種能力。在很多情況下,核心執行了該種對映,而無需驅動程式的參與。
- 直接記憶體訪問(DMA)I/O操作,它使得外設具有直接訪問系統記憶體的能力。
一、Linux的記憶體管理
關注Linux記憶體管理實現的主要特性,而非講述作業系統中記憶體管理的理論。
地址型別
Linux是一個虛擬記憶體系統,意味著使用者程式所使用的地址與硬體使用的實體地址是不同的。
虛擬記憶體是一個簡介層,系統中執行的程式可以分配比實體記憶體更多的記憶體。甚至單獨程序都擁有比系統實體記憶體更多的虛擬地址空間。
在任何情況下使用何種型別的地址,核心程式碼並未明確加以區分,因此程式對此要仔細處理。
- 使用者虛擬地址:這是在使用者空間程式所能看到的常規地址。使用者地址或者32位的,或者是64位的
- 實體地址:該地址在處理器和系統記憶體之家使用。
- 匯流排地址:該地址在外圍匯流排和記憶體之間使用。通常他們與處理器使用的實體地址相同,但這麼做並不是必須的。一些計算機提供I/O記憶體管理(MMU),實現匯流排和主記憶體之間的重新對映。
- 但使用DMA時,MMU變成了一個額外的操作。
- 核心邏輯地址:核心邏輯地址組成了核心的常規地址空間。kmalloc返回的就是核心邏輯地址
- 核心虛擬地址:核心虛擬地址和核心邏輯地址,都將核心空間的地址對映到實體地址上。核心虛擬地址與實體地址的對映不是一一對應的。
實體地址和頁
高階與低端記憶體
記憶體對映和頁結構
頁表
虛擬記憶體區
vm_area_struct結構
記憶體對映處理
二、mmap裝置操作
使用remap_pfn_range
一個簡單的實現
為VMA新增操作
使用nopage對映記憶體
重對映特定的I/O區域
重新對映RAM
使用nopage方法重對映RAM
重新對映核心虛擬地址
三、執行直接I/O訪問
非同步I/O
直接訪問記憶體
DMA資料傳輸概覽
分配DMA緩衝區
DIY分配
匯流排地址
通用DMA層
處理複雜的硬體
DMA對映
建立一致性DMA對映
DMA池
建立流式DMA對映
單頁流式對映
分散/聚集對映
PCI雙重地址週期對映
一個簡單的PCI DMA例子
ISA裝置的DMA
註冊DMA
與DMA控制器通訊