首页 > 其他分享 >chapter12------存储器的保护

chapter12------存储器的保护

时间:2024-08-15 17:05:25浏览次数:13  
标签:32 存储器 mov 代码段 描述符 指令 chapter12 ------ ds

进入32位保护模式

指令前缀的添加

在前面的章节中,我们介绍了指令前缀 0x66 表示反转默认的操作数大小

  [bits 16]
  mov ds, ax   ; 8E D8

  [bits 32]
  mov ds, ax   ; 66 8E D8

所以在上述这段代码中,32位下的代码生成的机器指令会带有 0x66 的前缀

这里有一个问题,那就是 对于有前缀的指令,处理器在执行时会多花一个额外的时钟周期,一旦这样的指令用得频繁,会导致处理器执行速度下降

当然,我们在32位下使用eax而不是ax就不会添加指令前缀了

不过,在NASM编译器中,不管处理器模式和指令形式如何变化,编译的结果都一样哦

  [bits 16]
  mov ds, ax   ; 8E D8
  mov ds, eax  ; 8E D8

  [bits 32]
  mov ds, ax   ; 8E D8
  mov ds, eax  ; 8E D8

有同学可能会有疑问,eax是32位,ds是16位,为什么能将eax的内容传送到ds中呢

我是这样想的,在16位模式下,我们基本不会考虑eax的使用吧,然后如果使用的话,应该是只有低16位有效;在32位模式下,ds中存储的是16位的选择子,所以你使用传送指令传送的是选择子才对吧,不然ds也没法存其他东西了

创建GDT并安装描述符

上一章gdt的大小和线性基地址我们是这么写的

  gdt_size dw 0
  gdt_base dd 0x00007e00

这次我们换成以下这种方法

  pgdt dw 0
       dd 0x00007e00

两种方法都一个意思

修改段寄存器的保护

处理器在变更段寄存器以及隐藏的描述符高速缓存器的内容时,要检查其代入值的合法性

  • 确认选择子正确
    检查索引号,即描述符要在GDT的范围内,索引号x8+7 <= 边界
    1
  • 确认描述符正确
    简单来说就是检查描述符的类别,类别与段寄存器间要适配
    2

另外,需要注意的是,ds、es、fs和gs的选择器允许加载数值为0的选择子,cs和ss不允许

地址变换时的保护

段界限的计算:

  • G=0时,即粒度为字节时,实际使用的段界限就是 描述符中记载的段界限
  • G=1时,即粒度为4KB时,实际使用的段界限是 描述符中的段界限值x0x1000+0xFFF(0x1000就是4KB)

代码段执行时的保护

当描述符被加载到段寄存器的描述符高速缓存器时,则处理器取指令和执行指令时,将不再访问描述符表,而是直接从高速缓存器中取得的基地址在同 EIP 中的内容相加而获得的物理地址中获得指令

代码段是向上(高地址方向)扩展的,所以 实际使用的段界限就是段内最后一个允许访问的偏移地址

指令的执行必须满足 0<=(EIP+指令长度-1)<=实际使用的段界限
3

栈操作时的保护

栈段是向下(低地址方向)扩展的,每当往栈中压入数据时,ESP的内容要减去操作数的长度,所以栈段 实际使用的段界限就是段内不允许访问的最低端偏移地址,最高端无限制

所以进行栈操作时,必须满足 实际使用的段界限+1<=(ESP-操作数的长度)<=0xFFFFFFFF

数据访问时的保护

数据段可以向上扩展或向下扩展

当处理器访问向上扩展的数据段时,必须满足 0<=(EA+操作数打下-1)<=实际使用的段界限 (EA表示有效地址,即偏移地址)

对向上扩展的数据段的检查和代码段的检查基本一致,不同的点在于,代码段取决于指令的长度,数据段取决于操作数的尺寸

使用别名访问代码段

当两个以上的描述符都描述和指向同一个段时,把另外的描述符称为别名

