kmalloc()、kzalloc()、vmalloc() 的区别是:
- kzalloc 是强制清零的 kmalloc 操作;(以下描述不区分 kmalloc 和 kzalloc)
- kmalloc 分配的内存大小有限制(128KB),而 vmalloc 没有限制;
- kmalloc 可以保证分配的内存物理地址是连续的,但是 vmalloc 不能保证;
- kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞;
- kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快
大的连续物理内存分配:
__get_free_pages
用这个函数开源获得最大2^(MAX_ORDER-1)个内存页,如果一页4096字节,MAX_ORDER=11,则可以最大分配的连续物理内存空间时4M字节。
如果需要更大的连续物理空间呢?
可以在内核初始化时保留,可以用静态全局变量或者其他自定义方法实现