有关80386cpu在保护模式下的虚拟地址,线性地址和实际物理地址的关系

80386cpu是8086cpu的升级版,其具有32位的寄存器。(32根地址线和32根数据线)

8086cpu其是16位的寄存器但是其地址线有20根,其寻址范围为2的20次方,但是有一个16位的寄存器没办法表示一个20位的2进制数,所以8086cpu的制造商设计了一个地址加法器来用两个16位的寄存器来表示一个20位的2进制数。这两个寄存器一个是段寄存器,一个是指令指针寄存器,假设段寄存器用十六位的数x表示,指令指针寄存器用y表示则xxxx:yyyy对应的实际物理地址为(xxxx)16+yyyy
即:段地址
16+偏移地址。

80386cpu其是32位的寄存器,正好其地址线也是32根,在需要改变段寄存器的情况下,其直接寻址能力就可以达到2的32次方。难道在保护模式下cpu的段寄存器就派不上用场了 ?
当然不是,虽然cpu的寻址方式不是像在8086那样,但是其段寄存器有更重要的用途。
xxxx:yyyyyyyy就是段寄存器和指令指针寄存器所表示的地址,这个地址被称为虚拟地址,也就是说这个地址是假的,那其实际地址是什么呢?
在80386cpu的保护模式下通过xxxx可以在段描述符表中索引到真正段的地址aaaa,
那么aaaa:yyyyyyyy这个地址被称为线性地址,那么线性地址是不是就是真正的物理地址了呢?
答案是:不一定,以为在保护模式下其存在一个分页机制(因为在内存中存在驻留程序把内存分成了一块一块的),当没有启用分页机制时线性地址就是实际的物理地址,如果启用了分页机制,那么程序在计算机内存中储存就不是在一块连续的地址空间上了因此为了解决这个问题,计算机会利用分页机制把线性地址映射到其实际的物理地址上,也就是说计算机看到的是线性地址1111:22222222,而通过分页机制其实际操作的是1111:88889544这个地址,这种做法是为了解决驻留程序带来的麻烦。

原文地址:https://www.cnblogs.com/revercc/p/13287091.html