GDT的type字段有一位标识该段是否已访问,已访问到底是什么意思?还顺便问一下,进入保护模式时,cr0寄存器pe位置1后,就进入保护模式了,此时为什么还会寻址到下一条跳转指令?个位大侠帮忙啊!
------解决方案--------------------
已访问是说自从上次操作系统复位以来该段是否被访问过,访问过被置1。
进入保护模式后,这个jmp(一般是jmpi)就是跳转到相应的代码段或者新任务中去执行,此时jmpi后的操作数就是段内偏移+段选择符,而不是实模式下的段地址。
------解决方案--------------------
第一个问题,为什么要使用已访问位,Intel《系统编程指南》说是用来管理虚拟内存和调试,具体怎么管理和调试没有说明。还有一个就是假如GDT和LDT在ROM中时,处理器尝试往ROM中的段描述符中写时会进入死循环(具体为什么进入死循环也没说明),为了防止处理器进入死循环,ROM中所有段描述符的已访问位都置位。
第二个问题,你可能有一个错觉就是认为当PE设置成为1后就进入保护模式,其实不然,进入保护模式是需要执行一系列的操作后才完成的。还是Intel《系统编程指南》,它很明确的写出了切换到保护模式需要完成的步骤,你可参考Switching to Protected Mode一节。
这里最主要的问题是你认为当PE设置成1后,对CS的解释应当从段地址到段选择符的转变,我也去想过这个问题,但是通过调试代码发现,此时cs并没有立即发生改变,它还是原先的段地址,所有的执行流都没有改变,只有当它后面的jmp指令执行后,cs的内容才会变成相应的段选择符。
------解决方案--------------------
A位由处理器负责置位,这个功能是给操作系统使用的,用于虚拟内存管理。
A位由操作系统复位,操作系统可以根据A位被置位的次数统计段的使用频率,在内存紧张时淘汰那些较少使用的段。
另一个问题太简单,多少资料都有介绍,不予回答。