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