转载:

request_mem_region,ioremap 和phys_to_virt()  

Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏:
(1)request_mem_region()宏,请求分配指定的I/O内存资源。
(2)check_mem_region()宏,检查指定的I/O内存资源是否已被占用。
(3)release_mem_region()宏,释放指定的I/O内存资源。
       这三个宏的定义如下: 
#define request_mem_region(start,n,name)   __request_region(&iomem_resource, (start), (n), (name)) 
#define check_mem_region(start,n)              __check_region(&iomem_resource, (start), (n)) 
#define release_mem_region(start,n)           __release_region(&iomem_resource, (start), (n)) 
其中,参数start是I/O内存资源的起始物理地址(是CPU在RAM物理地址空间中的物理地址),参数n指定I/O内存资源的大小。在请求IO内存资源成功后,开始用ioremap进行映射操作。

void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问。入口:phys_addr是要映射的起始的IO地址;size是要映射的空间的大小;flag是要映射的IO空间的和权限有关的标志; 
      实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM中,最后申请一个 vm_area_struct结构,调用remap_area_pages填写页表,若填写过程不成功则释放申请的vm_area_struct空间;根据虚拟地址和欲映射的物理地址修改页表,之后内核就可以用这个虚拟地址来访问映射的物理地址了。
      对于直接映射的I/O地址ioremap不做任何事情(比如不带MMU的Uclinux中就直接返回物理地址) 。有了ioremap(和iounmap),设备就可以访问任何I/O内存空间,不论它是否直接映射到虚拟地址空间。但是,这些地址永远不能直接使用(像kmalloc返回的地址那样用),而要用readb这种函数。

/***********************************************************************/

同样是从物理地址分配得到虚拟地址,还有以下这个函数:phys_to_virt()实际地址转换成虚拟地址,两者是有区别的。用ioremap  phys_to_virt 做物理地址于虚拟地址转换发现:

addr = (unsigned int volatile *)ioremap(0x56000088,12);
printk(KERN_ALERT"%x\n",addr);
addr = (unsigned int volatile *) phys_to_virt(0x56000088);
printk(KERN_ALERT"%x\n",addr);
两个函数返回addr值不一样。原因在于:
(1)在内核中phys_to_virt只是给地址减去一个固定偏移 :
#ifndef __virt_to_phys
#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
#endif
注意:PHYS_OFFSET =0x50000000,在带MMU内核中,PAGE_OFFSET是0xc0000000;不带MMU内核中,与PHYS_OFFSET 同。
(2)而ioremap()原则就是内核会根据指定物理地址新建映射页表,物理地址虚拟地址关系就由这些页表来搭建!:
这个从ioremap函数体可以看出来。

参考原文:http://blog.csdn.net/fuyjlu/archive/2009/12/20/5039782.aspx
参考原文:http://blog.csdn.net/xdicac/archive/2009/10/30/4743708.aspx

参考原文:http://blog.csdn.net/unbutun/archive/2009/08/28/4488768.aspx

request_mem_region,ioremap 和phys_to_virt()的更多相关文章

  1. I/O空间映射

    转自:http://www.cnblogs.com/hydah/archive/2012/04/10/2232117.html 注:部分资料和图片来源于网络,本文在学习过程中对网络资源进行再整理. I ...

  2. MMIO和PIO

    1.概念 内存映射I/O(MMIO)[统一编址]和端口映射I/O(PMIO)[独立/单独编址]是两种互为补充的I/O方法,用于设备驱动程序和设备通信,即在CPU和外部设备之间. (1)在MMIO中,内 ...

  3. linux中的 IO端口映射和IO内存映射

    参考自:http://blog.csdn.net/zyhorse2010/article/details/6590488 CPU地址空间 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬 ...

  4. i2c子系统

    linux内核的I2C驱动框架总览(1)I2C驱动框架的主要目标是:让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,从而可以更容易的在linux下驱动自己的I2C接口硬件(2)源码中I2 ...

  5. <摘录>io端口和io内存

    linux中的 IO端口映射和IO内存映射 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 ...

  6. Linux网卡驱动(4)—DM9000网卡驱动程序完全分析

    1.硬件连接 mini2440开发板上DM9000的电气连接和mach-mini2440.c文件的关系 其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x200000 ...

  7. 内核request_mem_region 和 ioremap的理解

    request_mem_region仅仅是linux对IO内存的管理,意思指这块内存我已经占用了,别人就不要动了,也不能被swap出去.使用这些寄存器时,可以不调用request_mem_region ...

  8. request_mem_region 与 ioremap【转】

    转自:http://blog.csdn.net/alada007/article/details/7700125 如果从根本上说起的话应该从Intel的处理器芯片与其它的芯片的不同说起,与这两个函数相 ...

  9. 内核request_mem_region 和 ioremap的理解【转】

    转自:http://blog.csdn.net/skyflying2012/article/details/8672011 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. 几乎每一种 ...

随机推荐

  1. 大话设计模式之PHP篇 - 简单工厂模式

    假设有一道编程题:输入两个数字和运算符,然后得到运算结果.非常简单的一道题目,通常的实现代码如下: <?php Function Operation($val1, $val2, $operate ...

  2. INSPIRED启示录 读书笔记 - 第21章 产品验证

    证明产品的价值.可用性.可行性 产品验证是指在正式开发.部署产品前,验证产品说明文档描述的产品是否符合预期要求 产品经理向产品团队提供最终的产品说明文档前,需要进行三项重要验证 1.可行性测试:明确在 ...

  3. [RK3288][Android6.0] 调试笔记 --- user版本默认显示开发者选项【转】

    本文转载自:https://blog.csdn.net/kris_fei/article/details/70157137 Platform: ROCKCHIPOS: Android 6.0Kerne ...

  4. 用PyDev、eclipse搭建Python开发环境

    一 Eclipse for python环境搭建 ①下载原生Eclipse,可以直接百度Eclipse,在百度软件中心下载  ②下载完后,打开软件,选择第一个安装即可  ③安装完成后,打开eclips ...

  5. navigationBar

    1.navigationBar导航条可以看做是self.navigationController导航控制器的一个属性. 通过self.navigationController.navigationBa ...

  6. cms实例笔记(二)

    栏目分级: 一.首页 二.解决方案 (栏目) 1.栏目模型 名称: 新闻: 封面模板:cover.html (没有子栏目模型不会用到) 列表页模板:list.html 2.文档模型 名称:新闻 模板: ...

  7. Q&A:string、vector、iterator、bitset

    细节要点 getline(cin,string)与cin>>string 在VS2013中通过输入换行符\n,对getline以及cin的用法进行测试,但是并没有像文中所述遇到换行符停止读 ...

  8. CruiseControl初探

    一.背景 CruiseControl从<项目自动化之道>这本书中了解到,然后又从网上查资料做了一定尝试.同时,项目持续集成这部分我也计划在自己参与的项目上先试点实行,才有了这篇文章. 二. ...

  9. cassandra cqlsh 和 python客户端

    Keyspaces A cluster is a container for keyspaces. A keyspace is the outermost container for data in ...

  10. JS内存知识点汇总

    废话片: 讲到内存可以联想到很多,内存分配管理,内存回收机制,内存泄露等等,今天我们就来答题的总结一下. 正文片: 1.内存分配管理 2.内存回收机制 3.内存泄露 一.内存分配管理 首先让我们看看内 ...