版权声明:欢迎转载,转载请注明出处 http://blog.csdn.net/lizuobin2/

ioremap 写驱动最常用的函数之一,但是对它始终一知半解,看了内核关于这部分的代码,功力不够也是一头雾水。本文通过实验的方法,了解 ioremap 到底干了些啥,本文献给那些看不懂内核源代码,还想知道 ioremap 能干些什么,干了些什么的同学。

实验方法:

点灯实验,LED接在GPB5~8,因此需要使用 gpbcon 配置,gpbdat 输出高低。
            gpbcon  0x56000010
            gpbdat  0x56000014
    下面,尝试了各种 ioremap 的方法测试,点灯 关灯 是否正常,点灯正常代表寄存器访问没问题。

1、字节映射还是页映射?
    gpbcon = (volatile unsigned long *)ioremap(0x56000010, 1);
    gpbdat = gpbcon + 1;
    测试结果,点灯正常,虽然只映射一个字节,但是 gpbcon、gpbdat 使用虚拟地址时可以访问到物理地址,因此是页映射

2、同一页的 映射的物理地址之前的地址是否也映射了?
    gpbdat = (volatile unsigned long *)ioremap(0x56000014, 1);
    gpbcon = gpbdat - 1;
    测试结果,点灯正常,虽然只映射了1个字节,但是之前的地址也可以访问到对应的物理地址,因此,该物理地址所在的页,全都都进行了映射

3、同一页内,重复映射会怎样?
    gpbcon = (volatile unsigned long *)ioremap(0x56000010, 1);
    gpbdat = (volatile unsigned long *)ioremap(0x56000014, 1);
    temp =   (volatile unsigned long *)ioremap(0x56000014, 1);
    printk("gpbcon: %x\n", gpbcon);
    printk("gpbdat: %x\n", gpbdat);
    printk("  temp: %x\n",   temp);
    输出:
        gpbcon: c483c010
        gpbdat: c4840014  
        temp:   c4844014
    测试结果:
        程序依旧正常运行,但是输出的 gpbcon、gpbdat 虚拟地址不连续!即使是相同的物理地址 ioremap 得到的虚拟地址不相等

1、那么,gpbcon + 1 也就是 c483c014 是不是也对应于 gpbdat的物理地址呢?
        gpbcon = (volatile unsigned long *)ioremap(0x56000010, 1);
        gpbdat = (volatile unsigned long *)ioremap(0x56000014, 1);
        temp =   (volatile unsigned long *)ioremap(0x56000014, 1);
        printk("gpbcon: %x\n", gpbcon);
        printk("gpbdat: %x\n", gpbdat);
        printk("  temp: %x\n",   temp);
        gpbdat_temp = gpbcon + 1;
    测试 虚拟地址gpbdat_temp 、gpbdat 是不是都能访问到 gpbdat 的物理地址。 
    输出:
        gpbcon: c484a010
        gpbdat: c484e014  
        temp:   c4852014
    测试结果:
    1、神奇,程序正常运行,也就是说通过 虚拟地址 c484e014 或者(c484a010 + 4) 都能访问到 gpbdat 的物理地址!
    因此,如果两个物理地址位于同一页,我们是没必要去两次ioremap的,1次就够了,而且两次会浪费掉一页虚拟空间。
    2、 推理,我通过ioremap temp 得到的虚拟地址也可以访问到 gpbdat 的物理地址。
        我通过ioremap temp 得到的虚拟地址 -4 也可以访问到 gpbcon 的物理地址。

4、重复映射了,如何iounmap ?
    gpbcon = (volatile unsigned long *)ioremap(0x56000010, 1);
    gpbdat = (volatile unsigned long *)ioremap(0x56000014, 1);
    temp =   (volatile unsigned long *)ioremap(0x56000014, 1);
    printk("gpbcon: %x\n", gpbcon);
    printk("gpbdat: %x\n", gpbdat);
    printk("  temp: %x\n",   temp);
    iounmap(gpbcon);
    iounmap(gpbdat);
    iounmap(temp);
    测试:程序正常,没有崩溃。
        ioremap 可以有多个虚拟地址对应于一个物理地址,iounmap时相互不受影响。
    猜测:iounmap(gpbcon + n);保证(gpbcon + n 与 gpbcon在同一页)应该也可以释放掉gpbcon,没有测试。

结论:
    1、ioremap 按照页大小进行映射,而且是 整页 。
    2、ioremap 允许对一个物理地址进行多次映射,而且分配的虚拟空间地址各不相同(多个虚拟地址对应于同一个物理地址)。而且,ioumap相互不影响。

曾经疑惑的那些问题:
    1、我要是用一个寄存器,4个字节
        ioremap(0x56000010, 1);
        ioremap(0x56000010, 4);
    都能用?显然,都能用~页映射,该物理地址所在的页,已经全部被映射了。
    2、两个驱动程序,都要用到同一个寄存器,两次Ioremap,iounmap,会不会冲突啊?
        显然经过上边的实验,它们各自ioremap得到的虚拟地址不同,iounmap时只是把各地的虚拟地址释放了而已,相互不会产生影响。

