免费注册 查看新帖 |

Chinaunix

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

[内存管理] 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下的步骤是怎样的
求高人解答

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-08-05 11:23 |只看该作者
回复 1# qq1158291633
你说的这个请求应该是vmalloc,vmalloc申请到的物理内存不能保证连续,虚拟地址上是连续的,大概的虚拟空间为接近120M

申请的过程为
1.调用vmalloc,分配空间,写内核的全局页表
2.处理缺页异常

大概是这样

   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-08-05 11:43 |只看该作者
32位系统中,内核的虚拟地址空间非常有限,仅保留了3G+896M--4G之间的128M用于映射高端内存,就只有vmalloc、kmap和固定映射的方式,后两种应该只能映射一页,vmalloc如楼上所说。。。

论坛徽章:
0
4 [报告]
发表于 2014-08-05 15:38 |只看该作者
回复 2# super皮波


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

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

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


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

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
6 [报告]
发表于 2014-08-05 15:42 |只看该作者
回复 4# qq1158291633
你的意思是先通过alloc_pages申请高端内存,然后修改进程的页表?

   

论坛徽章:
0
7 [报告]
发表于 2014-08-05 16:14 |只看该作者
回复 6# super皮波


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

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
8 [报告]
发表于 2014-08-05 16:43 |只看该作者
没搞懂你为什么就抓住这128M虚拟空间不放,为什么必须使用这128M的虚拟地址空间?
如果你是在用户态的话,直接malloc就行,用户空间申请的内存会优先从高端内存中分配
如果是内核态的话,好像没有办法保证你说的这点(就是用固定大小的地址空间去访问任意大小的物理内存)

你问问humjb_1983 他是大拿,我也跟着学习学习

论坛徽章:
0
9 [报告]
发表于 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内核的原理是一样的

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-08-05 17:45 |只看该作者
qq1158291633 发表于 2014-08-05 15:41
我要实现的功能 其实就跟32位kennel 预留的那128M地址空间的功能类似,
就是用固定大小的地址空间去访 ...

关键是内核的虚拟地址空间已经用完了,没有多余的给你用了,你要用的估计只能用vmalloc区中的vm_area,然后自己进行映射,但空间也不多。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP