免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] 关于/dev/mem的疑问 [复制链接]

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-22 21:35 |只看该作者 |倒序浏览
使用物理地址,个人目前所知的有两种方法。
一. 内核驱动, ioremap
    内核驱动中挂接私有的mmap系统调用,使用ioremap_nocache建立页表。
    我现在一般都是用这种方式实现 非cache 访问的场景。

二. 用户驱动,/dev/mem,我之前一直认为这种方式只能实现 cache 场景。
    这种最简单了,不用写内核驱动,
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    addrv = mmap(...)

问题是,
1. O_SYNC 标识字面解释是 等待硬件IO操作结束。
    对于卡、盘等块设备,那么就是不使用buffer,直接读写块。
   对于内存,是否可以认为是 非cache 属性了呢?

2. /dev/mem 是否全地址空间,而不仅仅是 DDR 地址空间。

大家都是怎么使用一段物理地址空间的, cache 和 非cache。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2014-07-23 09:59 |只看该作者
内核中使用uncache,我一般用dma_alloc_coherent或dma_alloc_writecombine
内核中使用cache,就kmalloc就行了
我不喜欢对普通内存做ioremap这种方式来实现uncache,这种方法看上去很ugly

app使用uncache,open /dev/mem时设置O_SYNC
O_SYNC的具体意义,内核中的实现就是将对应的页表项设置为uncache的,看pgprot_noncached的实现就知道了





论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-07-23 19:56 |只看该作者
arm-linux-gcc 发表于 2014-07-23 09:59
内核中使用uncache,我一般用dma_alloc_coherent或dma_alloc_writecombine
内核中使用cache,就kmalloc就行 ...


为什么很ugly?
你说的应该是把系统内存搞成非cache.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-07-24 10:03 |只看该作者
回复 3# polejo


    在较新版本的内核中,根本不允许你对RAM做ioremap

__arm_ioremap_pfn_caller里面,有如下判断:
        /*
         * Don't allow RAM to be mapped - this causes problems with ARMv6+
         */
        if (WARN_ON(pfn_valid(pfn)))
                return NULL;

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP