对内存映射,直接IO机制,DMA的重新认识

        1.   内存映射

        一直以为,映射设备的IO的资源到内存上,读写这段内存地址就是等于直接读写设备的IO资源了。

      实际这是大错特错的,从CPU的引脚连线角度去看,设备IO根本就没直接连接到CPU上,试问这可能直接就读写设备的IO呢?这显然是不可能的。

      内存映射实际上是操作系统提供的一种机制,这种机制的在于:将读写映射内存空间的操作转化对被映射的物理地址读写操作。由于物理条件所限制,这种 “转化” 肯定不是以硬件的方式转化,就像虚拟地址通过MMU转化为物理地址那样的“直接”。这转化实际是由内核将这片内存空间的数据搬移到设备的IO之上的,可见其并不是直接的,通常都内核的缓冲页作传送的。

       说到底,内存映射就是映射到内存,读写的始终是内存而不是设备IO,之所以会有作用,是因为内核帮我们操作转化了。

       内存映射的实现是在内核空间的,如ioremap将设备IO映射到某内核空间上,mmap通过建页表使设备的IO映射的用户空间上。

       在用ioremap之前,一般都要使用申请IO端口/内存子资源函数(request_region()和request_mem_region())。两个函数使用的都是物理地址,目的是为检测这段物理的在当前是否已经被使用。

       具体实现过程如下:若是申请IO端口,调用__reques_region(&ioport_resource, start,size,name),其中那ioport_resource是为根结点,内核把所有IO端口资源都挂载到其下,这颗树称为IO端口资源树,内核。在通过常规性的检错后,遍历资源树,看所申请的IO端口资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值