跳到正文

3.1.5 段页式管理方式

32 分钟

新困难:段页式必须先做段界限检查,再把段内偏移拆页号

逻辑地址为 (段号2,段内偏移0x3456)。段2长度 limit=0x5000 B,页大小4 KiB,其页表把段内第3页映射到页框 0x9A。求物理地址,并判断偏移 0x5000 是否有效。约定合法偏移满足 0≤offset<limit

def segment_paged_translate(segment,offset,segments,page_size=4096):
    if segment not in segments: raise ValueError('段号越界')
    limit,page_table=segments[segment]
    if not 0<=offset<limit: raise ValueError('段内越界')
    page,inside=divmod(offset,page_size)
    if page not in page_table: raise ValueError('页不在内存')
    return page,inside,page_table[page]*page_size+inside

segments={2:(0x5000,{3:0x9A})}
assert segment_paged_translate(2,0x3456,segments)==(3,0x456,0x9A456)
for bad in (0x5000,0x6000):
    try: segment_paged_translate(2,bad,segments); assert False
    except ValueError: pass

陪算:先比较 0x3456<0x5000,段内合法;再除以0x1000,得到页号3、页内偏移456。页表项给页框9A,物理地址 0x9A×0x1000+0x456=0x9A456。偏移恰等于limit时已经指向段外第一个字节,必须报越界,不能因为对应页号存在就放行。

依据:分段先提供逻辑保护边界,分页再负责固定大小映射。处理不变量是:只有通过段号/limit检查的段内偏移才允许拆页;分页保持页内偏移不变。检查顺序也避免越界地址借由页表残留项访问其他数据。

地址计算时间 O(1),若页表多级则随级数增长;段表与页表占用空间由实际段页数决定。错误反馈:limit通常是长度而非最后合法偏移;先查页表后查界限可能造成保护漏洞;页号从段内偏移算,不是从整个逻辑地址直接算;缺页与段越界是不同异常。

迁移答案:若段2基址模型采用纯分段而非段页式,物理地址应为base+offset,不再查页表;若页3表项无效但offset合法,结论是缺页而不是段越界。

桥接:页表项有效仍不保证页常驻;下一课用 Clock 的访问位与循环指针模拟缺页替换状态。

小纸条

学完《3.1.5 段页式管理方式》后,请独立复现本课的核心状态变化或计算过程。

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。