实验探究 ioremap相关推荐

  1. 为了探究不同光照处理_浅谈中考物理实验探究易错题

    中考实验探究易错题主要在于伏安法实验和物质密度的测量.伏安法就是用电压表和电流表测量电阻或测量小灯泡的电功率的方法.伏安法测量电阻和测量电功率的实验是初中物理电学中重要的实验,也是每年中考实验探究题中 ...

  2. 为了探究不同光照处理_昭通2020名师助考? 丨掌握控制变量法轻松搞定中考物理实验探究题...

    当某个物理量由几个因素共同决定时,为了分别得出它与各个因素的关系,我们采用控制几个因素不变,只改变其中一个因素的实验探究方法叫控制变量法.通过这种方法得出的实验结论,一般表述为:当××一定时,××与× ...

  3. 小孔成像实验探究的软件_转载:探究小孔成像实验

    完成了多功能小孔成像仪的制作,我们运用变量控制法和比较法开始实验探究 一小孔的形状对像的影响 1.仪器与器材:小孔成像仪.插片(上有面积相同形状不同的小孔).皮尺. 2.观察物:读书亭. 3.实验步骤 ...

  4. 用c语言编程牛顿环实验,C语言下迈克耳孙干涉仪测量空气折射率的实验探究.pdf...

    C语言下迈克耳孙干涉仪测量空气折射率的实验探究.pdf 语言下迈克耳孙干涉仪测量空气折射率的实验探究 张之韬 李雪梅 ( 浙江海洋大学数理与信息学院 浙江 舟山 ) ( 收稿日期 ) 摘 要 通过压强 ...

  5. 小孔成像实验探究的软件_【亲子实验】科学小制作:神秘小潜艇科学小论文作品在科学课(小学版)2004年第5期发表,科学小发明潜水艇与沉浮子...

    kxxsy科学小实验 作者:王渔滨 湖南省资兴市 东江镇中心完小 科学兴趣小组 校园小记者 编者寄语 亲爱的同学们,尊敬的家长朋友们:亲子实验是以科学小实验.小制作.小发明和科学探究为主要内容的家庭科 ...

  6. 小孔成像实验探究的软件_探究小孔成像实验报告.doc

    探究小孔成像实验报告 探究小孔成像实验报告 提出问题 用易拉罐自制一个针孔照相机,在观察过程中,发现在室外观察景物时成像总不太清晰,有什么办法可增加清晰度呢.照相机半透膜上的图像会发生大小改变,这大小 ...

  7. 小孔成像实验探究的软件_小学科学小孔成像实验

    好文网为大家准备了关于小学科学小孔成像实验的文章,好文网里面收集了五十多篇关于好小学科学小孔成像实验好文,希望可以帮助大家.更多关于小学科学小孔成像实验内容请关注好文网.ctrl+D请收藏!篇一:四年 ...

  8. 小孔成像实验探究的软件_小孔成像法观察日食

    今天介绍一种不用专业眼镜或滤光片就能观测日食的方法十分适合低龄同学或懒人使用那就是大名鼎鼎的小孔成像 原理:光在同种均匀介质中,在不受引力作用干扰的情况下沿直线传播,即光的直线传播. 小孔成像,大约两 ...

  9. 小孔成像实验探究的软件_用易拉罐制作小孔成像装置小实验做法教程

    实验目的:了解光的传播方向和小孔成像原理. 实验材料: 1.锥子 2.透明胶条 3.烹调纸(可用半透明纸代替) 4.剪刀 6.硬卡纸(可用有一定硬度的纸代替) 实验步骤: 1.用剪刀把易拉罐的开口的一 ...

最新文章

  1. 面试官:说说Kafka处理请求的全流程
  2. Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化...
  3. c语言数码管连续加一,各位大神,如何用C语言实现在数码管上实现1234同时亮
  4. python程序怎么修改_python文件如何修改
  5. 数据库DBeaverEE 22.0.2
  6. ***X档案2007配套光盘
  7. .net 2.0安装包打不开_腾讯悄悄发布 Linux QQ,版本 2.0 Beta
  8. I2C 挂死,SDA一直为低问题分析
  9. cups支持的打印机列表_更完整的CUPS打印机状态原因列表
  10. greenplum(gp)postgre清理pg_xlog释放空间
  11. 连上hdmi后没有声音。
  12. win10安装Visual Studio 2019失败
  13. 计算机专业答辩开场白,毕业论文答辩开场白
  14. WordPress给博客文章页添加个性名片
  15. Hyper-V 和 VMWare 终于可以无缝共存、同时运行了
  16. 《Qt 学习之路 2》
  17. nginx通过获取环境变量实现动态IP代理配置
  18. java 网络爬虫_如何用Java实现网络爬虫
  19. Windows10编译CPU版OpenPose
  20. 隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

热门文章

  1. java集合:ArrayList
  2. 多线程:一些好的编程建议
  3. struts2异常ognl.MethodFailedException: Method setId failed for object
  4. html 子框架刷新,webpack 热更新 只对改变 CSS 有效 改变 HTML 页面会刷新 没用其他框架。...
  5. 计算机的磁盘地址格式,如何查看电脑硬盘是GPT分区还是MBR分区
  6. 读懂 | 路由器简史
  7. 小型数据中心规划和设计原则
  8. oracle供需平衡,OracleR12_MRP_功能介绍_V2.ppt
  9. 成功解决Exception unhandled ImportError DLL load failed: 找不到指定的程序。 lib\imp.py, Line: 343
  10. ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)+预测新数据得分