所谓虚拟地址映射就是从虚拟地址映射到物理地址,MMU开启后,CPU访问的地址都是虚拟地址。
虚拟地址映射分为动态映射和静态映射
静态映射的特点
在内核启动时建立静态映射表,在内核关机时销毁,中间一直有效,优点是执行效率高,缺点是始终占用虚拟地址空间,空间利用率低
不同版本内核静态映射表位置,文件名可能不同
不同的SOC静态映射表位置,文件名可能不同
所谓的映射表其实是头文件中的宏定义
动态映射的特点
驱动程序根据需要随时动态建立使用和销毁映射,映射是短期临时的。类似c语言中的malloc分配内存。
优点是按需使用地址空间,空间利用率高。缺点是每次使用前后都要去建立和销毁映射,操作繁琐。
虚拟地址到物理地址的映射可以多对1,但是不能1对多。
在一个硬件驱动程序中,对于某个硬件寄存器的访问,既可以采用静态映射的方法,也可以采取动态映射的方法。
例如在linux源码的map.h文件中,有对CPU 寄存器虚拟地址的静态定义
#define GPIO_OFT(x) ((x) - 0x56000000)
#define GPFCON (*(volatile unsigned long *)(gpio_va + GPIO_OFT(0x56000050)))
#define GPFDAT (*(volatile unsigned long *)(gpio_va + GPIO_OFT(0x56000054)))
也可以利用该寄存器的物理地址动态获取虚拟地址。
#define GPFCON 0x56000050 //物理地址
unsigned char __iomem *pvmem;//虚拟地址指针
request_mem_region(GPFCON, mem_len, name);//request虚拟地址
pvmem=ioremap(GPFCON, mem_len);//得到虚拟地址
.............................................//利用该虚拟地址操控硬件设备
iounmap(pvmem);//利用完后释放虚拟地址