当前位置: 首页 > news >正文

通过 SYSENTER/SYSEXIT指令来学习系统调用

SYSENTER指令—快速系统调用

 指令格式没有什么重要的内容,只有opcode ,没有后面的其他字段

指令的作用:

 执行快速调用到特权级别0的系统过程或例程。SYSENTER是SYSEXIT的配套指令。该指令经过优化,能够为从运行在特权级别3的用户代码到特权级别0的操作系统或执行过程的系统调用提供最大性能。

IA-32e模式下的 SYSENTER

在IA-32e模式下执行时,SYSENTER指令将逻辑处理器切换到64位模式;否则,逻辑处理器保持在保护模式.

切换的过程

在执行SYSENTER指令之前,先确定

1.特权级别0环的   代码段(CS)和代码入口点(EIP)

2.特权级别0环的   堆栈段(SS)和堆栈指针(ESP)

WRMSR指令 将以上的信息写入以下模型特定寄存器(MSR)中

  • IA32_SYSENTER_CS (MSR地址174H) — 该MSR的低16位是特权级别0代码段的段选择子(Segment Selector)。该值还用于确定特权级别0堆栈段的段选择符(参见操作部分)。此值不能表示空选择符(Null Selector)。

  • IA32_SYSENTER_EIP (MSR地址176H) — 该MSR寄存器保存的值被加载到RIP中(因此,该值引用了所选函数的第一条指令)。在保护模式下,仅加载位31:0。

  • IA32_SYSENTER_ESP (MSR地址175H) — 该MSR的值被加载到RSP中(因此,该值包含特权级别0环的堆栈的ESP)。此值不能表示非规范地址(Non-Canonical Address)。在保护模式下,仅加载位31:0。

虽然 SYSENTER 使用 IA32_SYSENTER_CS MSR 中的值来设置 CSSS 段选择符,但 CSSS 的描述符缓存不会从这些选择符所对应的描述符(位于 GDT 或 LDT)中加载。相反,描述符缓存会加载一组固定值。详细信息请参见操作部分。操作系统有责任确保选择符所对应的描述符(位于 GDT 或 LDT)与加载到描述符缓存中的固定值一致;SYSENTER 指令不保证这种对应性。

 可以通过RDMSR指令 读取MSR寄存器的内容  WRMSR/RDMSR指令=都属于特权级别(0环)指令

需要遵循的约定:

  • 特权级别0代码段和堆栈段以及特权级别3代码段和堆栈段的段描述符必须在描述符表中连续。这种约定允许处理器根据SYSENTER_CS_MSR MSR中输入的值计算段选择符。

  • 用户代码执行的快速系统调用“存根”例程(通常位于共享库或DLL中)必须保存所需的返回IP和处理器状态信息,以便在需要返回到调用过程时使用。同样,通过SYSENTER指令调用的操作系统或执行过程在返回到用户代码时必须能够访问并使用这些保存的返回和状态信息。
     

Operation(伪代码)

