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