要在内核中使用连续的超过1G的内存有什么办法?
时间:2008-10-30
来源:互联网
当然了,这内存在哪里无所谓,只要能作为连续内存使用。
作者: flyfrogs 发布时间: 2008-10-30
作者: albcamus 发布时间: 2008-10-30
作者: biger410 发布时间: 2008-10-30
作者: mik 发布时间: 2008-10-30
对现代OS来说,唯一需要做的,就是更改你的需求。
更改我的需求就必须涉及到内核与用户内存之间的大量数据拷贝,
这肯定费时间,
能不能零拷贝?
作者: flyfrogs 发布时间: 2008-10-30
更改我的需求就必须涉及到内核与用户内存之间的大量数据拷贝,
这肯定费时间,
能不能零拷贝?
不一定要复制到kernel的地址空间吧
比如系统调用,如果参数是指针的时候,kernel是通过这个指针访问user address space
你考虑一下可不可自己实现一个system call,将用户的数据指针传递进去
作者: Kasulle 发布时间: 2008-10-31
对现代OS来说,唯一需要做的,就是更改你的需求。
偶觉得也是。 怎么会一下子用到1G的内存的。任何一个时间这1G的内存都要同时使用吗?
作者: Godbach 发布时间: 2008-10-31
基于 AMD 的处理器可以实现,AMD处理器支持高达 1G 页
page size == 1G ? 没这么夸张吧,哪一款?
作者: albcamus 发布时间: 2008-10-31
作者: dreamice 发布时间: 2008-10-31
page size == 1G ? 没这么夸张吧,哪一款?
没错,从 AMD Family 10h 以后的处理器都支持,也就是K10家族处理器开始
AMD 处理器的 page size 可以为4种: 4K、 2M、 4M、 1G
作者: mik 发布时间: 2008-11-01
作者: dogygb 发布时间: 2008-11-01
不一定要复制到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
没看明白,用户空间的内存地址传到内核里去,内核还用这个地址访问内存?
是的,kernel可以直接访问用户地址空间的地址
作者: Kasulle 发布时间: 2008-11-03
是的,kernel可以直接访问用户地址空间的地址
能不能给个例子啊?简单点就行。
作者: flyfrogs 发布时间: 2008-11-03
能不能给个例子啊?简单点就行。
访问的话倒是可以直接使用地址访问,就和普通的指针一样
问题在于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
内核中:
kernel_virt_address = kmalloc( 0x10000, GFP_KERNEL );
你想办法把kernel_virt_address的值传给用户空间
用户空间:
#define PAGE_OFFSET 0xc0000000
那么刚才申请的空间地址为:
kernel_virt_ad ...
反过来呢?
我能不能在用户空间申请内存,传到内核使用?
作者: flyfrogs 发布时间: 2008-11-04
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




作者: jeffyan 发布时间: 2008-11-04
作者: 12013396 发布时间: 2008-11-04
首先,你要有1G以上的内存,让linux只识别前半块内存,后半块那1G,你想怎么使,就怎么使
有创意,不过怎么具体操作?
作者: flyfrogs 发布时间: 2008-11-04
有创意,不过怎么具体操作?
20楼已经说了
作者: duanius 发布时间: 2008-11-04
穿越感很强
alloc_bootmem很好用
很黄很暴力
作者: flyfrogs 发布时间: 2011-01-30
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28