kmalloc:它和malloc相似,除非被阻塞,否则这个函数勊运行得很快,而且不对所获取的空间清零,也就是说,分配给它的区域仍然保持着原有的数据。它分配的区域在物理内存中也是连续的。
void *kmalloc(size_t size, int flags) : 第一个参数是要分配的快的大小,第二个参数是分配标志,分配标志可以控制kmalloc的行为。
关于size参数: Linux处理内存分配的方法是,创建一系列的内存对象池,每个池中的内存块大小是固定一致的。处理分配请求时,就直接在包含足够大的内存块的池中传递一个整块给请求者。驱动程序开发人员应该记住的一点是,内和只能分配一些预定义的、固定大小的字节数组。如果申请任意数量的内存,那么得到的很可能会多一些,最多会到申请数量的两倍。另外,我们应该记住的是,kmalloc能处理的最小的内存块是32或64,到底是哪个则取决于当前体系结构使用的页面大小。 对kmalloc能够分配的内存块大小,存在一个上限,这个限制随着体系架构的不同以及内核配置选项的不同而变化。如果我们希望代码具有完整的可移植性,则不应该分配大于128KB的内存。 如果我们希望得到多于几千字节的内存,则最好使用除kmalloc之外的内存获取方法。
vmalloc: 它分配虚拟地址空间的连续区域。尽管这段区域在物理上可能是不连续的,内核却认为它们在地址上是连续的。vmalloc在发生错误时返回0,成功时返回一个指针,该指针指向一个线性的、大小最少为size的线性内存区域。
kmalloc和__get_free_pages使用的(虚拟)地址范围与物理内存是一一对应的,可能会有基于常量PAGE_OFFSET的一个偏移。这两个函数不需要为该地址段修改页表。但另一方面,vmalloc和ioremap使用的地址范围完全是虚拟的,每次分配都要通过对页表的适当设置来建立(虚拟)内存区域。

被折叠的 条评论
为什么被折叠?



