免费注册 查看新帖 |

Chinaunix

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

如何分配4MB以上内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 11:12 |只看该作者 |倒序浏览
内核态如何分配4MB以上内存? 除了vmalloc

论坛徽章:
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
2 [报告]
发表于 2011-11-18 11:28 |只看该作者
回复 1# ruslin
启动参数 mem=
启动后用ioremap

论坛徽章:
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
3 [报告]
发表于 2011-11-18 11:29 |只看该作者
回复 1# ruslin

可以多次调用get_free_pages,然后自己建个链表管理。

论坛徽章:
0
4 [报告]
发表于 2011-11-18 11:45 |只看该作者
本帖最后由 ruslin 于 2011-11-18 11:51 编辑
回复  ruslin
启动参数 mem=
启动后用ioremap
瀚海书香 发表于 2011-11-18 11:28



    ioremap 我看了下,分配的线性地址区间是从vmalloc区获得的,所以ioreamp类似于vmalloc,只不过它不用自己去分配物理内存,并且ioremap关闭了页cache。

现在我不太清楚内核到底有没有有这种大的连续物理内存的需求。如果有,什么代码用到了?
另外一个,inodes_hashtable, dentry_hashtable 两个hash表,也是通过vmalloc分配的,据说还是蛮大的,例如2g的实际内存,但是我看代码没看出来到底最后分配了多大的空间?
另外一个问题了,dentry_hashtable的hash的键值应该是全路径名吧,比如/tmp/dd/abc.txt。如果hash冲突之后就是根据这个全路径名区分的吗?

一直在看书,很多问题都还没来得及自己验证。顺便请教下了?

论坛徽章:
0
5 [报告]
发表于 2011-11-18 13:21 |只看该作者
回复 4# ruslin


    kernel/main.c 里的start_kernel()里的mm_init_owner()和mm_init()之间加入alloc_bootmem(),并导出该符号,如
  1. char *addr;
  2. EXPORT_SYMBOL(addr);
  3. asmlinkage void __init start_kernel(void)
  4. {
  5.         ...
  6.         mm_init_owner(&init_mm, &init_task);
  7.         ...
  8.         addr = alloc_bootmem(mem_size);
  9.         ...
  10.         mm_init();
  11.         ...
  12. }
复制代码
进入系统后cat /proc/meminfo会发现少了你预留的那么多内存,写个模块直接操作你导出的那个符号就行。
我以前这样搞过512M的

论坛徽章:
0
6 [报告]
发表于 2011-11-18 13:23 |只看该作者
回复 2# 瀚海书香


    我记得这样似乎也最大只能16M

论坛徽章:
0
7 [报告]
发表于 2011-11-19 21:05 |只看该作者
终于把linux的内存管理的源代码看完了。当然对于NUMA还是不是很理解。
对于你这个问题,很简单的。你只要把include/linux/mmzone.h中的MAX_ORDER从11修改为12就可以了。
这样你可以用kmalloc()就能成功申请了。我经过测试,可以成功申请。
当然你的板子上的内存最好是32M以上,不然可能会没法申请成功的。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [报告]
发表于 2011-11-21 12:38 |只看该作者
回复 7# jwwzhh


    你的办法很牛,是个好办法;我也读了这部分代码,却没能想到这么做

论坛徽章:
0
9 [报告]
发表于 2011-11-21 13:41 |只看该作者
回复 8# linuxfellow


    谢谢夸奖!我会继续保持努力,只是接下来要研究wifi驱动了,没时间继续研究内核,一有时间,我会继续努力。

论坛徽章:
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
10 [报告]
发表于 2011-11-21 17:25 |只看该作者
回复 7# jwwzhh
这样是可以的,但是需要重新编译内核,而且需要知道内核的配置选项。
如果是做通用的模块,在不能重新编译内核的情况下,这种方法就不太合适了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP