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

 

posted @ 2023-07-19 22:24  流水灯  阅读(247)  评论(0编辑  收藏  举报