Lazy-sbrk
传统 sbrk (Eager)
当用户调用 sbrk(n) 时,内核立即分配 n 字节物理内存,并映射到页表。如果 n 很大,这很慢,且浪费(用户可能申请了不用)。
懒惰 sbrk (Lazy)
- Syscall:
sys_sbrk仅仅增加进程的p->sz计数器。不分配物理内存,不修改页表。 - Trap: 当进程试图读写新增加的地址时,PTE 无效 (V=0),触发 Page Fault (scause=13/15)。
- Handler:
- 分配一页物理内存 (
kalloc)。 - 将其初始化为 0。
- 映射到出错的 VA (
mappages)。 - 设置权限 (R/W/U)。
- 分配一页物理内存 (
优势
- 启动速度快: 大程序启动时申请大量内存瞬间完成。
- 节省内存: 稀疏数组 (Sparse Array) 只占用实际使用的物理页。