kmalloc and vmalloc

Table of Contents

Function

#include<linux/slab.h>
void *kmalloc(size_t size, int flags);

(1)第一个参数是要分配的块的大小 (2)第二个参数是分配标志(flags),他提供了多种kmalloc的行为。 (3)第三个最常用的GFPKERNEL; 最终是调用getfreepages来实现实际的分配 使用GFPKERNEL容许kmalloc在分配空闲内存时候如果内存不足容许把当前进程睡眠以等待。

  • GFPATOMIC 用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.
  • GFPKERNEL 内核内存的正常分配. 可能睡眠.
  • GFPUSER 用来为用户空间页来分配内存; 它可能睡眠.
  • GFPHIGHUSER 如同 GFPUSER, 但是从高端内存分配,

size and misc

malloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA.

  注意kmalloc最大只能开辟128k(32XPAGESIZE)-16,16个字节是被页描述符结构占用了。

kmalloc和vmalloc的区别

  • vmalloc()与 kmalloc()都可用于分配内存
  • kmalloc()分配的内存处于3GB~highmemory之 间,这段内核空间与物理内存的映射一一对应
  • vmalloc()分配的内存在 VMALLOCSTART~4GB之间,这段非连续内 存区映射到物理内存也可能是非连续的
  • 在内核空间中调用kmalloc()分配连续物理空间,而调用vmalloc()分配非物理连续空间。
  • 把kmalloc()所分配内核空间中的地址称为内核逻辑地址
  • 把vmalloc()分配的内核空间中的地址称为内核虚拟地址
  • vmalloc()在分配过程中须更新内核页表
  • kmalloc分配内存是基于slab

Author: Shi Shougang

Created: 2015-03-05 Thu 23:20

Emacs 24.3.1 (Org mode 8.2.10)

Validate