# 第 15 章实验:基址 + 界限转换与越界异常 ## 做什么 - `translate.c`:用 C 实现 MMU 的"先查界限、再加基址",复现原书两组例子 (x = x + 3:base 32KB → 128→32896、15KB→48128;4KB 地址空间 @16KB:0→16384、1KB→17408、3000→19384、4400→越界)。 - `segv.c`:在真实进程里访问界外地址(mprotect 成 PROT_NONE 的页、地址 16、内核地址),捕获 SIGSEGV,打印硬件报告的出错地址。 ## 怎么跑 ``` make ./translate ./translate 16K 4K 0 1K 3000 4400 # 自定义: ... ./segv ``` ## 该观察到什么、为什么 - translate 的输出与原书数字完全一致:PA = VA + base,合法条件 0 ≤ VA < bounds。 - segv:最后一个合法字节可以读,越过 1 字节立刻 SIGSEGV。越界访问 → 硬件异常、切到内核态 → OS 处理程序 → 默认向进程发 SIGSEGV 终止它, 这和原书图 15.6 最后几行(B 执行坏的 load)是同一个流程(现代 Linux 用分页实现,但机制思想一致)。