IF CR0.PE = 0 OR IA32_SYSENTER_CS[15:2] = 0 THEN #GP(0); FI;
如果 CR0 寄存器的 PE(保护使能,Protection Enable)位为 0(表示处理器未处于保护模式)或 IA32_SYSENTER_CS MSR(模型特定寄存器)寄存器的位 15 到 2 为 0,处理器将触发一般保护异常 #GP,且错误码为 0RFLAGS.VM := 0;    (* 确保保护模式执行 *)
RFLAGS.IF := 0;    (* 屏蔽中断 *)
IF in IA-32e mode  THEN            (* 如果在IA-32e处理器模式 *)RSP := IA32_SYSENTER_ESP;RIP := IA32_SYSENTER_EIP;ELSE            (*不在IA-32e模式下*)ESP := IA32_SYSENTER_ESP[31:0];EIP := IA32_SYSENTER_EIP[31:0];
FI;(*if语句结束*)CS.Selector := IA32_SYSENTER_CS[15:0] AND FFFCH; (* 操作系统提供 CS;强制 RPL 为 0 *)(* 将 CS 的其余部分设置为固定值 *)CS.Base := 0; (* 平坦段 *)
CS.Limit := FFFFFH; (* 具有4KB粒度,表示4GB限制 *)
CS.S := 1;     (*数据或代码段*)
CS.Type := 11; (* 执行/读取已访问 代码段*)
CS.DPL := 0;
CS.P := 1;IF in IA-32e modeTHEN        (*如果在IA32-e架构下)CS.L := 1; (* 进入64位模式 *)CS.D := 0; (* 若 CS.L = 1 时必需设置 *)ELSE        (X86架构下)CS.L := 0;CS.D := 1; (* 32位代码段 *)
FI; (*if语句结束*)CS.G := 1;(* 4KB粒度 *)CPL := 0;
SS.Selector := CS.Selector + 8;(* SS 紧接在 CS 之上 *)(*将SS的剩余部分设置为固定值*)SS.Base := 0; (* 平坦段 *)
SS.Limit := FFFFFH; (* 具有4KB粒度,表示4GB限制 *)
SS.Type := 3;(* 读/写数据,已访问 *)
SS.S := 1;
SS.DPL := 0;
SS.P := 1;
SS.B := 1; (* 32位堆栈段 *)
SS.G := 1; (* 4KB粒度 *)

SYSEXIT指令--快速系统调用的快速返回

 1.快速返回到特权级别3的用户代码。

2.快速返回到64位模式特权级别3的用户代码。

 指令的作用:

执行快速返回到特权级别3的用户代码。SYSEXIT 是 SYSENTER 指令的配套指令。此指令经过优化,旨在为从特权级别0的系统过程返回到特权级别3的用户过程提供最高性能。它必须从特权级别0的代码执行。
 

不同模式下指令的行为:

1.如果 SYSEXIT 指令在64位模式下并使用64位操作数(REX.W前缀),它将继续保持在64位模式下运行。这意味着当 SYSEXIT 执行返回时,处理器将保持在64位模式下。
2.如果没有使用64位操作数大小,那么 SYSEXIT 的行为会根据逻辑处理器的模式而不同:

  • 如果逻辑处理器处于 IA-32e 模式:即如果处理器当前在 IA-32e 模式下(即启用了64位模式),但 SYSEXIT 指令没有使用64位操作数,它将返回到兼容模式(Compatibility Mode)。兼容模式允许32位应用在64位操作系统上运行,这样操作系统可以在保持64位模式的情况下,执行32位代码。

  • 如果处理器不在 IA-32e 模式下:即处理器在普通的保护模式 (Protected Mode) 下,则 SYSEXIT 返回时保持在保护模式。

指令的执行流程:

在执行 SYSEXIT 之前,软件必须通过写入以下 MSR 和通用寄存器来指定特权级别3代码段和代码入口点,以及特权级别3的堆栈段和堆栈指针:

  • IA32_SYSENTER_CS (MSR 地址174H) —— 包含一个32位值,用于确定特权级别3代码段和堆栈段的段选择符(参见操作部分)。
  • RDX —— 此寄存器中的规范地址加载到 RIP 中(因此该值指向将在用户代码中执行的第一条指令)。如果返回时不处于64位模式,仅加载位31:0。
  • ECX —— 此寄存器中的规范地址加载到 RSP 中(因此该值包含特权级别3堆栈的堆栈指针)。如果返回时不处于64位模式,仅加载位31:0。

IA32_SYSENTER_CS MSR 可以使用 RDMSR 和 WRMSR 进行读写。

伪代码

