特权级之间的转换包括代码段之间的转换和数据段之间的转换。对于数据段之间的转换,只检查选择子中RPL和段中DPL的值,如果RPL<=DPL则可以转换,而对于代码段之间的转换,情况会稍微复杂。
代码段之间特权级的转换主要通过jmp和call指令实现,jmp和call的操作数可以直接是选择子,但注意在用call时,要记得ret。call的操作数还可以是一个调用门或者是一个包含选择子的TSS或者是一个包含TSS的任务门。对于门,其实质就是描述符,与代码段和数据段描述符不同,它是系统描述符,所以其s=0。暂时接触到的门共有四种:调用门、中断门、陷阱门和任务门。调用门只能放在GDT或LDT中,不能在IDT中,中断门和陷阱门则只能放在IDT中,而任务门既可以放在GDT中也可以放在LDT和IDT中。
这次碰到的问题有:
1.GDT中第四项(代码中为调用门)的索引为0x18,开始写为0x10了~
2.ret时,会检查被调用者的cs,eip等值,所以如果没有保存的话,系统会崩溃