当我们想要访问代码段内的数据时,可以重新为该段安装一个新的描述符,并将其定义为可读可写的数据段,这样就可以通过这个数据段来访问了

别名的应用不仅仅于此,它还可以用在多个程序共享同一个内存区域等等

xchg指令

xchg指令用于交换两个操作数的内容,两个操作数可以是寄存器或者内存单元(也可以同时都是),但不允许同时为内存地址

标签:32,存储器,mov,代码段,描述符,指令,chapter12,------,ds
From: https://www.cnblogs.com/winter-z/p/18361164

相关文章

  • 摸鱼办提醒倒计时
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 解决GD32新建工程时提示:cannot open source input file “RTE_Components.h“
    自己在keil中搭建GD32工程后,编译会提示找不到“RTE_Components.h“这个文件。这个文件需要使用keil自动生成工程的方式才会有。如果自己手动搭建工程时,GD32的库文件中是没有提示这个文件的。那GD32的例程为什么不会报错呢?看一下例程就会发现。其它GD32提示的例程里面是没有包含......
  • 编程常用计算机小知识
    1.在Windows中打开命令窗口:按Win+R,输入CMD,按Enter键即可打开命令窗口2.如果想在任意目录执行某个执行文件,则可以将执行文件所在目录加到系统变量path中去,如D:\Java\bin。系统变量是从上至下的路径查找执行文件的,上移和下移可以调整path变量的位置。如果想尽快找到运行文件执行,......
  • 【日常记录-Java】EasyExcel输出设定字体
    Author:赵志乾Date:2024-08-15Declaration:AllRightReserved!!!1.问题描述    使用EasyExcel默认的设定输出时,中文字体显得比较怪异。2.解决方案    本质是单元格样式的设置问题,在EasyExcel中,可以通过实现WriteHandler接口或使用EasyExcel提供的注解以及W......
  • 【Qt笔记】键盘控制Qt按钮
    目录一、前言二、初始化三、键盘移动后需要选中哪个按钮四、键盘按键处理函数五、实现效果一、前言Qt框架支持通过键盘输入来间接控制界面元素,如按钮,实现无需鼠标操作的交互方式。这通常涉及到键盘事件的监听与处理,比如监听特定的按键事件(如空格键、回车键等),并在这些......
  • Sublime Text常用快捷键大全
         SublimeText是一款功能强大且广受欢迎的文本编辑器,其丰富的快捷键支持使得开发者能够更高效地编写和编辑代码。以下是SublimeText中一些常用的快捷键,帮助你更加高效地使用这款工具:功能分类快捷键(Windows)快捷键(Mac)新建文件Ctrl+NCmd+N打开文件Ct......
  • Linux下的gdb日常使用
    100个GDB小技巧0.常用0.1获取源代码行与程序地址之间的对应关系(1)显示当前执行指令所在的源代码行:infoline(2)显示特定函数或源代码行的地址信息:infoline<function-name>|<source-file>:<line-number>例如,要查看函数myFunction的起始地址,可以使用:infolinemy......
  • 【2024最新版版】PyCharm安装教程
    简介由于Python语法简单容易入门,并且Python在办公自动化等领域的功能非常强大,所以现在越来越多非IT行业的人也开始学起了Python,要学习和使用一门编程语言,一个好用的IDE是必不可少的,而对于Python来说,最好的IDE无疑是Pycharm。本文就给大家介绍一下如何从零到一来安装Pycharm......
  • 在nginx的访问日志中输出响应时间(json格式)
    log_formatjsonescape=json'{''"time":"$time_iso8601",''"host":"$remote_addr",''"method......
  • 记录一次从mysql到sql的数据库迁移
    使用的是c#+SqlSugar。1.获取表数据///<summary>///获取数据库访问对象///</summary>///<returns></returns>publicSqlSugarClientGetSqlSugar(){SqlSugarClientdb=newSqlSugarClient(newConnectionConfig(){Db......