Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760024
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2008-11-30 22:21:22

看到水木上有人发这个帖子,就转过来了,顺便再贴一个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);

阅读(2962) | 评论(0) | 转发(6) |
给主人留下些什么吧!~~