Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1317655
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: LINUX

2013-07-31 23:52:11

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内核设计与实现》


阅读(6758) | 评论(0) | 转发(1) |
0

上一篇:linux 进程 线程 总结

下一篇:VC 快捷键

给主人留下些什么吧!~~