- 论坛徽章:
- 0
|
回复 #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; |
|