linux驱动程序中的虚拟地址动态映射和静态映射

所谓虚拟地址映射就是从虚拟地址映射到物理地址,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);//利用完后释放虚拟地址

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值