linux 内存管理 --- kmalloc 和 vmalloc
kmalloc
kmalloc会根据申请的内存大小来决定来决定使用块分配器(slab/slub/slob)或页分配器(buddy)进行物理内存分配,只能分配几个固定大小的内存,申请值不在这些固定值之内时,会按向上对齐的原则,分配最接近申请值的内存块。
static __always_inline void *kmalloc(size_t size, gfp_t flags)
flags 可以指定从哪个物理内存区域申请内存,不指定就是低端内存,也可以指定高端内存等
kmalloc最大可分配内存大小:等于伙伴系统最大能申请的单块最大内存,即2^10页
kmalloc申请的物理地址是连续的
kmalloc如果申请高端物理内存,使用的虚拟地址是 PKMAP_BASE ~ PAGE_OFFSET-1 (永久内核映射区),所以最多能申请的高端物理内存大小受永久内核映射区大小限制
疑问:申请高端物理内存,在哪里实现物理地址和虚拟地址的映射
vmalloc
vmalloc申请的物理地址不一定是连续的,所以可以申请非常大的物理内存
vmalloc通过伙伴系统进行物理内存分配
使用的虚拟地址是 VMALLOC_START VMALLOC_END-1