Android 物理地址、设备地址和虚拟地址之间的差异

Android 物理地址、设备地址和虚拟地址之间的差异,android,linux-kernel,kernel,kernel-module,Android,Linux Kernel,Kernel,Kernel Module,设备地址、物理地址和虚拟地址之间有什么区别 实际上,我在《驾驶员》中尝试mmap,我被这个概念所束缚。上面说: 内核通常使用虚拟地址。有人寄回的地址吗 kmalloc()、vmalloc()和类似接口是一个虚拟地址,可以 存储在“void*”中 虚拟内存系统(TLB、页表等)转换虚拟内存 CPU物理地址的地址,存储为“物理地址”或 “资源大小”。内核管理设备资源,如寄存器 物理地址。这些是/proc/iomem中的地址。身体 地址对司机来说不是直接有用的;它必须使用ioremap()进行映射 空

设备地址、物理地址和虚拟地址之间有什么区别

实际上,我在《驾驶员》中尝试
mmap
,我被这个概念所束缚。

上面说:

内核通常使用虚拟地址。有人寄回的地址吗 kmalloc()、vmalloc()和类似接口是一个虚拟地址,可以 存储在“void*”中

虚拟内存系统(TLB、页表等)转换虚拟内存 CPU物理地址的地址,存储为“物理地址”或 “资源大小”。内核管理设备资源,如寄存器 物理地址。这些是/proc/iomem中的地址。身体 地址对司机来说不是直接有用的;它必须使用ioremap()进行映射 空间并生成一个虚拟地址

I/O设备使用第三种地址:“总线地址”或“DMA地址”。 如果一个设备在MMIO地址上有寄存器,或者如果它执行DMA读取 或写入系统内存,设备使用的地址为总线地址。 在某些系统中,总线地址与CPU物理地址相同,但 一般来说,它们不是。IOMMUs和主机网桥可以产生任意 物理地址和总线地址之间的映射

下面是一张图片和一些示例:

CPU总线
虚拟物理地址
地址空间
空间
+-------+             +------+             +------+
|| | MMIO |偏移||
||虚拟|空间|应用||
C++-->B++-->++-->++-->A
||映射| |按主机||
+-----+| | | | | | | |+--------+
|     |   |       |             +------+             |      |   |        |
|CPU | | | | | RAM | | | |设备|
|     |   |       |             |      |             |      |   |        |
+-----+   +-------+             +------+             +------+   +--------+
||虚拟|缓冲区|映射||
X++-->Y++“实际上我正在驱动程序中尝试使用mmap”-mmap是一个用户界面。内核驱动程序不会使用mmap。