1.通用缓冲区
在内核中初始化开销不大的数据结构可以合用一个通用的缓冲区。通用缓冲区最小为32B,然后依次为64B,128B,。。。直至128KB(即32个页面),但是,对通用缓冲区的管理采用的是Slab方式。从通用缓冲区中分配和释放缓冲区的函数:
void *kmalloc (size_t size, int flags);
void kfree(const void *ptr);
因此,当一个数据结构的使用不频繁,或其大小不足一个页面时,就没有必要为其分配专用缓冲区,而应该调用kmalloc()进行分配。如果数据结构的大小接近一个页面,则通过__get_free_pages()为它分配一个空间。
事实上,在内核中,尤其是驱动程序中,有大量的数据结构仅仅是一次性使用,而且只有几十个字节。所以用kmalloc给他们分配内存就足够了。Linux2.0以前的版本中一般都调用kamlloc给内核数据结构分配内存,所以,调用该函数的一个优点是让用户开发的驱动能保持向后兼容(在新版本中同样可以用以前的方法编译)。
kfree()释放由kmalloc()分配出来的内存块。如果释放的内存不是kmalloc()分配的,或者之前就被释放过的,再调用kfree()就会出现严重的后果。kfree和kmalloc要配对使用,以避免内存泄露和其他bug。但kfree(NULL)是安全的。
2.内核空间非连续内存的分配
我们说,任何时候,CPU访问的都是虚拟内存,那么,我们在编写驱动程序,或者编写模块时,Linux给我们分