免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4434 | 回复: 12

关于内存映射的一个奇怪现象 [复制链接]

论坛徽章:
0
发表于 2010-09-14 20:54 |显示全部楼层
1、Intel平台X86下设备要用一段大内存,怕起来后分不出大内存,所以在内核初始化时,直接分出相应的内存,是通过alloc_bootmem_pages分的。
然后在设备驱动用,通过dma_map_single得到dma地址,供设备使用,结果发现这段内存设备无法使用。

2、换成在设备驱动中通过__alloc_free_pages分小段内,再通过dma_map_single得到dma地址,供设备使用,这样这段内存设备可以正常使用。

3、我又试了第1种方式,将内存减少,结果还是不行。

我比较困惑的是:
  是不是建立映射方式有问题,还是alloc_bootmem_pages得到的内存无法供外设使用。

论坛徽章:
0
发表于 2010-09-14 23:39 |显示全部楼层
高人快快现身!!

论坛徽章:
0
发表于 2010-09-15 09:34 |显示全部楼层
结果发现这段内存设备无法使用。
回复 1# kgd7558


    无法使用时什么意思? 是因为,使用kmalloc等slab分配不到大的连续内存,所以才使用alloc_bootmem_pages吧,文件系统中的dentry的cache就是这么分配的。如果分配的内存不是在zone_dma,通过dma_map_single得到的DMA地址也可以使用吗?

论坛徽章:
0
发表于 2010-09-15 09:47 |显示全部楼层
grub启动参数可以限制系统使用的内存,mem=XXX。

论坛徽章:
0
发表于 2010-09-15 10:14 |显示全部楼层
回复 4# zyr-linux

在grub中预留内存是可以的。我试过。不过不能这么用,因为启动时要动态计算一下设备需要的大小,不是固定的。

论坛徽章:
0
发表于 2010-09-15 11:33 |显示全部楼层
本帖最后由 kgd7558 于 2010-09-15 11:41 编辑

回复 3# kgn28


    可能是你说的原因,我再看看代码。这种方式分配的内存,这段内存应该就不是内存管理里的。
    可是我又试了一下,还是在启动时分配,但不用dma_map_single映射,我直接用virt_to_phys取出物理地址给外设,发现还是一样不行。
    我理解是只要给外设段物理连续的空间应该是可以。不知道是我理解有问题还是取物理地址有问题?

论坛徽章:
0
发表于 2010-09-15 13:21 |显示全部楼层
请高手支招,

    我直接通过virt_to_phys拿出物理地址,供外设使用行不?

论坛徽章:
0
发表于 2010-09-15 13:27 |显示全部楼层
回复 7# kgd7558


    你是32位还是64位?,32位内核,外设可以使用zone_dma(32M)以外的内存?

论坛徽章:
0
发表于 2010-09-15 18:18 |显示全部楼层
回复 8# kgn28


    64位的系统,对dma内存没有限制吧?

论坛徽章:
0
发表于 2010-09-15 18:25 |显示全部楼层
回复 9# kgd7558


    那就应该没有,64为的zone_dma有4G,你的内存没这么大吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP