386的段页式寻址[zz]

 
一、页目录表和页表
每个进程都有多个页表,里面存储的是线性地址和物理地址的对应关系,而页目录表是操作系统维护的,只有一张,里面存储的是各个进程的各个页表的地址。
二、全局描述符表和局部描述符表
局部描述符表是各个进程拥有的,里面存放的是其进程的各个段(代码段,数据段等)的段描述符。
全局描述符表在系统中只有一个,里面存放了三种内容:操作系统的各个段(代码段,数据段等)的段描述符,各个进程的局部描述符表(LDT)的段描述符,各个进程的进程状态表(TSS)的描述符。
也就是说,LDT存储着其进程的各个段的信息,而LDT本身的信息存在GDT中,恩,是这样的。
三、CR3,GDTR,LDTR.
CPU中为段页式管理设置了三个重要寄存器:CR3,GDTR,LDTR。其中,CR3保存的是页目录表的基地址,GDTR保存的是全局描述符表(GDT)的基地址,表长等GDT的信息,LDTR保存的是某个进程的局部描述符表的描述符的选择子(有点绕,也就是指向GDT中的某个LDT描述符)和对应描述符的内容(此内容不可见)。
四、虚拟地址向线性地址转换:
虚拟地址由16位的段选择子和32位的段内偏移地址组成的,其中16位的段选择子在程式装入的时候,被装在了六个段寄存器(cs,ds,ss等)中,cpu先通过GDTR找到GDT的基地址。如果该段描述符在GDT中(能根据段寄存器的低位判断),则根据段寄存器中段选择子找到对应的段描述符,从而得到段的基地址;如果该段描述符在LDT中,则先根据LDTR在GDT中找到相应进程的LDT描述符,再在LDT中,根据段寄存器中的段选择子找到段描述符,从而得到段的基地址。找到段的基地址后,再和逻辑地址(虚拟地址)的低32位段内便宜地址相加的到32位线性地址。
五、线性地址向物理地址转换:
32位的线性地址中,高10位是页表号,中间10位是页号,最后12位是页内便宜地址。Cpu先根据CR3的到页目录表项表的基地址,然后在页目录项表中根据页表号找到页表的基地址,再在页表中根据页号找到页地址,最后在页中根据页内便宜地址找到对应的物理地址。
Ok!齐活了!但还要做一下说明,各个段寄存器中不光有16位的段选择子,更有隐藏不可见部分,这部分保存的是此段寄存器对应的段的基地址、段长等信息,其实就是个缓冲的作用,在访问段的第一次的时候加载进去的,以后再寻址的时候,就不用再经过几次转换才能查到段基地址,能从段寄存器中直接得到。同样的道理,LDTR中也不只是有局部描述符表的描述符选择子,更有对应的描述符表的基地址,表长的信息,同样也是在第一次访问某进程的局部描述符表时候加载进去的,起到缓冲作用,以后访问局部描述符表就不用再到GDT中找了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值