免费注册 查看新帖 |

Chinaunix

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

[内存管理] 在较新的内核使用mmap映射dev/mem不成功的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-28 21:42 |只看该作者 |倒序浏览
http://bbs.chinaunix.net/thread-2027090-1-1.html
今天按照上面这个链接的示例,做了一些修改,试了一下使用mmap映射/dev/mem文件,目的是在用户态使用指定的物理内存区域
mmap(0, phymem_size, PROT_READ|PROT_WRITE, MAP_SHARED, map_fd, phymem_addr);
phymem_addr是物理内存地址,我试了一下,这个值不能太大,大于1M左右,就mmap不成功了。使用的内核版本是3.10

我搜索了一下,看到一个说法,新的内核对这个/dev/mem已经做了一些限制了,导致不能映射了,不知道是不是这个原因。

如果是这样,请教大家一下,现在有什么办法方便映射一块物理内存。目前,我从网上搜索了一下,大概有这么一个思路,望高手指定一下:

就是想增加一个驱动设备,在其打开的时候,在内核申请一些物理内存,同时remap一下这个文件,感觉就像强写一下页表,目录一样。但感觉
这个方法没有使用dev/mem方便。
参考:http://blog.sina.com.cn/s/blog_510ac74901016ozh.html

再次列一下我的问题:
1)现在新内核是否还可以突破dev/mem的映射,这个方法比较方便?
2)有没有什么比较方便的办法在内核和用户态共享内存

谢谢各位!

论坛徽章:
0
2 [报告]
发表于 2014-07-28 22:42 |只看该作者
新内核如果发现是RAM则不会允许映射,这个不管你配置CONFIG_STRICT_DEVMEM与否都绕不过去。
在驱动里remap_pfn是可行的

论坛徽章:
0
3 [报告]
发表于 2014-07-28 23:17 来自手机 |只看该作者
几个月前在3.12内核上调试还是正常的,只不过现在都64位了,对我而言,这个/dev/mem直接用read write接口就能访问全地址空间了,我试过64位下mmap和read,write都行,之前用32位比较多,对于pci空间,非mmap不能访问。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2014-07-29 08:50 |只看该作者
回复 1# tsinhi
2.6.27内核以后,是不允许直接mmap /dev/mem的。需要CONFIG_X86_PAT=n允许mmap,同时需要CONFIG_STRICT_DEVMEM=n允许映射内核空间。
CONFIG_X86_PAT需要在选项CONFIG_EMBEDED=y的情况下,才能进行操作

   

论坛徽章:
0
5 [报告]
发表于 2014-07-29 09:40 |只看该作者
回复 4# 瀚海书香

CONFIG_X86_PAT选项指的是什么意思?
   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
6 [报告]
发表于 2014-07-29 11:50 |只看该作者

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
7 [报告]
发表于 2014-07-29 15:59 |只看该作者
瀚海书香 发表于 2014-07-29 08:50
回复 1# tsinhi
2.6.27内核以后,是不允许直接mmap /dev/mem的。需要CONFIG_X86_PAT=n允许mmap,同时需要 ...


linux为什么要这么穷折腾?




曾经某一个状态── 是否现在也如此我就不知道了── 同一个ram地址, 用lseek + read/write就可以访问, mmap就不行。


如果借口是安全, 那也未免太搞笑了: 能read/write、不能mmap就安全了?

论坛徽章:
0
8 [报告]
发表于 2014-07-29 21:37 |只看该作者
帅绝人寰 发表于 2014-07-29 15:59
linux为什么要这么穷折腾?

我也觉得

论坛徽章:
0
9 [报告]
发表于 2014-07-29 21:38 |只看该作者
guobamantou 发表于 2014-07-28 23:17
几个月前在3.12内核上调试还是正常的,只不过现在都64位了,对我而言,这个/dev/mem直接用read write接口就 ...

直接用read,write是指直接read,write /dev/mem这个文件吗?我也试过,使用cat /dev/mem好像也能打印很多。

论坛徽章:
0
10 [报告]
发表于 2014-07-30 23:03 |只看该作者
本帖最后由 guobamantou 于 2014-07-30 23:08 编辑
tsinhi 发表于 2014-07-29 21:38
直接用read,write是指直接read,write /dev/mem这个文件吗?我也试过,使用cat /dev/mem好像也能打印很多。 ...


是的,64位内核中由于地址空间不是问题,对/dev/mem直接read,write就能访问全物理地址空间,
mmap /dev/mem结点然后读某偏移和直接open然后read这个fd的某偏移效果是一样的。
32位的时候由于normal区的空间是896M,因此对于/dev/mem的read/write只能访问前896M的物理地址,其余物理地址用mmap映射后访问。

使用read/write能访问多大空间可通过
dd if=/dev/mem of=xxx (skip=xxx ibs=xxx)这样的命令验证,
32位都是不到896M,64位下和/proc/iomem的最大物理地址相同(比如我手头的机器最大物理地址是6G处,/dev/mem就能read出6G的大小)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP