Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123160
  • 博文数量: 31
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 361
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-11 15:38
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: LINUX

2008-04-10 18:07:10

说起来已经上过微机原理和计算机组成原理的课程了,可是知道现在才明白386体系中段页式内存寻址的具体过程,惭愧啊!

一、页目录表和页表

每个进程都有多个页表,里面存储的是线性地址和物理地址的对应关系,而页目录表是操作系统维护的,只有一张,里面存储的是各个进程的各个页表的地址。

二、全局描述符表和局部描述符表

局部描述符表是各个进程拥有的,里面存放的是其进程的各个段(代码段,数据段等)的段描述符。

全局描述符表在系统中只有一个,里面存放了三种内容:操作系统的各个段(代码段,数据段等)的段描述符,各个进程的局部描述符表(LDT)的段描述符,各个进程的进程状态表(TSS)的描述符。

也就是说,LDT存储着其进程的各个段的信息,而LDT本身的信息存在GDT中,恩,是这样的。

三、CR3,GDTR,LDTR.

CPU中为段页式管理设置了三个重要寄存器:CR3GDTRLDTR。其中,CR3保存的是页目录表的基地址,GDTR保存的是全局描述符表(GDT)的基地址,表长等GDT的信息,LDTR保存的是某个进程的局部描述符表的描述符的选择子(有点绕,也就是指向GDT中的某个LDT描述符)和对应描述符的内容(此内容不可见)。

四、虚拟地址向线性地址转换:

虚拟地址由16位的段选择子和32位的段内偏移地址组成的,选择子装在了六个段寄存器(cs,ds,ss等)中,当选择子被装入段寄存器时,微处理器会自动将其对应的描述符装入描述符寄存器。cpu先通过GDTR找到GDT的基地址。如果该段描述符在GDT中(可以根据段寄存器的低位判断),则根据段寄存器中段选择子找到对应的段描述符,从而得到段的基地址;如果该段描述符在LDT中,则先根据LDTRGDT中找到相应进程的LDT描述符,再在LDT中,根据段寄存器中的段选择子找到段描述符,从而得到段的基地址。找到段的基地址后,再和逻辑地址(虚拟地址)的低32位段内便宜地址相加的到32位线性地址。

五、线性地址向物理地址转换:

32位的线性地址中,高10位是页表号,中间10位是页号,最后12位是页内便宜地址。Cpu先根据CR3的到页目录表项表的基地址,然后在页目录项表中根据页表号找到页表的基地址,再在页表中根据页号找到页地址,最后在页中根据页内便宜地址找到对应的物理地址。

Ok!齐活了!但还要做一下说明,各个段寄存器中不光有16位的段选择子,还有隐藏不可见部分,这部分保存的是此段寄存器对应的段的基地址、段长等信息,其实就是一个缓冲的作用,在访问段的第一次的时候加载进去的,以后再寻址的时候,就不用再经过几次转换才能查到段基地址,可以从段寄存器中直接得到。同样的道理,LDTR中也不只是有局部描述符表的描述符选择子,还有对应的描述符表的基地址,表长的信息,同样也是在第一次访问某进程的局部描述符表时候加载进去的,起到缓冲作用,以后访问局部描述符表就不用再到GDT中找了。

 

 

阅读(1219) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~