本次实践从ring0进入ring3然后又回到ring0,运行结果如下图:
具体步骤如下:
1、进入ring3
在前面的理论篇中,我们知道可以用ret指令跳转到目标代码段。这个例子中,在ret前的堆栈如下图:
我们要添加ring3代码段和一个ring3的堆栈段。
描述符:
选择子:
ring3堆栈段:
ring3代码段:
ring3代码要写显存访问到video段,把video段的DPL改写为3:
2、进入ring3代码后,使用调用门跳回ring0
修改调用门描述符和选择子的DPL和RPL,修改描述符和选择子满足CPL和RPL小于等于调用门DPL的条件
从低特权级到高特权级需要添加TSS段:
在特权级变换之前加载TSS:
定义TSS结构如下,本例只用到0级堆栈。
===============================================================================
完整代码如下:
pm.inc代码:
pmtest代码: