首页 > 其他分享 >chapter3------保护模式之特权级转移

chapter3------保护模式之特权级转移

时间:2024-07-30 17:07:16浏览次数:15  
标签:保护模式 DD 特权 chapter3 LABEL 堆栈 描述符 ------ TSS

特权级

特权级总共有4个级别,数字越小表示的特权级越大

特权级

  • CPL - Current Privilege Level(当前特权级):用于指示处理器当前运行的特权级别
  • DPL - Descriptor Privilege Level(描述符特权级):用于指示段描述符或门描述符的特权级别。每个段描述符或门描述符都有一个DPL字段,它决定了访问该段或门的特权级别限制
  • RPL - Requested Privilege Level(请求特权级):这是指x86架构中在进行段选择器加载或者调用门调用时,请求访问某个段或门时指定的特权级别
    • RPL指定了进程在访问某个段或门时所希望的特权级别,它可以是0、1、2或3,与CPL进行比较决定是否允许访问

特权级转移

  • 通过jmp或call进行直接转移
    • 目标为非一致代码段:CPL=DPL 且 RPL<=DPL
    • 目标为一致代码段:CPL>=DPL
  • 运用门描述符
    • 调用门 (Call gates)
    • 中断门 (Interrupt gates)
    • 陷阱门 (Trap gates)
    • 任务门 (Task gates)

门描述符

  • 门描述符结构

门描述符

  • 门描述符定义
; 门
; usage: Gate Selector, Offset, DCount, Attr
;        Selector:  dw
;        Offset:    dd
;        DCount:    db
;        Attr:      db
%macro Gate 4
    dw  (%2 & 0FFFFh)               ; 偏移1
    dw  %1                          ; 选择子
    dw  (%3 & 1Fh) | ((%4 << 8) & 0FF00h)   ; 属性
    dw  ((%2 >> 16) & 0FFFFh)        ; 偏移2
%endmacro ; 共 8 字节

通过调用门进行有特权级变换的转移

特权级变换的转移的复杂之处,不但在于严格的特权级检验,还在于特权级变化的时候,堆栈也要发生变化

由于每一个人物最多都可能在4个特权级间转移,所以每个任务实际上需要4个堆栈

自身已经有了一个ss和esp,当发生堆栈切换时,从TSS(Task-State Stack)这个数据结构中获得

TSS 偏移4到偏移27的字段中存储另外3个堆栈的信息
tss

  • 低--->高:通过调用门和call指令实现

步骤:

  1. 准备好TSS信息(TSS数据结构的字段信息---新堆栈、描述符、选择子的初始化)
; TSS数据结构的字段信息---新堆栈
[SECTION .tss]
ALIGN   32
[BITS   32]
LABEL_TSS:
         DD  0           ; Back
         DD  TopOfStack      ; 0 级堆栈
         DD  SelectorStack   ; 
         DD  0           ; 1 级堆栈
         DD  0           ; 
         DD  0           ; 2 级堆栈
         DD  0           ; 
         DD  0           ; CR3
         DD  0           ; EIP
         DD  0           ; EFLAGS
         DD  0           ; EAX
         DD  0           ; ECX
         DD  0           ; EDX
         DD  0           ; EBX
         DD  0           ; ESP
         DD  0           ; EBP
         DD  0           ; ESI
         DD  0           ; EDI
         DD  0           ; ES
         DD  0           ; CS
         DD  0           ; SS
         DD  0           ; DS
         DD  0           ; FS
         DD  0           ; GS
         DD  0           ; LDT
         DW  0           ; 调试陷阱标志
         DW  $ - LABEL_TSS + 2   ; I/O位图基址
         DB  0ffh            ; I/O位图结束标志
TSSLen      equ $ - LABEL_TSS

     ; 初始化 TSS 描述符
     xor eax, eax
     mov ax, ds
     shl eax, 4
     add eax, LABEL_TSS
     mov word [LABEL_DESC_TSS + 2], ax     ; LABEL_DESC_TSS为TSS的描述符
     shr eax, 16
     mov byte [LABEL_DESC_TSS + 4], al
     mov byte [LABEL_DESC_TSS + 7], ah

  1. 加载TSS
; Load TSS
mov ax, SelectorTSS
ltr ax  ; 在任务内发生特权级变换时要切换堆栈,而内层堆栈的指针存放在当前任务的TSS中,所以要设置任务状态段寄存器 TR。

