免费注册 查看新帖 |

Chinaunix

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

使用alloc_bootmem()分配大内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-30 22:21 |只看该作者 |倒序浏览
看到水木上有人发这个帖子,就转过来了,顺便再贴一个libe1000中的代码;-)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
发信人: teamod (Gnuer), 信区: LinuxDev
标  题: linux下分配G级物理内存的方法
发信站: 水木社区 (Wed Aug  6 22:21:32 2008), 站内
自己解答昨天的帖子。。
今天试了一下,成功了
2.6.22.9的内核
使用alloc_bootmem函数
其实还是比较简单的,找资料花了半天-,-:
在内核代码  init/main.c文件中
asmlinkage void __init start_kernel(void)
{
        char * command_line;
        extern struct kernel_param __start___param[], __stop___param[];
        .
        .
        .
        cpuset_init_early();
        yy_p = alloc_bootmem(500000000);//yy_p在开始时定义
        if (!yy_p)
        {
                printk("yy: alloc error!\n");
        }
        else
        {
                printk("yy: alloc success! \n");
        }
        //一定要在mem_init函数前
        mem_init();
        .
        .
        .
}
重新编译内核
这样,进系统后cat /proc/meminfo 就会发现自己的物理内存少了500M
只要把yy_p这个指针EXPORT_SYMBOL后,内核的驱动程序就可以访问500M内存了
很黄很暴力!谁用谁知道。。~
--
※ 修改:·teamod 于 Aug  7 00:57:12 2008 修改本文·[FROM: 122.234.48.*]
※ 来源:·水木社区 newsmth.net·[FROM: 220.191.85.*]
diff --git a/mm/bootmem.c b/mm/bootmem.c
index 00a9697..8f3ef0d 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -487,3 +487,40 @@ void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size,
     return __alloc_bootmem_core(pgdat->bdata, size, align, goal,
                     ARCH_LOW_ADDRESS_LIMIT);
}
+
+static int __init reserve_setup(char *str)
+{
+    unsigned long long start, size;
+
+    size = memparse(str, &str);
+    if (*str != '@')
+        return 1;
+    str++;
+    start = memparse(str, &str);
+
+    reserve_bootmem(start, size);
+    printk(KERN_INFO "bootmem: Reserved %llu bytes @ 0x%llx\n", size, start);
+    return 1;
+}
+
+static int __init alloc_setup(char *str)
+{
+    unsigned long long size;
+    unsigned int nid = 0;
+    void *start;
+
+    size = memparse(str, &str);
+    if (*str == '@') {
+        str++;
+        get_option(&str, &nid);
+    }
+
+    start = alloc_bootmem_pages_node(NODE_DATA(nid), size);
+    if (start)
+        printk(KERN_INFO "bootmem: Allocated %llu bytes at 0x%p(0x%p) on node %u\n",
+            size, start, (void *) virt_to_phys(start), nid);
+    return 1;
+}
+
+__setup("bootmem-reserve=", reserve_setup);
+__setup("bootmem-alloc=", alloc_setup);
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12592/showart_1673318.html

论坛徽章:
0
2 [报告]
发表于 2013-01-08 09:46 |只看该作者
违反linux kernel的设计原则,把这部份内存强制保留了下来,开发者就可以滥用这块内存,因为这块内存不在系统管理下了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP