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用这些技巧实现线程。
©专著权归作者所有,转载或内容合作请联系作者