免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7735 | 回复: 1
打印 上一主题 下一主题

[内存管理] IO_ADDRES和使用ioremap的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-08 10:03 |只看该作者 |倒序浏览
本帖最后由 testh 于 2012-11-08 10:22 编辑

使用的是arm9核心的soc。在头文件中有 #define XXX_BASE   IO_ADDRESS(0x6000000),其中,0x60000000是datasheet中的物理地址。
#define IO_ADDRESS(x)      ((x)&0x0fffffff)+0xf0000000)

我在driver中使用
base=ioremap(0x60000000,size);
writel(val,base+offset);
read(base+offset)
这样操作的时候就可以把数值写进0x60000000寄存器,也可以读出来。

刚才经过实际测试,使用IO_ADDRESS(0x60000000)这个转换后的地址作为read()/write()参数中的address值对寄存器进行读写操作也是可以正常读写寄存器的。但是这两个有什么不一样吗?
一个是静态的,一个是动态的?
应该不是简单对0x60000000这样的地址作偏移就可以的,肯定是事先在哪里进行过了“注册”或者类似的操作通知了kernel,但是一直没有找到相应的源码在哪里? 望知道的兄弟能够给予指点。先谢了。

论坛徽章:
0
2 [报告]
发表于 2012-12-20 16:55 |只看该作者
IO_ADDRESS和ioremap的区别:
1、线性地址不同。
IO_ADDRESS采用预先固定的高端线性地址和指定的物理地址建立映射(即为其创建页表项)。
ioremap是先从vmlist链表里头分配一块线性地址,并将该线性地址和指定的物理地址建立映射(即为其创建页表项)。

2、建立映射关系时间点不同。
IO_ADDRESS是在系统启动阶段通过paging_init函数里头调用mdesc->map_io()完成其映射关系的。
ioremap是在调用该函数的时候建立其映射关系的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP