分类: LINUX
2014-04-17 17:48:19
lmnos2014-04-20 18:15:02
MagicBoy2010:其实也不能说不对,只是segment与selector的区别而已,我想你肯定知道的。早期real mode没有base, limit的概念,直到引入了GDT的概念后。segment * 16 + offset是早期经典的寻址模式,现在的处理器在实模式下的CS依然是F000H,不过它叫selector,因为GDT尚无内容,硬件逻辑将CS对应的影子寄存器的base设置到了FFFF0000。这篇博文主要是从cpu虚拟化的视角,对于一个vcpu的VMCS结构而言,QEMU的虚拟化技术将VMCS.guestCS和RIP分别设置为F000和FFF0,这就是为什么我依然引用早期的模式。
按现在的说法,处理器在real mode时已经是32 bit内存寻址了,只不过还只能使用16位的指令?很久没关注过这些原始阶段的代码了。。。。。另外,我觉得FFFF0和FFFFFFF0处的指令应该是一样的,不过没有验证过
嘿嘿,看来我又班门弄斧了,不好意思
回复 | 举报MagicBoy20102014-04-20 17:45:53
lmnos:当机器Power-ON时,x86 real mode的CS:IP=0xFFFF0, 这个不对
其实也不能说不对,只是segment与selector的区别而已,我想你肯定知道的。早期real mode没有base, limit的概念,直到引入了GDT的概念后。segment * 16 + offset是早期经典的寻址模式,现在的处理器在实模式下的CS依然是F000H,不过它叫selector,因为GDT尚无内容,硬件逻辑将CS对应的影子寄存器的base设置到了FFFF0000。这篇博文主要是从cpu虚拟化的视角,对于一个vcpu的VMCS结构而言,QEMU的虚拟化技术将VMCS.guestCS和RIP分别设置为F000和FFF0,这就是为什么我依然引用早期的模式。
按现在的说法,处理器在real mode时已经是32 bit内存寻址了,只不过还只能使用16位的指令?很久没关注过这些原始阶段的代码了。。。。。另外,我觉得FFFF0和FFFFFFF0处的指令应该是一样的,不过没有验证过