386体系中段页式内存寻址的具体过程:

一、页目录表和页表

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

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

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

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

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

三、CR3,GDTR,LDTR.

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

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

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

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

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