>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
发信人: 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); |