1. 程式人生 > >LDD3 第15章 記憶體對映和DMA

LDD3 第15章 記憶體對映和DMA

本章內容分為三個部分:

  • 第一部分講述了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控制器通訊