15顯存映射和DMA(上)
1linux顯存管理1.1地址類型
linux是一個虛擬顯存系統邏輯地址和物理地址的轉換,這意味著用戶程序所使用的地址與硬件使用的數學地址是不等同的。
image.png
1.1.1虛擬地址
用戶空間程序所能見到的常規地址。
每位進程都有自己的虛擬地址。用戶地址或為32位或為64位,取決于硬件的體系構架。
1.1.2化學地址
該地址在處理器和系統顯存之間使用。
化學地址也是32位或則64位長的。在個別情況下甚至32位系統也能使用64位的數學顯存。
1.1.3總線地址
該地址在外圍總線和顯存之間使用。一般它們與處理器使用的數學地址相同。
但如此做并不是必須的。一些計算機體系構架提供了I/O顯存管理單元(IOMMU)。它實現總線和主顯存之間的重新映射。IOMMU可以用好多種方法讓事情顯得簡單(例如使顯存中的分散緩沖區對設備來說是連續的)。并且當設置DMA操作時,編撰IOMMU相關的代碼是一個必須的額外步驟。其實總線地址是與體系構架密切相關的
1.1.4內核邏輯地址
內核邏輯地址組成了內核的常規地址空間。該地址映射了部份(或則全部)顯存,并時常被視為數學地址。
在大多數體系構架中,邏輯地址與其相關聯的數學地址的不同,僅僅是在它們之間存在一個固定的偏斜量
邏輯地址使用硬件內建的表針大小,因而在安裝了大量的32位系統中,它未能輪詢全部的數學地址。
邏輯地址一般保存在long或則void*這樣類型的變量中,()返回的顯存就是內核邏輯地址。
1.1.5內核虛擬地址
內核虛擬地址和邏輯地址的相同之處在于,它們都將內核空間的地址映射到化學地址上。內核虛擬地址與化學地址的映射毋須都是線性的和一對一的。而這是邏輯地址空間的特征。
所有的邏輯地址都是內核虛擬地址。并且許多虛擬內核地址不是邏輯地址。
示例:()分配的顯存具有一個虛擬地址(但并不存在直接的化學映射),kmap()也返回一個虛擬地址。虛擬地址一般保存在表針變量中。
1.1.6地址映射的宏
__pa():按照邏輯地址,返回其對應的數學地址
__va():將數學地址逆向映射到邏輯地址。但只對高端顯存頁有效
1.2頁
頁:化學地址被分成離散的單元,稱之為頁。每位頁的大小隨體系構架的不同而不同,通常為4096(1mm。
多個進程可以共享顯存管理結構邏輯地址和物理地址的轉換,linux用這些技巧實現線程。
?專著權歸作者所有,轉載或內容合作請聯系作者