操作系统实验作业, 实验二内存地址转换实验, 知识点笔记

  • 逻辑地址: 段标识符(16,2字节)+段内偏移量;段标识符是高位的16位,(段内偏移量是低位的16位)

    • 段标识符(段选择符),16位; 前13位是索引号, 之后1位是TI字段, 之后2位是PRL(请求者特权级)
    • 索引号(13) : 是段表中段的编号,也可以看作段描述符在段表中的索引位置
    • TI字段(1) : 一位,TI=0表示该逻辑地址对应的段描述符在GDT中, TI=1 表示相应的段描述符在LDT中
  • 段表: 由连续排列的 段描述符 组成,段描述符描述一个段的起始位置

    • 一个段的 段标识符 索引该段的 段描述符 在段表中排第几个
    • 段描述符(64,8字节)
      • Base字段描述了一个段的开始位置:基地址(32,4字节);基地址(高位到低位)=63,56+39,32+31,16
      • 基地址不是在内存中的起始地址, 而是段在逻辑(虚拟)地址空间里的起始位置
    • LDT: 局部段描述符表, 每个进程一个, 存储该进程的代码段和数据段等各种段的段描述符
    • GDT段表: 全局段描述符表, 整个系统一个, 存放了共享段的描述符, 以及存放LDT的描述符(LDT本身被看作一个段)
  • 相关寄存器:

    • GDTR : 存放GDT在内存中的起始地址和大小
    • LDTR : TI=1时,说明要找的段描述符存放在LDT中, LDTR中存放该LDT在GDT中的索引,TI=0时, 要找的段描述符在GDT中, 通过GDTR找到GDT进而找到段描述符
    • DS, SS等寄存器: 储存 段标识符(段选择符16,2字节),高13位包括索引号和TI字段
  • 线性地址 : 段基址是段在逻辑(虚拟)地址空间中的起始地址, 加上逻辑地址中的段内偏移量组成的 线性地址,表示要访问的数据在逻辑(虚拟)地址空间中的地址

  • 物理地址 : 线性地址到物理地址的转换

    • 物理地址内存空间按照分页来管理, 逻辑地址为 页号+页内偏移量,
    • 32位(4字节)的机器,32位可以表示2^32个字节,因此可以支持4G内存
    • 页面大小为4kb(2^12个字节,可以用12位表示),因此页内偏移量为低位12位
    • 总的页的个数为 2^32字节 / 2^12字节 = 2^20页, 需要用20位表示
    • 由页号找到页框号, 计算可得页框起始地址, 加上页内偏移量为物理地址
    • 若采用二级分页管理方式
    • 页表中存放对应页框的页框号,页框号占20位(2字节4位,十六进制5位),每个页框号用4字节储存
    • 一页表示一个页表
    • 因此每页(4kb)能储存 2^12 / 2^2 = 2^10 个页框号, 用10位表示要找的页框在该页表中的第几个
    • 共2^20页, 每个页表能放2^10页, 因此有 2^20 / 2^10 = 2^10 个页表,每个页表存放在某个页框中
    • 一个页框号对应一个页表, 页框号用4字节存, 正好1页(4kb)能够储存2^10个页表的页框号,
    • 用10位表示要找的页框在该页中的第几个
    • 因此有两级页表, 第一级页表有1个,被存放在某页框中, 存放2^10个指向第二级页表的页框号,
    • 第二级页表有2^10个, 每个第二级页表被存放在一个页框中, 每个第二级页表内存放2^10给指向某个页框的页框号
    • 线性地址的低12位表示物理地址在所在页框中的偏移量,之后向上的10位表示物理地址所在页框的页框号在所在第二级页表中的编号
    • 再之后的最高10位表示所在的第二级页表在所在的第一级页表中的编号
  • Bochs控制窗口下的命令解释

    • ctrl+c 进入调试状态
    • c 继续执行,直到遇到断点
    • sreg 查看段寄存器和段描述符寄存器
    • creg 查看控制寄存器
    • xp [/nuf] addr 显示物理地址的内容
      • 其中n指定显示的单元数,默认是1;
      • u指定每个显示单元的大小(b表示字节、h表示字(2字节)、w表示双字(4字节)),默认是w;
      • f指定显示格式(x十六进制、d 有符号十进制、u 无符号十进制、o 八进制、t二进制、c字符),默认是x
    • setpmem [addr] [size] [val] 设置物理内存某地址的内容
      • addr地址、size字节数、val值
posted @ 2025-05-07 12:47  Kazuma_124  阅读(17)  评论(0)    收藏  举报