RING3到RING0
RING3到RING0
当我在说跳转时,说的什么?
CPU有很多指令,不是所有的指令都能够随时用,比如
首先得要有一个RING3的代码段,并且该代码段正处于运行状态
1.定义RING3代码段
[SECTION .ring3]
ALIGN 32
[BITS 32]
LABEL_CODE_RING3:.
;此处省略RING3代码段要做的事情
.
;最后一句转移到ring0
2.必须为RING3代码段定义描述符
LABEL_DESC_CODE_RING3: Descriptor 0, SegCodeRing3Len - 1, DA_C + DA_32 + ;
3.为RING3代码段定义选择子
SA_RPL3 ;SA_RPL3
[SECTION .ring0]
ALIGN 32
[BITS 32]
LABEL_CODE_RING0:.
;此处省略RING0代码段要做的事情
LABEL_DESC_CODE_DEST: Descriptor 0, SegCodeDestLen - 1, DA_C + DA_32 ; 非一致代码段 ,该段为RING0
SelectorCodeDest equ LABEL_DESC_CODE_DEST - LABEL_GDT ;RING0代码段对应的选择子
到此准备工作已经做好(各级堆栈也需要准备),要从RING3跳转到RING0,通过这一篇文章,可以通过调用门实现从低级到高级的跳转,接下来定义调用门,和调用门的选择子
调用门
LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate + DA_DPL3;
选择子
SelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDT + SA_RPL3
调用门定义时,需要用到RING0的选择子。并且调用门和调用门选择子的特权等级也都是RING3,加入调用门本身就定义为非RING3,那么在RING3代码中执行跳转时,就会报错。
现在来晚上RING3代码段最后一句,跳转到RING0
call SelectorCallGateTest:0 ;
准备一大堆,一句话就跳转了!RING3->RING0。从老幺一下权利跃升到老大!
评论暂时关闭