假设由代码A到代码B,运用一个调用门G
规则

  • 高--->低:通过带参数的ret指令实现

步骤:

  1. 准备好代码段和堆栈段(描述符、选择子的初始化)
  2. 准备好目标代码段的cs、eip以及ss、esp(依次将ss、esp、cs、eip压入栈中)
push    SelectorStack3        ; ss,堆栈段的选择子
push    TopOfStack3           ; esp
push    SelectorCodeRing3     ; cs,代码段的选择子
push    0                     ; eip
retf                          ; Ring0 -> Ring3
  1. 执行retf 指令

标签:保护模式,DD,特权,chapter3,LABEL,堆栈,描述符,------,TSS
From: https://www.cnblogs.com/winter-z/p/18332612

相关文章

  • DAY12 二叉树part02
     今日任务二叉树的对称性翻转二叉树二叉树的最大/小深度(递归法)226.翻转二叉树(优先掌握递归)题目链接/文章讲解/视频讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html1/**2*Definitionforabinarytreenode.3*s......
  • 深度学习中的一些基础函数
    激活函数概念神经网络中每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传给下一层。在多层神经网络中,上层节点的输入在加权求和后与下层节点的输入之间具有一个函数关系,这个函数称为激活函数。   激活函数的作用常见激活函数  Sigmoid函......
  • windows下jdk版本切换(bat)
    1.jdk下载Oracle官网https://www.oracle.com/cn/资源->下载->Java下载jdk当前最新版本jdk22版本jdk8版本当前页面向下拉2.脚本如下:点击查看代码@echooffchcp65001>nulecho****************jdkchangeutil*************************echo此操作需要管理员权......
  • 如何将 panda 日期时间转换为特定日期格式,然后从中提取子字符串
    我在熊猫中有这个日期时间列。我正在将其转换为特定的日期格式。我想将此日期转换为字符串并从中提取子字符串。我发现很难做到。有谁知道如何。我的日期时间列中的数据如下所示:2024-01-3013:45:002024-01-3014:45:002024-01-3015:45:00我已使用以下语句将其转换......
  • C++11 中引入的auto关键字
    什么是auto关键字?    在C++11中,auto关键字被引入作为一种类型推断的机制(在编译期间执行),它允许编译器自动推断变量的类型。auto使用时需要注意的问题:1、auto与指针和引用结合使用:首先说一下auto和auto*为什么一样,因为在autoa=&x;这里auto类型推......
  • 《饿殍:明末千里行》PC+手机版分享,高达97%的好评率。
    《饿殍:明末千里行》是由零创游戏开发的一款文字冒险游戏,获得了高达97%的好评率,游戏以明末旅行为主题,玩家将扮演一名名为“良”的盗匪,任务是将四名女孩从华州城运送至洛阳城。在这个过程中,玩家将逐渐揭开真相并面临重要的选择。游戏的背景设定在明末崇祯年间,这个时期正值国家内......
  • MySQL存储引擎MyISAM和InnoDB
    目录1.1MySQL存储引擎1.1.1什么是存储引擎1.1.2MySQL5.7支持的引擎1.1.3如何选择MySQL引擎1.1.4可以根据以下的原则来选择MySQL存储引擎 1.1.5MyISAM和InnoDB的区别1.MyISAM存储引擎2.InnoDB存储引擎1.1.6关于MyISAM与InnoDB选择使用1.1.7.修改默认......
  • 【往届会后三个半月内EI检索 | EI会议征稿 】第四届物联网与机器学习国际学术会议(IoTM
     第四届物联网与机器学习国际学术会议(IoTML2024)20244th InternationalConferenceonInternetofThingsandMachineLearning重要信息大会时间:2024年8月9-11日         大会地点:中国-南昌        大会官网:www.iotml.cn   会......
  • 每次更新模型/字段时,如何在运行时延迟计算某些属性?
    我正在学习pydantic,我希望了解Python类及其属性与pyndatic模型之间的交互。特别是,我希望定义一些实例变量,这些实例变量在创建模型后以及每次创建模型时在运行时延迟计算模型或特定字段已更新。这里有一个小的播放代码片段。问题是:每次更改生日或年龄(假设可以根据给......
  • ThreadLocal和内存泄漏原理
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、ThreadLocal原理二、ThreadLocal内存泄漏三、为什么使用弱引用?总结前言复杂事简单说:ThreadLocal一、ThreadLocal原理每一个线程绑定一个ThreadLocalMap,里面存放该线程自己的数据,......