IF IA32_SYSENTER_CS[15:2] = 0 OR CR0.PE = 0 OR CPL ≠ 0 THEN #GP(0); FI;IF operand size is 64-bitTHEN (* Return to 64-bit mode *)RSP := RCX;RIP := RDX;ELSE (* Return to protected mode or compatibility mode *)RSP := ECX;RIP := EDX;
FI;IF operand size is 64-bit (* Operating system provides CS; RPL forced to 3 *)THEN CS.Selector := IA32_SYSENTER_CS[15:0] + 32;ELSE CS.Selector := IA32_SYSENTER_CS[15:0] + 16;
FI;CS.Selector := CS.Selector OR 3; (* RPL forced to 3 *)
(* Set rest of CS to a fixed value *)
CS.Base := 0; (* Flat segment *)
CS.Limit := FFFFFH; (* With 4-KByte granularity, implies a 4-GByte limit *)
CS.Type := 11; (* Execute/read code, accessed *)
CS.S := 1;
CS.DPL := 3;
CS.P := 1;IF operand size is 64-bitTHEN (* return to 64-bit mode *)CS.L := 1; (* 64-bit code segment *)CS.D := 0; (* Required if CS.L = 1 *)ELSE (* return to protected mode or compatibility mode *)CS.L := 0;CS.D := 1; (* 32-bit code segment*)
FI;CS.G := 1; (* 4-KByte granularity *)
CPL := 3;
IF ShadowStackEnabled(CPL)THEN SSP := IA32_PL3_SSP;
FI;
SS.Selector := CS.Selector + 8; (* SS just above CS *)
(* Set rest of SS to a fixed value *)
SS.Base := 0; (* Flat segment *)
SS.Limit := FFFFFH; (* With 4-KByte granularity, implies a 4-GByte limit *)
SS.Type := 3; (* Read/write data, accessed *)
SS.S := 1;
SS.DPL := 3;
SS.P := 1;
SS.B := 1; (* 32-bit stack segment*)
SS.G := 1; (* 4-KByte granularity *)

解释: 

特权级别0代码段和堆栈段以及特权级别3代码段和堆栈段的段描述符必须在描述符表中连续

 总结:

通过sysenter指令,切换特权级别时,CPU不会保存任何寄存器的值,并且会修改elfags寄存器的IF位.
通过sysexit指令返回时,将读取msr174的 3环选择子,设置cs段寄存器,通过cs段选择子+8的位置就是3环的ss段选择子.RDX 的值加载到EIP,RCX的值加载到ESP中.
所有其他的寄存器 需要操作系统软件保存,并且在特权级别0 能够访问到这块内存

相关文章:

通过 SYSENTER/SYSEXIT指令来学习系统调用

SYSENTER指令—快速系统调用 指令格式没有什么重要的内容,只有opcode ,没有后面的其他字段 指令的作用: 执行快速调用到特权级别0的系统过程或例程。SYSENTER是SYSEXIT的配套指令。该指令经过优化,能够为从运行在特权级别3的用户代码到特权级别0的操作系统或执行过程…...

Nginx开发实战——网络通信(一)

文章目录 Nginx开发框架信号处理函数的进一步完善(避免僵尸子进程)(续)ngx_signal.cxxngx_process_cycle.cxx 网络通信实战客户端和服务端1. 解析一个浏览器访问网页的过程2.客户端服务器角色规律总结 网络模型OSI 7层网络模型TCP/IP 4层模型3.TCP/IP的解释和比喻 最…...

w外链如何跳转微信小程序

要创建外链跳转微信小程序,主要有以下几种方法: 使用第三方工具生成跳转链接: 注册并登录第三方外链平台:例如 “W外链” 等工具。前往该平台的官方网站,使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…...

获取平台Redis各项性能指标

业务场景 在XXXX项目中把A网的过车数据传到B网中,其中做了一个业务处理,就是如果因为网络或者其他原因导致把数据传到B网失败,就会把数据暂时先存到redis里,并且执行定时任务重新发送失败的。 问题 不过现场的情况比较不稳定。出…...

STM32 HAL 点灯

首先从点灯开始 完整函数如下: #include "led.h" #include "sys.h"//包含了stm32f1xx.h(包含各种寄存器定义、中断向量定义、常量定义等)//初始化GPIO口 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开…...

