切换至低特权级

x86权限简介

x86芯片支持四种特权级:第0级权限最高,用于运行操作系统:第3级权限最低,用于运行应用程序;其它两级用于运行操作系统服务(可选)。

image-20241212213118415

2,3等级用的少

Snipaste_2024-12-13_09-50-10

权限检查时,会综合比较CPL、RPL、DPL的值。当不符合检查规则时,存储访问将出现异常。

CPL字段指定是按照什么特权级执行的,RPL是放在DS,SS这些其他的寄存器中,因为x86这个权限划分实在是太复杂了,所以我们将操作系统代直接设定在Level 0这个特权级,然后建两个进程,这两个进程运行在特权级3这个模式下

系统上电,到进入到保护模式,到初始化之后,整个系统默认是运行在Level 0这个地方,怎么实现0特权级切换到进程的特权级3

因为内核代码段和内核数据段都是运行在特权级0,所以我们需要重新建立一个特权级为3的数据段和代码段

//os.h
#define APP_CODE_SEG            ((3 * 8) | 3)       // 特权级3
#define APP_DATA_SEG            ((4 * 8) | 3)       // 特权级3
//os.c
struct {uint16_t limit_l, base_l, basehl_attr, base_limit;}gdt_table[256] __attribute__((aligned(8))) = {// 0x00cffa000000ffff - 从0地址开始(平坦模型),P存在,DPL=3,Type=非系统段,32位代码段,界限4G[APP_CODE_SEG/ 8] = {0xffff, 0x0000, 0xfa00, 0x00cf},// 0x00cff3000000ffff - 从0地址开始,P存在,DPL=3,Type=非系统段,数据段,界限4G,可读写[APP_DATA_SEG/ 8] = {0xffff, 0x0000, 0xf300, 0x00cf},
};
//Start.S
_start_32:
、、、、、、
// 下面模拟中断返回,从而实现从特权级0到特权级3的变化
// 中断发生时,会自动压入原SS, ESP, EFLAGS, CS, EIP到栈中
push $APP_DATA_SEG //SS
push $task0_dpl3_stack + 1024	// 特权级3时的栈,ESP
push $0			// 中断暂时关掉 0x202						// EFLAGS格式
push $APP_CODE_SEG				// CPL=3时的选择子,CS
push $task_0_entry					// eip
iret							// 从中断返回,将切换至任务0,到了特权级3
、、、、、、
task_0_entry: //进程,需要运行在特权级3的位置// 进入任务0时,需要重设其数据段寄存器为特权级3的mov %ss, %axmov %ax, %dsmov %ax, %esjmp task_0			// 跳转到任务0运行

切换到进程0, 我们不能采用jmp直接跳过去, 这样改变不了特权级

假设我们是在特权级3下面运行这个task_0_entry,结果发生了中断,然后就会从特权级3的栈切换到特权级0的栈,并且特权级0栈里面保存特权级3发生中断时候的各种状态像SS,ESP等,然后进特权级0状态时候运行的中断处理程序

Snipaste_2024-12-13_22-21-56

当执行iret的时候,CPU会执行一些出栈的操作,将SS,ESP,EFLAGS等弹回到对应的寄存器中去(回到特权级3模式),那么我们关注一下这个EIP寄存器,我们可以将EIP寄存器的值设置为task0这个函数的地址,CS设置为task0代码段对应的寄存器,EFLAGS也可以对应的设置,ESP设置为task0当前的栈指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏如何应对模拟器作弊

模拟器是指能在PC端模拟出安卓手机系统的软件,市面上比较常见的安卓模拟器有:雷电模拟器、MuMu模拟器、夜神模拟器等。 市面上常见的模拟器 模拟器既可以节省手机内存空间,避免长时间玩游戏手机发烫发热的尴尬,也可以用键盘鼠标对…

Ubuntu环境下搭建区块链FISCO BCOS节点和WeBASE

说明: 1.搭建的是webase-deploy并不是webase-front 2.根据本文档由于ubuntu版本的不同,可能会造成一些小的问题发生,自行解决 如:java环境变量;数据库权限、密码等。 (一)搭链 参考文档:WeBASE管理平台 — FISCO BCOS 2.0 v2.11.0 文档 1.安装依赖: sudo apt i…

