linux内核bootmem,使用alloc_bootmem()分配大内存

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

阅读(1706) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值