高手请进: 如何用 kmalloc 分配20M 的内存空间?

dbfan 2010-05-26 10:07:21
我想在内核程序中用 kmalloc 分配10M 共享空间, 如何实现?

据说开启 config_large_allocs 选项可以,但具体在哪里配置?

谢谢!
...全文
435 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenee543216 2010-06-12
  • 打赏
  • 举报
回复
开机预留,不给操作系统使用
guanboliang777 2010-06-12
  • 打赏
  • 举报
回复
fadfasasfa
gellf 2010-06-11
  • 打赏
  • 举报
回复
mark
wanguodu 2010-06-04
  • 打赏
  • 举报
回复
两种方法:
一、kernel命令行加上:mem=$MAX_MEM-$RESERVED_MEM,也就是在你的机器上预留一片内存,然后用ioremap()出来,在用户空间mmap()后就可以放心使用了;
二、使用big_physical_area补丁。
Wenxy1 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 dbfan 的回复:]
我想在内核程序中用 kmalloc 分配10M 共享空间, 如何实现?

据说开启 config_large_allocs 选项可以,但具体在哪里配置?

谢谢!
[/Quote]
kmalloc最多分配128KB内存,你只能用 vmalloc()分配大于128KB的内存。
goodluckwu 2010-06-02
  • 打赏
  • 举报
回复
按照《LInux设备驱动程序》第三版的说法:
分配如此大的连续空间在一个已经连续运行了一段时间的系统上能够成功的可能性很小。(因为大量的内存碎片)
如果必须分配,最好在系统启动的时候让内核单独给你划分出一片区域,但是这样一来这片内存内核就管理不聊了(或者说别的程序就使用不了了)。
启动时候也不行的话只能用get_free_pages()来碰运气了。
armed 2010-05-29
  • 打赏
  • 举报
回复
get_free_pages()在ARM中最大申请4M的内存,离20M远着呢。
wz19761022 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lisan04 的回复:]
__get_free_pages可以分配以页为单位的,最大分配2048个页
[/Quote]
对,参考这个 http://www.deansys.com/doc/ldd3/ch08.html

dev->databuffer->buffer = (void*)__get_free_pages(GFP_KERNEL,USB_CAMERA_RZ_USE_PAGES);

free_pages((unsigned long)camera_dev->databuffer->buffer,USB_CAMERA_RZ_USE_PAGES);
iealien 2010-05-27
  • 打赏
  • 举报
回复
mark
Wenxy1 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ronliu 的回复:]

是的。昨天使用kmalloc分配125内存OK,但是分配153k内存时就分配不了了。
后来使用vmalloc搞定。
vmalloc分配的空间在逻辑上是连续的,物理上不连续。如果你申请到的内存不和硬件打交道的话,用vmalloc就可以了。
[/Quote]
支持,参考:http://linux.chinaunix.net/techdoc/system/2008/06/16/1011365.shtml
ronliu 2010-05-26
  • 打赏
  • 举报
回复
是的。昨天使用kmalloc分配125内存OK,但是分配153k内存时就分配不了了。
后来使用vmalloc搞定。
vmalloc分配的空间在逻辑上是连续的,物理上不连续。如果你申请到的内存不和硬件打交道的话,用vmalloc就可以了。
dbfan 2010-05-26
  • 打赏
  • 举报
回复
通常情况下 kmalloc 只能分配128k的内存
dbfan 2010-05-26
  • 打赏
  • 举报
回复
分配的内存需要做内存共享用, 物理地址也应是连续的,所以 vmalloc 估计不行

kmalloc_ptr = kmalloc(sizeof(KER_SHARE_DATA)+PAGE_SIZE, GFP_KERNEL);
if (!kmalloc_ptr)
{
printk("kmalloc failed\n");
return 0;
}


kmalloc_area = (unsigned long *)(((unsigned long)kmalloc_ptr + PAGE_SIZE -1) & PAGE_MASK);

for (virt_addr=(unsigned long)kmalloc_area; virt_addr < (unsigned long)kmalloc_area +sizeof(KER_SHARE_DATA); virt_addr+=PAGE_SIZE)
{
// reserve all pages to make them remapable
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
mem_map_reserve(virt_to_page(virt_addr));
#else
SetPageReserved(virt_to_page(virt_addr));
#endif
}
lisan04 2010-05-26
  • 打赏
  • 举报
回复
没用过,关注,帮顶
lisan04 2010-05-26
  • 打赏
  • 举报
回复
__get_free_pages可以分配以页为单位的,最大分配2048个页
xrbobo 2010-05-26
  • 打赏
  • 举报
回复
vmalloc
Tony2251 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wenxy1 的回复:]
引用 3 楼 ronliu 的回复:

是的。昨天使用kmalloc分配125内存OK,但是分配153k内存时就分配不了了。
后来使用vmalloc搞定。
vmalloc分配的空间在逻辑上是连续的,物理上不连续。如果你申请到的内存不和硬件打交道的话,用vmalloc就可以了。

支持,参考:http://linux.chinaunix.net/techdoc/system/2008/0……
[/Quote]

学习

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