免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: crazymouse99
打印 上一主题 下一主题

『请教』get_free_pages申请大内存 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2009-10-15 14:18 |只看该作者
内核版不时的就有帖子问如何申请大内存。。。。

建议仔细考虑一下你的需求吧

论坛徽章:
0
12 [报告]
发表于 2009-10-15 16:07 |只看该作者
原帖由 Godbach 于 2009-10-15 14:18 发表
内核版不时的就有帖子问如何申请大内存。。。。

建议仔细考虑一下你的需求吧


需求就这样:我要分配大块的内存用于保存网卡数据,再通过内存映射,供用户态使用。

我修改了max_order = 16,提高了最大可申请的大小:4K×1024×(2^5)= 128M,get_free_page也成功通过编译。

可以说这个问题暂时解决了。

但是现在又碰到另一个问题,为什么我kmolloc分配的地址会大于最大内存地址?

给我分配的地址是:ffff810230b4a480, 通过__pa()转换后为:9407079552

大于我的8G内存啊...

请问怎么回事?可能是什么原因?几位大侠的经验丰富,希望能够提点下,谢谢

论坛徽章:
0
13 [报告]
发表于 2009-10-15 17:35 |只看该作者
什么硬件配置?好象很强的机子....

论坛徽章:
0
14 [报告]
发表于 2009-10-15 19:01 |只看该作者
启动项加一句:mem=A;A=实际物理内存-200MB。

论坛徽章:
0
15 [报告]
发表于 2009-10-16 10:43 |只看该作者
原帖由 crazymouse99 于 2009-10-14 16:50 发表
没有映射可以自己做内存映射的吧....

那换个角度讲,不要1GB那么大,我想申请200M的空间该怎么处理呢?


vmalloc 可以满足你的需求

论坛徽章:
0
16 [报告]
发表于 2009-10-16 10:58 |只看该作者

回复 #15 platinum 的帖子

大哥,你是来搞笑的吧

内核空间。。。

论坛徽章:
0
17 [报告]
发表于 2009-10-16 10:58 |只看该作者

  1. #include <linux/module.h>
  2. #include <linux/vmalloc.h>

  3. MODULE_AUTHOR("platinum");
  4. MODULE_DESCRIPTION("This is a module sample.");
  5. MODULE_LICENSE("GPL");

  6. __u8 *data;

  7. int
  8. init_module (void)
  9. {
  10.         data = vmalloc(1024 * 1024 * 200);

  11.         if (!data)
  12.                 return -ENOMEM;

  13.         memset(data, 0xff, 1024 * 1024 * 200);
  14.         printk("module loaded.\n");
  15.         return 0;
  16. }


  17. void
  18. cleanup_module(void)
  19. {
  20.         vfree(data);
  21.         printk("module unloaded.\n");
  22. }
复制代码
root@LinuxDev /platinum/project/module
# free
             total       used       free     shared    buffers     cached
Mem:        510644     275620     235024          0      48544     168876
-/+ buffers/cache:      58200     452444
Swap:       522104          0     522104
root@LinuxDev /platinum/project/module
# insmod module.ko
root@LinuxDev /platinum/project/module
# free
             total       used       free     shared    buffers     cached
Mem:        510644     480716      29928          0      48652     168888
-/+ buffers/cache:     263176     247468
Swap:       522104          0     522104
root@LinuxDev /platinum/project/module
# rmmod module
root@LinuxDev /platinum/project/module
# free
             total       used       free     shared    buffers     cached
Mem:        510644     276232     234412          0      48732     168888
-/+ buffers/cache:      58612     452032
Swap:       522104          0     522104
root@LinuxDev /platinum/project/module
#

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 原创内容

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
18 [报告]
发表于 2009-10-16 11:18 |只看该作者
白金兄的程序我也测试了一下,不过是虚拟机,尝试申请100M的内存:
  1. [root@localhost alloc_large_mem]# free
  2.              total       used       free     shared    buffers     cached
  3. Mem:        385624     188760     196864          0       1908      54936
  4. -/+ buffers/cache:     131916     253708
  5. Swap:       522104       8068     514036
  6. [root@localhost alloc_large_mem]# insmod alloc_large_mem.ko
  7. [root@localhost alloc_large_mem]# free
  8.              total       used       free     shared    buffers     cached
  9. Mem:        385624     290388      95236          0       1960      54948
  10. -/+ buffers/cache:     233480     152144
  11. Swap:       522104       8068     514036
  12. [root@localhost alloc_large_mem]#
复制代码


可见,insmod模块之后系统使用的内粗增加了100M多一点

论坛徽章:
0
19 [报告]
发表于 2009-10-16 11:23 |只看该作者
我的也是虚拟机

论坛徽章:
0
20 [报告]
发表于 2009-10-16 11:31 |只看该作者
刚想到一个小问题,
VMALLOC_START是在high_memory之上的8M以后的,
那么假如我有1G内存,high_memory界限会划在896M吧
也就是说vmalloc最多只有128-8=120M了,这还要再除去顶端的固定内核映射等空间
那么这种情况下是不是用vmalloc无法分配到200M空间?
不知道Godbach版主只分配到100多M内存是不是这个原因。
反而当物理内存较小的时候,high_memory比较低,倒是可以分配到200M的虚拟地址空间。
也就是说vmalloc所能分配到的最大空间实际跟物理内存大小还有点关系?
物理内存越大,vmalloc能分配到的越少?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP