初步探索CPU特权级别
0 引言
本文是在linux系统编程中所沉淀。主要从代码层面出发,直觉感受CPU特权级别的作用,然后初步讲解CPU特权级别的概念。
1 反汇编代码
本部分从两个代码示例出发。
反汇编代码访问RAX寄存器的内容,其代码示例如下
#include <iostream>
#include <cstdlib>
#include <cstdint>int64_t get_rcx() {asm volatile("push %rcx\n\t""movq $10, %rcx\n\t""movq %rcx, %rax\n\t");asm volatile("pop %rcx");
}int main() {std::cout << "Hello, inline assembly: [RCX] = " << get_rcx() << "\n";return 0;
}
上述输出结果为
Hello, inline assembly: [RCX] = 10
反汇编访问CR0控制寄存器,其代码如下
int64_t get_cr0() {asm volatile ("movq %cr0, %rax");
}int main() {std::cout << "Hello, inline assembly: [CR0] = " << get_cr0() << "\n";return 0;
}
其输出结果如下
Segmentation fault (core dumped)
那么,为什么应用程序访问cr0控制寄存器会coredump呢?
2 CPU特权级
出于操作系统及其控制的硬件资源的安全性、稳健性和正确性等原因,所有现代 CPU 都包含特权级别的概念。
现代 CPU 将支持至少两个特权级别或模式,通常由如下两部分构成:
- 特权(Supervisor)
- 用户
代码(即机器指令)在 CPU 上以给定的特权级别或模式运行。 设计和实现操作系统的人可以自由地利用处理器特权级别。 这正是现代操作系统的设计方式。 下表总结了通用 CPU 特权级别
权限级别或模式名称 |
特权级别 |
目的 |
术语 |
特权 |
高 |
内核代码跑在此层 |
内核空间 |
用户 |
低 |
用户代码跑在此层 |
用户空间 |
下面以x86架构讲解CPU的特权级别(ring), 英特尔处理器支持四种特权层级,分别为
- ring0
- ring1
- ring2
- ring3
上图箭头方向 特权级别逐渐升高 ,ring0特权级别最高,内核代码运行在此;ring3特权级别最低,应用程序在此。
为了进一步理解CPU特权级别,需要明白当前特权级别的概念,也即CPL。
当前特权级别 (CPL) :处理器当前执行代码的特权级别。
譬如,在一个处理器上有如下两条指令
- 机器指令a有特权级别(Ring0)
- 机器指令b有用户特权级别(Ring3)
因此,对于执行这些机器指令的正在运行的应用程序,会出现下表所示现象
机器指令 |
允许特权 |
CPL |
是否work |
a |
特权(0) |
0 |
是 |
3 |
否 |
||
b |
用户(3) |
0 |
是 |
3 |
是 |
故可知,高特权级可以使用低特权层级,而低特权层级无法运行高特权层级的指令。
故在第一部分会出现CR0寄存器时,出现coredump。
4 总结
本文针对cpu特权层级进行了初步讲解,通过本文可以初步明白cpu特权级别(内核态,用户态)相关概念。
初步探索CPU特权级别相关推荐
- Intel X86 CPU之特权级别
Intel的X86处理器具有四个特权级别,分别是RING0.RING1.RING2.RING3,RING0层拥有最高权限,依此向下RING3层即拥有最低的权限. 应用程序工作在RING3层,就只能访问 ...
- 电子游戏理论基础知识的初步探索(转)
电子游戏理论基础知识的初步探索(转)[@more@] 抛砖引玉,请读者指正. 一.游戏(Game) 约翰?赫伊津哈和弗里德里?希格奥尔格?容格尔在<游戏的人>(1938年)和<玩游戏 ...
- Cortex-M3的工作模式和特权级别
文章目录 1 Cortex-M3的工作模式和特权级别 1.1 工作模式和权限级别分类 1.2 特权级别的切换 1 Cortex-M3的工作模式和特权级别 1.1 工作模式和权限级别分类 处理器的工作模 ...
- python socket发送数组_利用pyprocessing初步探索数组排序算法可视化
[经过两次更新,功能基本完成]最终效果请直接下拉到最后一个视频观看 背景说明 这篇文章旨在初步探索利用pyprocessing的强大的可视化功能,以及pyprocessing和Ipython之间的本地 ...
- Cortex-M3操作模式和特权级别
Cortex-M3支持两种操作模式,还支持两种特权级别: 两种模式为handler模式和线程(thread)模式,这两种模式是为了区别正在执行代码的类型:handler模式为异常处理例程的代码:线 ...
- 带你探索CPU调度的奥秘
摘要:本文将会从最基础的调度算法说起,逐个分析各种主流调度算法的原理,带大家一起探索CPU调度的奥秘. 本文分享自华为云社区<探索CPU的调度原理>,作者:元闰子. 前言 软件工程师们总习 ...
- Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索
Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...
- Redis主从复制架构初步探索 http://www.sxt.cn/info-1750-u-324.html#SXT_h2_11
Redis主从复制架构初步探索 目录http://www.sxt.cn/info-1750-u-324.html#SXT_h2_11 · 一.主从复制架构简介 · 1.1 源于关系数据库的读写分离 ...
- 企查查app sign算法破解初步探索
企查查app sign算法破解初步探索 之前有说过企查查的sign的解密,但这次是企查查app的sign算法破解,目前是初步进程. 目前我们需要做查壳,具体方法可以百度搜索,企查查用的360加固,很简 ...
最新文章
- SpringSecurity学习:1(第一个SpringSecurity项目)
- 计算机系统验证课件,回顾性验证及再验证简介(ppt 42页)
- python【力扣LeetCode算法题库】2-两数相加
- Python知识:opencv实现的直方图
- OpenGL HDR渲染
- 一.JavaScript基础
- 简单的ViewPager了解Scroller类
- 字节字符区别Java_【JAVA基础】字符数组与字节数组的区别
- 【PAT - 甲级1017】Queueing at Bank (25分)(优先队列,模拟)
- javascript浮点数学习总结之0.1+0.2
- [debug] 延长Linux中sudo密码在终端的有效时间
- 帧中继多点子接口下配置OSPF
- 一篇文章了解数据库系统
- 数据分析 超市条码_深圳超市通道摆闸常见故障解决|指示灯|摆闸|通道|限位
- 改变this指向的方法
- 如何让新建网站被搜索引擎快速收录
- 光猫是什么?光纤猫的工作原理及应用范围介绍!
- 「TJOI 2018」碱基序列
- Codeforces Round #817 (Div. 4)
- python爬虫导入自己事先定义好的配置文件,在服务器运行出现ImportError: No module named 'a005_BanGuMi_spider_subject' 错误