要在内核中使用连续的超过1G的内存有什么办法?

要在内核中使用连续的超过1G的内存有什么办法?
当然了,这内存在哪里无所谓,只要能作为连续内存使用。

作者: flyfrogs   发布时间: 2008-10-30

对现代OS来说,唯一需要做的,就是更改你的需求。

作者: albcamus   发布时间: 2008-10-30

使用64位的平台吧

作者: biger410   发布时间: 2008-10-30

基于 AMD 的处理器可以实现,AMD处理器支持高达 1G 页

作者: mik   发布时间: 2008-10-30



QUOTE:
原帖由 albcamus 于 2008-10-30 21:33 发表
对现代OS来说,唯一需要做的,就是更改你的需求。



更改我的需求就必须涉及到内核与用户内存之间的大量数据拷贝,
这肯定费时间,
能不能零拷贝?

作者: flyfrogs   发布时间: 2008-10-30



QUOTE:
原帖由 flyfrogs 于 2008-10-30 22:29 发表


更改我的需求就必须涉及到内核与用户内存之间的大量数据拷贝,
这肯定费时间,
能不能零拷贝?



不一定要复制到kernel的地址空间吧
比如系统调用,如果参数是指针的时候,kernel是通过这个指针访问user address space
你考虑一下可不可自己实现一个system call,将用户的数据指针传递进去

作者: Kasulle   发布时间: 2008-10-31



QUOTE:
原帖由 albcamus 于 2008-10-30 21:33 发表
对现代OS来说,唯一需要做的,就是更改你的需求。



偶觉得也是。 怎么会一下子用到1G的内存的。任何一个时间这1G的内存都要同时使用吗?

作者: Godbach   发布时间: 2008-10-31



QUOTE:
原帖由 mik 于 2008-10-30 21:56 发表
基于 AMD 的处理器可以实现,AMD处理器支持高达 1G 页




page size == 1G ? 没这么夸张吧,哪一款?

作者: albcamus   发布时间: 2008-10-31

干脆不使用分页机制了,不用linux OS,4G都可以。

作者: dreamice   发布时间: 2008-10-31



QUOTE:
原帖由 albcamus 于 2008-10-31 11:30 发表



page size == 1G ? 没这么夸张吧,哪一款?


没错,从 AMD Family 10h 以后的处理器都支持,也就是K10家族处理器开始

AMD 处理器的 page size 可以为4种: 4K、 2M、 4M、 1G

作者: mik   发布时间: 2008-11-01

厉害阿 ~~~~~~~amd居然支持1G的页

作者: dogygb   发布时间: 2008-11-01



QUOTE:
原帖由 Kasulle 于 2008-10-31 10:37 发表


不一定要复制到kernel的地址空间吧
比如系统调用,如果参数是指针的时候,kernel是通过这个指针访问user address space
你考虑一下可不可自己实现一个system call,将用户的数据指针传递进去



没看明白,用户空间的内存地址传到内核里去,内核还用这个地址访问内存?

作者: flyfrogs   发布时间: 2008-11-02

汗, 要干嘛......................

作者: kissGNU   发布时间: 2008-11-03

虽然你的需求不对,但确实可以做。
32bit的x86平台做不到,kenrel无法re-locate到物理内存512M以上,并且你占用了全部的内核空间。
64bit的x86平台你需要做如下更改,更改e820表,选定一块1G的地址空间标志为reserved(我建议你从16M以上开始reserve,否则你还要更改memory zone,禁止DMA_ZONE的情况),更改.confg文件,确定内核load的地址不会和你reserve的区域重叠。重叠时可以将内核re-locate到合适的位置,通过CONFIG_PHYSICAL_START参数

作者: zx_wing   发布时间: 2008-11-03



QUOTE:
原帖由 flyfrogs 于 2008-11-2 21:10 发表


没看明白,用户空间的内存地址传到内核里去,内核还用这个地址访问内存?



是的,kernel可以直接访问用户地址空间的地址

作者: Kasulle   发布时间: 2008-11-03



QUOTE:
原帖由 Kasulle 于 2008-11-3 13:01 发表


是的,kernel可以直接访问用户地址空间的地址



能不能给个例子啊?简单点就行。

作者: flyfrogs   发布时间: 2008-11-03



QUOTE:
原帖由 flyfrogs 于 2008-11-3 16:19 发表


能不能给个例子啊?简单点就行。



访问的话倒是可以直接使用地址访问,就和普通的指针一样
问题在于kernel mode中产生的page fault exception的处理比较麻烦,我看的是2.6.11版本的内核,要求将每一条可能产生page fault exception的指令加入exception table中。否则的话,一旦访问非法地址,产生Page fault,就会当作kernel oops,直接终止这个进程了。不知道新的版本有没有改变。
不过如果保证传入的指针肯定是正确的,而且访问总是合法的,那么就不用关心exception table

我还没写过kenrel的程序,只是认为理论上可行

作者: Kasulle   发布时间: 2008-11-03

内核中:
kernel_virt_address = kmalloc( 0x10000, GFP_KERNEL );
你想办法把kernel_virt_address的值传给用户空间
用户空间:
#define PAGE_OFFSET 0xc0000000
那么刚才申请的空间地址为:
kernel_virt_addr - PAGE_OFFSET;
经测试过,的确是可以的.

作者: prettywolf   发布时间: 2008-11-03



QUOTE:
原帖由 prettywolf 于 2008-11-3 20:40 发表
内核中:
kernel_virt_address = kmalloc( 0x10000, GFP_KERNEL );
你想办法把kernel_virt_address的值传给用户空间
用户空间:
#define PAGE_OFFSET 0xc0000000
那么刚才申请的空间地址为:
kernel_virt_ad ...



反过来呢?
我能不能在用户空间申请内存,传到内核使用?

作者: flyfrogs   发布时间: 2008-11-04

#include <linux/bootmem.h>
void *alloc_bootmem(unsigned long size);
void *alloc_bootmem_low(unsigned long size);
void *alloc_bootmem_pages(unsigned long size);
void *alloc_bootmem_low_pages(unsigned long size);



这些函数你看看呢,我刚看到这里

作者: liuweni   发布时间: 2008-11-04

内存用的越多越好  难道free = 4G 这样长期空闲是种浪费  

作者: jeffyan   发布时间: 2008-11-04

首先,你要有1G以上的内存,让linux只识别前半块内存,后半块那1G,你想怎么使,就怎么使

作者: 12013396   发布时间: 2008-11-04



QUOTE:
原帖由 12013396 于 2008-11-4 16:19 发表
首先,你要有1G以上的内存,让linux只识别前半块内存,后半块那1G,你想怎么使,就怎么使



有创意,不过怎么具体操作?

作者: flyfrogs   发布时间: 2008-11-04



QUOTE:
原帖由 flyfrogs 于 2008-11-4 16:41 发表


有创意,不过怎么具体操作?


20楼已经说了

作者: duanius   发布时间: 2008-11-04

时隔这么就看这个帖子
穿越感很强
alloc_bootmem很好用
很黄很暴力

作者: flyfrogs   发布时间: 2011-01-30