用户态的malloc是申请堆空间的用户态函数。可网上不少人以为malloc在内核态的调用函数是kmalloc或vmalloc,这是不对的 kmalloc是基于slab的,它在通用缓存区申请分配,通用缓存区一共26块缓存块,使用DMA和常规分配各占有13个。
当调用vmalloc时,先调用kmalloc(之所以没有直接使用专用缓存,是因为vmalloc调用本来就不是很频繁,而且开销有些大,需要建立页表到页框的映射,还要刷新tlb,)分配一块可以存放所申请物理页框数量的描述符的空间,最后直接调用alloc_page每次申请一个物理页框。
言归正传:
malloc首先获得的是线性区间,并没有获得物理内存,因为内核就是这么强硬,爱咋咋滴^^。当用户像这个线性区间写入时必定产生缺页,进入缺页处理程序,经判断,这是一个匿名映射,然后在高端内存直接调用__alloc_pages(本来高端内存就是给用户使用的)。
时间: 2024-12-15 01:38:47