RING3到RING0
当我在说跳转时,说的什么?
CPU有很多指令,不是所有的指令都能够随时用,比如

ltr指令就不是随便什么时候能用,在保护模式下,如果你不安规则来执行指令,CPU就会抛出异常,比如你在INTEL手册上就能看到如下文本

意思据是说,如果你当前的CPL不是RING0,那么就会抛出GP(0)异常!
所以要正确使用这个指令,你就需要将CPL跳转到RING0来。这就是跳转!
RING3到RING0(用户态到内核态)的特权转变过程
首先得要有一个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 + DA_DPL3 ;DA_DPL3表明该代码段特权等级是RING3
3.为RING3代码段定义选择子
SelectorCodeRing3 equ LABEL_DESC_CODE_RING3 - LABEL_GDT + SA_RPL3 ;SA_RPL3表明该选择子的特权等级也是RING3
4.有了RING3的代码段,描述符,选择子,当然应该有RING0
[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。从老幺一下权利跃升到老大!
RING3到RING0的更多相关文章
- Ring3 和Ring0 解释
这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起.在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃.比如:清内存.设置时钟等.如果所有的程序都能使用这些 ...
- 64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.
一丶同步与互斥详解,以及实现一个进程监视软件. 1.用于线程同步的 KEVENT 事件很简单分别分为 事件状态. 以及事件类别. 事件状态: 有信号 Signaled 无信号 Non-signaled ...
- 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试
目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...
- 计算机操作系统处理机调度读后感—–关于进程概念的剖析。从RING3到RING0(32位操作系统)
计算机操作系统处理机调度读后感: 笔者在看操作系统西安电子科技大学那本书的时候,初次感觉本科教的不会太难,所以没有认真的看,但是随后这本书讲的刷新了我的世界观.这本书居然是ring0级别的,这时不禁吐 ...
- ring0 与 ring3 层之间的交互
在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoCon ...
- RING0,RING1,RING2,RING3
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果普 ...
- ring0与ring3通信方式
修改自: https://blog.csdn.net/wzsy/article/details/54929726 控制码方式详解: https://www.cnblogs.com/lsh123/p/7 ...
- Ring3创建事件Ring0设置事件
应用程序中创建的事件和在内核中创建的事件对象,本质上是同一个东西,在用户模式中,他用句柄表示,在内核模式下,他用KEVENT表示数据结构表示.在应用程序中,所有的内核对象都不会被用户看到,用户看到的知 ...
- 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?
ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断 ...
随机推荐
- error C2144: 语法错误:“int”的前面应有“;”
error C2144: 语法错误:"int"的前面应有";" C++- error C2144 syntax error : 'int' should be ...
- [转] Hibernate不能自动建表解决办法(hibernate.hbm2ddl.auto) (tables doesn't exist)
转自: http://blog.csdn.net/biangren/article/details/8010018 最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实 ...
- 使用CocoaLumberjack时,自定义的log文件名
CocoaLumberjack是一个功能丰富的第三方日志系统.其生成的log文件,默认是自动命名的,如果需要自定义文件名,重载两个函数即可. // Log.h#import "CocoaLu ...
- latex 输入矩阵
%以下函数可以写矩阵 %这个是放括号的矩阵 $A=\begin{bmatrix} 1&3\\ 3&3 \end{bmatrix}$ %这个是圆括号的矩阵 $A=\begin{pmatr ...
- location.assign()、location.href、location.replace(url)的不同
window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...
- JavaScript中创建对象的三种模式
JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返回. 缺点:创建的对象无法识别类型(全是Object) 2.构造函数模式: ...
- 7.24实习培训日志-Docker-Compose
Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...
- mooon模板的automake、autoconf、m4和libtool版本信息
autoconf --version autoconf (GNU Autoconf) 2.59 automake --version automake (GNU automake) 1.9.6 m4 ...
- C# 原码与补码的转换
/// <summary> /// 求一个16位数数的补码 /// </summary> /// <param name="OriginalCode" ...
- Git error: unable to create file xxx: Filename too long
一.问题描述 在使用 git 时,提示 error: unable to create file xxx: Filename too long error: unable to create file ...