Lazy-sbrk

传统 sbrk (Eager)

当用户调用 sbrk(n) 时,内核立即分配 n 字节物理内存,并映射到页表。如果 n 很大,这很慢,且浪费(用户可能申请了不用)。

懒惰 sbrk (Lazy)

  1. Syscall: sys_sbrk 仅仅增加进程的 p->sz 计数器。不分配物理内存,不修改页表。
  2. Trap: 当进程试图读写新增加的地址时,PTE 无效 (V=0),触发 Page Fault (scause=13/15)。
  3. Handler:
    • 分配一页物理内存 (kalloc)。
    • 将其初始化为 0。
    • 映射到出错的 VA (mappages)。
    • 设置权限 (R/W/U)。

优势

  • 启动速度快: 大程序启动时申请大量内存瞬间完成。
  • 节省内存: 稀疏数组 (Sparse Array) 只占用实际使用的物理页。