免费注册 查看新帖 |

Chinaunix

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

[内存管理] alloc_pages 申请的高端内存如何映射呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-05 10:49 |显示全部楼层 |倒序浏览
本帖最后由 qq1158291633 于 2014-08-05 10:52 编辑

alloc_pages 申请的高端内存如何映射呢
kmap貌似只能映射一个物理页,
但是我要连续的,比如我用alloc_pages 申请1M大小的物理页,如何将它映射到1M的连续的虚拟地址空间呢

win内核下的申请步骤是,1:申请物理页面,2:申请虚拟地址空间,3:将物理页面和虚拟地址空间映射起来
不知道linux下的步骤是怎样的
求高人解答

论坛徽章:
0
2 [报告]
发表于 2014-08-05 15:38 |显示全部楼层
回复 2# super皮波


    vmalloc 是内核自己进行映射的,我不能采用这种方式啊,毕竟32位系统虚拟地址空间是有限的,
    windows里面我采用的方式是,申请一片固定的虚拟地址空间(vBase-vSize,这段虚拟地址空间默认是没有映射到任何物理页的),
   然后申请n*vSize大小的物理页面,保存在一个数组pages[n]中,当要访问某一块物理页面时,用先申请的虚拟地址空间去映射,访问完取消映射。
这样一个vSize大小的虚拟地址空间,就可以访问任意大小的n*vSize大小的物理页面了。

linux中应该也是需要自己去管理物理页的映射才行,不能让内核自己去映射,
但是不找不到很好的方式。

论坛徽章:
0
3 [报告]
发表于 2014-08-05 15:41 |显示全部楼层
humjb_1983 发表于 2014-08-05 11:43
32位系统中,内核的虚拟地址空间非常有限,仅保留了3G+896M--4G之间的128M用于映射高端内存,就只有vmalloc ...


我要实现的功能 其实就跟32位kennel 预留的那128M地址空间的功能类似,
就是用固定大小的地址空间去访问任意大小的物理内存(当然不能超过cpu的寻址范围)

论坛徽章:
0
4 [报告]
发表于 2014-08-05 16:14 |显示全部楼层
回复 6# super皮波


    是的 win下是有对应的api
linux下就找到一个kmap函数,但是一次只能映射一个物理页

论坛徽章:
0
5 [报告]
发表于 2014-08-05 17:37 |显示全部楼层
super皮波 发表于 2014-08-05 16:43
没搞懂你为什么就抓住这128M虚拟空间不放,为什么必须使用这128M的虚拟地址空间?
如果你是在用户态的话, ...


驱动模块里面做缓存使用,而且申请量可能达到2~3g
而且做缓存一般都是直接使用物理内存的,很少有人去用虚拟内存(避免自己的算法被kernel的分页算法干扰)

不知道你有没有做过类似win下的super cache之类的缓存软件,做过就知道为什么要申请物理内存,自己去映射了,
不管是win下还是linux下kernel共享的地址空间就那么多,如果申请的每块内存都映射了,会导致kernel虚拟地址空间不足,
导致一些模块工作不正常。
只能用固定的地址空间去映射不同块的物理页面才能避免这个问题。

这点linux和win内核的原理是一样的

论坛徽章:
0
6 [报告]
发表于 2014-08-05 17:58 |显示全部楼层
回复 10# humjb_1983


    我需要的虚拟地址空间不多,4M足以,
    物理页面也是按照4M一个块来申请

  然后用这个4M的地址空间去映射不用的物理内存区域

  但是kmap一次只能映射一个页,这样的话 效率就太低下了,
  我需要的函数是一次性能将一定大小的虚拟地址空间和物理页映射起来的函数(1M,2M。。都行)

不知道linux下有没有可以直接使用的函数

要是非要自己去操作页表相关结构体,那就太麻烦了

论坛徽章:
0
7 [报告]
发表于 2014-08-05 17:59 |显示全部楼层
qq1158291633 发表于 2014-08-05 17:58
回复 10# humjb_1983


vmalloc不行的

论坛徽章:
0
8 [报告]
发表于 2014-08-05 18:53 |显示全部楼层
humjb_1983 发表于 2014-08-05 18:25
我的意思不是直接使用vmalloc,而是使用vmalloc区中的内存区,因为内核的虚拟地址空间已经划分完了
0-89 ...


恩 我试试,如果linux kernel真是开始就将虚拟地址空间用完,那这种做法真是好奇葩啊

像windows下面这种使用时申请,感觉对程序员更加友好

论坛徽章:
0
9 [报告]
发表于 2014-08-06 09:58 |显示全部楼层
回复 17# humjb_1983


    恩 我看看

论坛徽章:
0
10 [报告]
发表于 2014-08-06 09:59 |显示全部楼层
Tinnal 发表于 2014-08-05 23:16
回复 9# qq1158291633


非常感谢 这个正是我想要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP