
图中页号用于查当前地址空间的页表,页内偏移保持不变,再与页框基址拼接。
逻辑地址到物理地址的题,最容易错在两处:把页号当成字节地址,或者把十六进制字符串直接从某一位切开。正确做法是先固定页大小,再把地址拆成页号和页内偏移。映射改变的是所在页框,页里的位置并不随之移动。
先定义一个完整的小模型
这里采用按字节寻址、固定页大小一千零二十四字节的简化分页模型。合法虚拟空间只有四页,页表分别描述这些虚拟页当前对应的页框与有效状态;物理内存有十六个同样大小的页框。
自设页表中,虚拟页零映射到页框三,虚拟页一合法但尚未驻留,虚拟页二映射到页框七,虚拟页三映射到页框十二。这个模型足够演示换算和异常边界,不试图复现某种处理器的完整多级页表格式。
题目若给的是另一个进程或另一个地址空间的页表,就必须使用相应映射。相同的虚拟地址数值,不意味着不同进程必然访问同一个物理位置;地址必须和所属空间一起解释。
用除法与取余拆开地址
设页大小为 P、逻辑地址为 A,页号等于 A 除以 P 的整数部分,页内偏移等于 A 对 P 取余。偏移一定从零到 P-1,不能把页内位置写成一到 P。
输入地址取 0x09A6,换成十进制为二千四百七十。除以一千零二十四,得到页号二、余数四百二十二,也就是偏移 0x1A6。此时还没有得到物理地址,只知道应查页表的哪一项,以及页里的哪个位置。
页大小为二的整数次幂时,可以用位操作理解。这里 P=2^10,偏移占低十位,剩余高位组成页号。十位不是整数个十六进制位,不能随意按“最后两位”或“最后三位”截取字符串代替掩码。

页号查表,偏移原样保留
页号二在表中映射到页框七,因此物理页框基址为七乘一千零二十四,等于七千一百六十八。再加上偏移四百二十二,得到物理地址七千五百九十,即 0x1DA6。
最常见的错误是直接拿页框号七加偏移,漏掉乘页大小;另一种是把原虚拟地址全部加到页框基址上,导致原来的页号部分被重复计入。先写“页框基址加页内偏移”,就能避免这两类单位混乱。
换算完成后可以反查:物理地址除以页大小的整数部分应为七,余数仍然为四百二十二。偏移保持一致,是这个固定页大小模型的一个简单不变量。
合法但不驻留,不是普通数字替换
如果访问虚拟页一,题设说明它属于合法空间,但目前没有可用的驻留映射。此时不能随便把页框号当成零继续算地址,而应进入相应的缺页处理,再根据实际系统政策决定装入、建立映射或报告失败。
如果页号已经超出这四页定义的合法范围,则属于当前模型里的非法地址,不能因为表外内存中恰好存在某个数,就继续当作页表项。真实系统中,两类情形可能都表现为地址转换异常,但地址空间语义与最终处理并不相同。
权限也要核对。映射存在不代表读、写或执行都被允许;页框号只是地址定位的一部分,访问类型和保护位仍可能决定本次访问是否合法。
缓存和多级结构不改变核心分解
真实处理器可以借助地址转换缓存减少重复查询,页表也可能分成多级,不一定每次都由软件从头读一张简单数组。面试里用单级表算数,是为了突出拆分和映射,不应被解释成所有机器的实际访问步骤。
如果采用不同页大小或大页,偏移位数也会改变,不能沿用这里的十位。多级索引怎样切分,需要相应架构与页表层级定义;固定页大小模型里的除法关系只是共同起点。
用边界检查代替只算一个地址
除了例题,还可以核对每页首字节、末字节、下一页首字节,以及合法未驻留页和表外地址。对映射有效的情况,检查偏移不变和物理范围;对无效情况,检查程序没有生成伪物理地址。
回答时把模型、拆分、有效性与权限、页框基址、偏移复核按顺序展开即可。若页框从七换成十二,哪些地址位会改变,为什么页内偏移仍应该保持原值?