原型: void *kmalloc(size_t size, int flags)
    功能: 在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc、vmalloc,或者用get_free_pages直接申请页,释放内存用的是kfree、vfree或free_pages。
    kmalloc函数返回的是虚拟地址(线性地址),kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要,而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。
    关于kmalloc与vmalloc、malloc的一些总结

    1. kmalloc和vmalloc分配的是内核的内存,malloc分配的是用户的内存。
    2. kmalloc保证分配的内存在物理上是连续的,kmalloc分配的内存是位于0xBFFFFFFF - 0xFFFFFFFF中,driver一般是用它来完成对DS的分配,更适合于类似设备驱动的程序来使用。
    3. vmalloc保证的是在虚拟地址空间上的连续,vmalloc则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配。
    4. kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大(因为vmalloc还可以处理交换空间)。
    5. 内存只有在要被DMA访问的时候才需要物理上连续,vmalloc比kmalloc要慢.
    6. vmalloc使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。
    7. vmalloc中调用了kmalloc(GFP—KERNEL),因此也不能应用于原子上下文。
    8. kmalloc和kfree管理内核段内分配的内存,这是真实地址已知的实际物理内存块。
    9. vmalloc对应于vfree,分配连续的虚拟内存,但是物理上不一定连续。
    10. kmalloc分配内存是基于slab,因此slab的一些特性包括着色、对齐等都具备,性能较好,物理地址和逻辑地址都是连续的。