【http作业】

1.关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld #关闭防火墙 [rootlocalhost ~]# setenforce 0 2.下载nginx包 [rootlocalhost ~]# mount /dev/sr0 /mnt #挂载目录 [rootlocalhost ~]# yum install nginx -y #下载nginx包 3.增加多条端口 [rootlocalhost ~]# n…...

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…...

简述MCU微控制器

目录 一、MCU 的主要特点: 二、常见 MCU 系列: 三、应用场景: MCU 是微控制器(Microcontroller Unit)的缩写,指的是一种小型计算机,专门用于嵌入式系统。它通常集成了中央处理器(…...

微服务的雪崩问题

微服务的雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路种的所有微服务都不可用。这就是微服务的雪崩问题。(级联失败),具体表现出来就是微服务之间相互调用,服务的提供者出现阻塞或者故障&#x…...

Java基础(4)——构建字符串(干货)

今天聊Java构建字符串以及其内存原理 我们先来看一个小例子。一个是String,一个是StringBuilder. 通过结果对比,StringBuilder要远远快于String. String/StringBuilder/StringBuffer这三个构建字符串有什么区别? 拼接速度上,StringBuilder…...

logback日志脱敏后异步写入文件

大家项目中肯定都会用到日志打印,目的是为了以后线上排查问题方便,但是有些企业对输出的日志包含的敏感(比如:用户身份证号,银行卡号,手机号等)信息要进行脱敏处理。 哎!我们最近就遇到了日志脱敏的改造。可…...

电容的基本知识

1.电容的相关公式 2.电容并联和串联的好处 电容并联的好处: 增加总电容值: 并联连接的电容器可以增加总的电容值,这对于需要较大电容值来滤除高频噪声或储存更多电荷的应用非常有用。 改善频率响应: 并联不同的电容值可以设计一个滤波器,以在特定的频率范围内提供更好的滤…...

【Axure高保真原型】分级树筛选中继器表格

今天和大家分享分级树筛选中继器表格的原型模板,点击树的箭头可以展开或者收起子级内容,点击内容,可以筛选出该内容及子级内容下所有的表格数据。左侧的树和右侧的表格都是用中继器制作的,所以使用也很方便,只需要在中…...

STM32 I2C通信:硬件I2C与软件模拟I2C的区别

文章目录 STM32 I2C通信:硬件I2C与软件模拟I2C的区别。一、硬件I2C速度快:实现简单:稳定性好: 二、软件模拟I2C灵活性高:支持多路通信: 三、选择哪种方式? STM32 I2C通信:硬件I2C与软…...

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境: 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后,可以尝试使用 su 切换到 tang 用户,确保该用户可以正常使用&#…...

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的,得自己一步步搭建。 这次讲如何发送图片消息,选择图片,显示图片消息。 还是有点难度的,好好看,好好学。 一、思路: 选择图片用:photoVie…...

音视频入门基础:AAC专题(11)——AudioSpecificConfig简介

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...

OpenCV基本操作(python开发)——(8)实现芯片瑕疵检测

OpenCV基本操作(python开发)——(1) 读取图像、保存图像 OpenCV基本操作(python开发)——(2)图像色彩操作 OpenCV基本操作(python开发)——(3&…...

聚水潭商品信息集成到MySQL的高效解决方案

聚水潭商品信息集成到MySQL的技术案例分享 在数据驱动的业务环境中,如何高效地实现不同系统之间的数据对接和集成,是每个企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例:将聚水潭平台上的商品信息单集成到BI斯莱蒙的MySQL数据…...

# centos6.5 使用 yum list 报错Error Cannot find a valid baseurl for repo bas 解决方法

centos6.5 使用 yum list 报错Error Cannot find a valid baseurl for repo bas 解决方法 一、问题描述: centos6.5 使用 yum list 报错Error Cannot find a valid baseurl for repo bas 如下图: 二、问题分析: 官方已停止对CentOS 6的更…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...