在linux kernel 中,物理地址是不能直接使用的,必须通过转换才可以。

转换分为两种, 静态和动态。
静态就是下面那种,不过,静态的地址转换,还需要在kernel 初始化的时候作映射。 
动态映射是使用 ioremap 函数 。

[cpp] view plaincopy
  1. #define SL2312_GPIO_BASE  0x4D000000
  2. #define IO_ADDRESS(x)  (((X)&0x0fffffff)+(((x)>>4)&0x0f000000)+0xf0000000)
  3. #define GEMINI_GPIO_BASE1  IO_ADDRESS(SL2312_GPIO_BASE)

linux 有内存保护机制,无论是内核态还是用户态。 
静态映射 :是在物理地址上加一个偏移量, 所以虚拟地址是固定的。 
动态映射 :系统会生成一个虚拟地址对应到物理地址上,虚拟地址不是固定的。

linux在初始化运行时会根据一个map_desc的数组中的物理地址进行静态映射,0x4D000000地址应该就是这样映射的。
静态映射的地址无须使用icoremap函数,只要知道在map_desc数组中物理地址与虚拟地址的移仿就可以了。 
至于驱动程序中关于物理地址是不是都要转换呢,这个是当然的,linux是运行在虚拟地址的。
任何程序不能访问物理地址,都必须转换为物理地址才能访问。只不过,在内核空间已经是转换好了的(如前所述),可以随便的访问。

动态映射是由Linux内核统一管理,当使用kmalloc(分配在内核空间)和malloc函数申请时,内核会找到一块空余的物理内存,并在页表中动态地添加一项其与虚拟地址对应的表项。 
静态映射那应该就是LINUX在初始化阶段读取map_desc数组进行的地址映射,map_desc中包括了一对对的物理地址和虚拟地址的对应关系,这个可以根据硬件修改,其中的虚拟地址必须是内核空间的,例如,SDRAM的物理是0x30000000 那么可以将其映射为0xe0000000. 通过静态映射后的地址一般之后就不会更改了的,除非你想办法改掉。

注:以上均摘自论坛,仅供参考,不对的请指正,谢谢!

linux驱动中地址空间转换相关推荐

  1. Linux设备驱动开发-linux驱动中的阻塞访问方式

    阻塞与非阻塞是设备访问的两种不同的模式.什么是阻塞操作呢?其是指在执行设备操作的时候,如果不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.而非阻塞操作则是在进程不能进行设备操作时,并不挂起到 ...

  2. linux probe函数调用,【整理】Linux驱动中,probe函数何时被调用

    [整理]Linux驱动中,probe函数何时被调用 用SourceInsight跟踪: 从driver_register看起,此处我的这里是: int driver_register(struct d ...

  3. Linux驱动中,probe函数何时被调用

    最近看到linux的设备驱动模型,关于Kobject.Kset等还不是很清淅.看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时 ...

  4. linux platform匹配机制,Linux驱动中的platform总线详解

    platform总线是学习linux驱动必须要掌握的一个知识点. 一.概念 嵌入式系统中有很多的物理总线:I2c.SPI.USB.uart.PCIE.APB.AHB linux从2.6起就加入了一套新 ...

  5. linux驱动中使用定时器

    我的内核是2.4.18的.Linux的内核中定义了一个定时器的结构: #include<linux/timer.h> struct timer_list { structlist_head ...

  6. linux驱动中probe函数是怎么调用的

    linux驱动的三个概念:设备.驱动.总线 probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数 probe函数被调用后,系统就调用platform设备的probe函数完成 ...

  7. Linux驱动中按键消抖原理

    为什么要用定时器来做按键消抖? 用到按键就要处理因为机械结构带来的按键抖动问题,也就是按键消抖.前面的实验中都是直接使用了延时函数来实现消抖,因为简单,但是直接用延时函数来实现消抖会浪费 CPU 性能 ...

  8. Linux驱动中delayed workqueue用法

    在驱动中,有时不能使用中断(这种情况很少遇到), 此时delayed_workqueue就可以发挥其巨大的功效了.也可以用其它同类的内核API实现:如timer.delayed_workqueue就相 ...

  9. 【整理】Linux驱动中,probe函数何时被调用

    声明:以下主要内容参考自: 关于struct device_driver结构中的probe探测函数的调用 http://blog.chinaunix.net/u2/71164/showart.php? ...

最新文章

  1. 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片
  2. 孩子,来生我们一起走
  3. Spring Cloud【Finchley】-15 查看Zuul的路由端点和过滤器
  4. 【转】使用 lsof 查找打开的文件
  5. 数据库课程设计结论_结论:
  6. stream of java_Java 8 新特性-Stream更优雅的处理集合入门
  7. Tomcat映射虚拟目录的三种方式(2021版)
  8. 字幕 Subtitle
  9. c语言 调用md5sum,使用MD5SUM检查文件
  10. CentOS 7.3安装详解
  11. Spring boot 文件下载乱码问题
  12. 雷达信号处理&重学傅里叶变换(一):Radar cube &multidimensional Fourier transform
  13. python半径为2.11的圆球的体积_Python科学计算神器之Numpy-2
  14. 推荐系统第3、4周笔记
  15. 指针和指针变量的区别
  16. Keil中取消结构体对齐的方法
  17. 本分初心,vivo以科技之力守护“唯一的地球”
  18. 我现在明白为什么嘉立创SMT有些BOM单元件搜不到,但是在立创商城可以搜到,一些直插类元件如排针没法SMT的。
  19. 《大学“电路分析基础”课程实验合集.实验二》丨节点电位与电路电压的研究
  20. 大二男生跳楼身亡留遗书称沉迷网游压力大

热门文章

  1. Build 2016: 发布明天的云创新来服务今天的开发者
  2. SQL递归查询(with as)
  3. CMFCRibbonStatusBar中添加图片按钮
  4. 上架相关——App Store 上架流程
  5. 第六次作业(C语言)
  6. Java中九大内置对象
  7. gcc,cc,g++,CC的区别
  8. 配置zentaophp
  9. hadoop streaming编程小demo(python版)
  10. 4源代码的下载和编译