22. 正则表达式

一、概述 正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则&…

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等,这些和咱们有关系吗!!不好意思,走错片场了,刚和项目经理在甲方那边吹牛B想想刚刚的大饼,看看支付宝余额&#xff…

GFPS扩展技术原理(一)消息流

消息流作用 Google fast pair service要求Provider提供一个额外得通道以便seeker寻求建立连接,连接建立后,Seeker就可以向Provider发送一串数据流,这样做的目的是为了支持GFPS Extension,也就是扩展的GFPS,主要涉及一…

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP(推流)这几种协议接入,目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入,我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步:萤石摄像机开启 萤石设备默…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

LeetCode hot100-69-N

https://leetcode.cn/problems/valid-parentheses/description/?envTypestudy-plan-v2&envIdtop-100-liked 20. 有效的括号 已解答 简单 相关标签 相关企业 提示 给定一个只包括 (,),{,},[,] 的字符串 s &#x…

Docker 中使用 PHP 通过 Canal 同步 Mysql 数据到 ElasticSearch

一、Mysql 的安装和配置 1.使用 docker 安装 mysql,并且映射端口和 root 账号的密码 # 获取镜像 docker pull mysql:8.0.40-debian# 查看镜像是否下载成功 docker images# 运行msyql镜像 docker run -d -p 3388:3306 --name super-mysql -e MYSQL_ROOT_PASSWORD12…

【深度学习量化交易6】优化改造基于miniQMT的量化交易软件,已开放下载~(已完成数据下载、数据清洗、可视化模块)

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现 股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易软件。 之前写到,目前我已经完成了数据下载、数据清洗和数据可视化…

【开发情景】数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端

数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端 方法一(最详细): 一、解析JSON数据:使用 JSON 库将字符串解析为 Map。 1、从数据库读取 JSON 字符串:2、使…

Node.js EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都…

SpringBoot 项目使用 EasyExcel 插件构建 Excel 表格格式(行高、列宽和字体等)工具类

本文主要讲了如何使用 EasyExcel 插件&#xff0c;在导出 Excel 时&#xff0c;设置行高&#xff0c;列宽&#xff0c;表头格式&#xff0c;内容字体大小等工具类。 1、代码使用的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyex…

Ubuntu18安装后基本配置操作

1. 关掉自动更新 不关掉自动更新&#xff0c;会将你的ubuntu系统更新到更高版本&#xff0c;一些配置就不能用了&#xff0c;所以要关掉自动更新。在“软件和更新”中将“自动检查更新”设置为从不。 2. ubuntu换国内源 参考链接换源 按照这个换源这个换源好使 &#xff0c;…

《探索C++在3D重建中的算法与技术要点》

3D重建作为计算机视觉领域的重要技术&#xff0c;在诸多行业有着广泛应用&#xff0c;而C以其高效性和对底层硬件的良好控制&#xff0c;成为实现3D重建算法的常用语言。以下是利用C进行3D重建的一些常见算法和技术要点。 多视图立体视觉算法 多视图立体视觉是3D重建的基础算…

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一&#xff0c;自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop&#xff0c;从其起源、核心架构、关键组件&#xff0c;到典型应用场景&#xff0c;并结合代码示例和图示&#xff0c;帮助您更好地掌握Hadoop的实战…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…

Django 与 Flask 框架深度剖析

一、框架概述 起源与发展 Django&#xff1a; 诞生于新闻应用开发环境&#xff0c;旨在快速构建复杂、数据库驱动的网站。由 Django 软件基金会维护&#xff0c;拥有庞大的社区支持&#xff0c;持续更新迭代。其发展遵循稳定、功能丰富的路线&#xff0c;注重安全性与可扩展性的…

JAVA:建造者模式(Builder Pattern)的技术指南

1、简述 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍建…

MFC改变对话框控件字体

代码如下,加到对话框的OnInitDialog()成员函数, CButton* pButton = (CButton*)GetDlgItem(IDOK);LOGFONT lf;ZeroMemory(&lf, sizeof(LOGFONT));lf.lfHeight = 25; // 字体高度lf.lfWidth = 0; // 字体平均宽度lf.lfEscapement = 0…