X86体系架构对虚拟地址的支持有一个发展过程,最早在8086中并没有虚拟地址的概念,只有物理地址。为了在16位ALU和16位代码和寄存器上寻址20位地址总线(2^20=1MB),Intel想到了一个折中的办法:把内存分段,并设计了4个段寄存器,CS,DS,ES和SS,分别用于指令、数据、其它和堆栈。这样,一个完整的物理内存地址就由两部分组成,高16位的段基址和低16位的段内偏移量,当然它们有12位是重叠的,它们两部分相加在一起,才构成完整的物理地址。
计划赶不上变化,1982年80286诞生了,24位的地址线催生了保护模式的产生,线性地址概念和段描述符等等被启用。线性地址通过MMU转化成物理地址,即:线性地址-=>物理地址同时实模式可以完全兼容8086的代码,保护了现有的投资。
1985年收到现代计算机体系结构的影响,80386又引入了页机制,从而引入了虚拟地址,从而地址转换又添加了一层逻辑地址-=>线性地址-=>物理地址
而地址开启页模式也要经历开启段模式的过程,过程十分繁复。幸运的是,从此以后,X86在没有加入更多的层次,只是在现有的基础上小修小补,譬如页表变大些(4k->2M->1G),加入更多保护,页表分层更多等等,这里不再细表,感兴趣的同学可以参看IA32硬件参考手册。 |