内存管理
段表 页表 --> 多级页表 + TLB(页表缓存/快表) 段页式内存管理:地址结构就由段号、段内页号和页内位移三部分组成;有意义的段,代码段、数据段、栈段。
虚拟内存管理
- Linux内核为每个进程维护一个虚拟地址空间(进程隔离)
- 内核在进程的虚拟地址空间中为新分配的内存区域分配一段虚拟地址区间(VMA, Virtual Memory Area)
- 这时物理内存还未真正分配,只是建立了虚拟地址映射
页表管理
- 内核更新进程的页表(Page Table),为新分配的虚拟地址区间建立映射关系。
- 物理内存的分配通常采用按需分配(Lazy Allocation),即只有当进程真正访问这块内存时,才分配物理页(通过缺页异常 page fault 处理)
- 内核将分配的虚拟地址区间的起始地址返回给用户态。
- 恢复用户态上下文,CPU切换回用户态。
每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。
malloc() 分配的是虚拟内存 只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系
参考: