一、内存管理
1、内核
使用alloc_pages申请物理页帧
使用kmalloc申请专用/通用内存块、vmalloc申请物理不连续,逻辑相连内存
使用kmap建立高端地址映射
外碎片:空闲内存零散分布,无法满足大内存需求(伙伴系统解决)
内碎片:申请一块内存真正使用的只有小部分(slab,通用内存块解决)
2、用户进程
1)申请内存
使用malloc动态分配,分配的内存并不是立即调入,而是拥有该内存的访问权,等到真正访问时,引发缺页异常调入
malloc为glibc库函数,实际使用brk/mmap系统调用
申请内存<128k时,调用brk,简单移动堆指针
>128时调用mmap进行内存映射 边界值可通过mallopt进行设定
free一段内存并不是马上还给os,通过malloc依次分配A、B、C三块内存,free A,堆指针无法收缩,保留A供下次调用malloc时使用;free B C(B+C 超过 128k)此时才收缩堆指针,将C这段内存还给os
2)访问内存
cpu引用一个虚拟地址,TLB命中,直接得到物理地址
未命中,通过cr3寄存器存放全局目录地址,一层层索引+偏移得到物理地址
将物理地址发送给高速缓存,缓存命中直接得到对应数据,未命中则继续访问下级缓存或直接访问内存
3、内核与用户空间的数据传递