Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116960
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 11:07
个人简介

弃我去者,昨日之日不可留; 乱我心者,今日之日多烦忧。

文章分类

分类: LINUX

2014-10-14 14:16:41

1.vmalloc kmalloc  是用来分配内核空间内存的,malloc是用来分配用户空间的内存的

2.kmalloc分配的页在物理地址上是连续的(虚拟地址自然也是连续的)

    vmalloc只确保页在虚拟地址空间内是连续的。它通过非连续的物理内存块,再“修正”页表,把内存映射到逻辑地址空间是连续的区域内。

    malloc 返回的也在进程的虚拟地址空间内是连续的,但是在物理地址上不一定是连续的。

3  用于kmalloc可分配的内存大小范围在32~131027(128k)字节,并且由于它用slab分配器来分配内存的,所以,得到的内存大小可能比你申请的要大一些(它向上取2的N次幂整数)。而且如果开启了CONFIG_LARGE_ALLOCS选项,这个值可以更大,可以达到了32M。

  一般申请较大的内存才使用vmalloc,例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配 的内存上

4.vmalloc是会睡眠的,因此不能在中断上下文中使用

 kmalloc可以通过配置flags配置为可睡眠或者不可睡眠,GFP_KERNEL可以睡眠 ,GFP_ATOMIC不可以睡眠。

5.内核中vmalloc,kmalloc分配都是以字节为单位,若想以页为单位用alloc_pages类函数
  当然,内核进行内存管理(MMU干的)是以物理页为基本单位的。


参考《Linux内核设计与实现》


阅读(1142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~