免费注册 查看新帖 |

Chinaunix

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

[内存管理] 关于Ioremap的疑问 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-17 10:10 |只看该作者 |倒序浏览
5可用积分
本帖最后由 chishanmingshen 于 2013-03-17 19:04 编辑

Based on this discussion, you might also want to map addresses returned by ioremap to user space. That would be a mistake, however; addresses from ioremap are special and cannot be treated like normal kernel virtual addresses. Instead, you should use remap_pfn_range to remap I/O memory areas into user space.



Ldd3这段如何理解?请指点,谢谢!

最佳答案

查看完整内容

尝试这样理解:1. 这里说的normal kernel virtual addresses理解为直接物理RAM映射而来,启动过程决定,运行时不可更改,可重映射2. ioremap得到的地址是内核空间vmalloc区,运行时映射得到地址、取消映射后该地址可被其它映射使用,该地址不可重映射

论坛徽章:
0
2 [报告]
发表于 2013-03-17 10:10 |只看该作者
尝试这样理解:
1. 这里说的normal kernel virtual addresses理解为直接物理RAM映射而来,启动过程决定,运行时不可更改,可重映射
2. ioremap得到的地址是内核空间vmalloc区,运行时映射得到地址、取消映射后该地址可被其它映射使用,该地址不可重映射

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-03-17 10:23 |只看该作者
本帖最后由 chishanmingshen 于 2013-03-17 12:16 编辑

求解,为何不能用ioremap?谢谢!

论坛徽章:
0
4 [报告]
发表于 2013-03-17 16:47 |只看该作者
ioremap 返回的是内核空间vmalloc区的地址,不是一一映射的

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-03-17 17:26 |只看该作者
本帖最后由 chishanmingshen 于 2013-03-17 17:50 编辑

不是一一对应的? 可是io就是一个连续的物理地址空间啊。

ioremap():
        if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot))
                goto err_free_area;

还是不大明白,请指点,谢谢。。。

另外,用get_user_pages()也ok吧?

回复 3# aweii


   

论坛徽章:
0
6 [报告]
发表于 2013-03-17 18:01 |只看该作者

LDD

本帖最后由 aweii 于 2013-03-17 18:10 编辑

我的意思是不是__va(phy_addr)这种对应方式
LDD3说的是ioremap()吧,是映射到内核空间的
remap_pfn_range()是映射到用户空间的

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-03-17 19:03 |只看该作者
本帖最后由 chishanmingshen 于 2013-03-17 19:07 编辑

回复 5# aweii

你说的我明白,可是跟我的问题好像联系不上,还是不解啊。。。

addresses from ioremap are special and cannot be treated like normal kernel virtual addresses.
就是说得到的是内核虚拟空间,只是特殊。

我的疑问是为啥特殊?请指点迷津。。。

   

论坛徽章:
0
8 [报告]
发表于 2013-03-17 20:38 |只看该作者
“special and cannot be treated like normal kernel virtual addresses”

对于ARM来说,ioremap返回的虚拟地址在PTE中的属性是MT_DEVICE. 即,通过该虚拟地址访问物理页是uncacheable的。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2013-03-18 15:48 |只看该作者
@bluecker

7楼说得有道理,我也理解了,但是我不确认是不是这个原因,呵呵。。。

论坛徽章:
0
10 [报告]
发表于 2013-03-19 22:55 |只看该作者
ioremap通常会在驱动程序里面调用,例如一个pci设备经过ioremap后得到的地址是内核虚地址,在内核模式下能够直接访问的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP