免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 26536 | 回复: 77
打印 上一主题 下一主题

关于 vmalloc 的几点疑惑…… [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-14 19:32 |只看该作者 |倒序浏览
kmalloc 可分配的连续空间很有限,因此如果要分配逻辑连续的大空间(非物理内存连续),可以使用 vmalloc

1、用 vmalloc 替代 kmalloc、vfree 替代 kfree 导致 pannic?
查了资料,vmalloc 最后也会调用 kmalloc,但参数不是 GFP_ATOMIC 而是 GFP_KERNEL
有资料介绍,这种情况会导致 vmalloc 不能在原子上下文中使用
我的 kmalloc 是在一个 wrlock 中使用的,不知道单纯用 vmalloc 替代 kmalloc 是否触犯了 vmalloc 的逆鳞?

2、效率问题,vmlloc 是否效率远不如 kmalloc
因为 vmalloc 分配出的内存在物理内存上不一定连续,而 kmalloc 是绝对连续的(虽然大小有限)
所以在分配和使用小内存时,是不是 vmalloc 的效率远不如 kmalloc?

3、/proc/meminfo 提示的 VmallocTotal: 问题
在 kernel 启动时,可以利用 vmalloc=xxxM 来设置 VmallocTotal
但发现有的发行版(例如 RedHat)VmallocTotal 值远大于实际物理内存
而我使用的 gentoo 则默认是物理内存的 30% 左右
经试验,如果 vmalloc size < VmallocTotal 但 vmalloc size > 物理内存,则会 pannic
想问一下:这个设置过大会不会有问题,会不会导致有些需要 vmalloc 分配的程序判断可用内存错误导致内存溢出导致 pannic 呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2009-05-14 19:52 |只看该作者
内存方面的问题研究不多。帮白金兄顶一下。:wink:

论坛徽章:
0
3 [报告]
发表于 2009-05-15 10:29 |只看该作者

回复 #1 platinum 的帖子

> 1、用 vmalloc 替代 kmalloc、vfree 替代 kfree 导致 pannic?
> 查了资料,vmalloc 最后也会调用 kmalloc,但参数不是 GFP_ATOMIC 而是 GFP_KERNEL
> 有资料介绍,这种情况会导致 vmalloc 不能在原子上下文中使用
> 我的 kmalloc 是在一个 wrlock 中使用的,不知道单纯用 vmalloc 替代 kmalloc 是否触犯了
> vmalloc 的逆鳞?

vmalloc会用直接用alloc_page来分配物理页,kmalloc只是用来分配一些vmalloc需要用到的数据结构,如vm_struct。
如果在interrupt context,会BUG_ON().
一般不会panic, 只会打出一些警告信息 "BUG: sleeping function called from invalid context“
btw, 你可以控制gfp flag by using __vmalloc.

> 2、效率问题,vmlloc 是否效率远不如 kmalloc
> 因为 vmalloc 分配出的内存在物理内存上不一定连续,而 kmalloc 是绝对连续的
>(虽然大小有限)
> 所以在分配和使用小内存时,是不是 vmalloc 的效率远不如 kmalloc?

vmalloc在分配的时候需要修改page table,所以比较慢。一旦page table建立好了以后,应该问题不大吧,访问都需要virtual addr -> phyaddr的转换。

> 3、/proc/meminfo 提示的 VmallocTotal: 问题
> 在 kernel 启动时,可以利用 vmalloc=xxxM 来设置 VmallocTotal
> 但发现有的发行版(例如 RedHat)VmallocTotal 值远大于实际物理内存

是64bit kernel?  See VMALLOC_START and VMALLOC_END definition for x86_64. (VmallocTotal = VMALLOC_END - VMALLOC_START)。

32bit x86 kernel一般128M左右。

> 而我使用的 gentoo 则默认是物理内存的 30% 左右
> 经试验,如果 vmalloc size < VmallocTotal 但 vmalloc size > 物理内存,则会 pannic
> 想问一下:这个设置过大会不会有问题,会不会导致有些需要 vmalloc 分配的程序判断可用内存
>错误导致内存溢出导致 pannic 呢?

不太清楚,从code看,kernel会检查vmalloc的size:
if (!size || (size >> PAGE_SHIFT) > num_physpages)
                return NULL;

论坛徽章:
0
4 [报告]
发表于 2009-05-15 10:53 |只看该作者

回复 #1 platinum 的帖子

Kmalloc 是连续的物理内存。
Vmalloc 是非连续的。
   如果要大量的内存,且效率方面要求不高,用vmalloc,反之用kmalloc .
  为什么Kmalloc 的效率要比vmalloc呢,我觉得是硬件上的cache帮的忙。

论坛徽章:
0
5 [报告]
发表于 2009-05-15 10:58 |只看该作者
原帖由 alephman 于 2009-5-15 10:53 发表
Kmalloc 是连续的物理内存。
Vmalloc 是非连续的。
   如果要大量的内存,且效率方面要求不高,用vmalloc,反之用kmalloc .
  为什么Kmalloc 的效率要比vmalloc呢,我觉得是硬件上的cache帮的忙。

我也感觉(只是感觉)vmalloc 比 kmalloc 要慢,但 eexplorer 兄说
vmalloc在分配的时候需要修改page table,所以比较慢。一旦page table建立好了以后,应该问题不大吧,访问都需要virtual addr -> phyaddr的转换。


因为我从来没学习过内存管理方面的知识,所以这块一窍不通,也不知道你们两个哪个说的更正确些

论坛徽章:
0
6 [报告]
发表于 2009-05-15 12:56 |只看该作者
vmalloc是一页一页地去获取内存,然后把获取到的这些页映射成连续的虚拟地址;
kmalloc是一次性获取所需要的所有页,并且不需要再做映射;

vmalloc后,映射关系只体现在init_mm上,当发生缺页异常时(由于访问vmalloc的地址产生的,因为当前mm不一定就是init_mm),当前mm需要从init_mm同步vmalloc所映射的信息;(这是ULK的说法,但是好像这个是因体系结构而异的,不一定需要同步)
kmalloc所分配的空间不需要这一过程;

[ 本帖最后由 kouu 于 2009-5-15 12:58 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-15 23:07 |只看该作者
原帖由 eexplorer 于 2009-5-15 10:29 发表
vmalloc在分配的时候需要修改page table,所以比较慢。一旦page table建立好了以后,应该问题不大吧,访问都需要virtual addr -> phyaddr的转换。
...


vmalloc的内存不连续,那DMA是不是需要调用特殊的DMA函数来得到若干连续的物理内存组成的sg list?

论坛徽章:
0
8 [报告]
发表于 2009-05-16 09:19 |只看该作者
vmalloc 应该不能直接为 DMA 申请内存。可以使用 kmalloc 或更低层的函数 alloc_page() /
__get_free_page() 加上 GFP_DMA 标志为 DMA 申请内存。这个标志从 zonelist  的
ZONE_DMA 区域进行分配,以保证物理内存的连续性。

论坛徽章:
0
9 [报告]
发表于 2009-05-16 23:09 |只看该作者
原帖由 sinister 于 2009-5-16 09:19 发表
vmalloc 应该不能直接为 DMA 申请内存。可以使用 kmalloc 或更低层的函数 alloc_page() /
__get_free_page() 加上 GFP_DMA 标志为 DMA 申请内存。这个标志从 zonelist  的
ZONE_DMA 区域进行分配,以保证物理 ...


难道Linux没有类似scat-gather方式的支持不连续内存的DMA映射的函数?

论坛徽章:
0
10 [报告]
发表于 2009-05-16 23:30 |只看该作者
原帖由 Solaris12 于 2009-5-16 23:09 发表


难道Linux没有类似scat-gather方式的支持不连续内存的DMA映射的函数?

有。DMA需要的内存有专门的函数分配,不会直接使用vmalloc/kmalloc或xxx_pages这样的函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP