GDT表实现

GDT是保护模式下的内存段登记表。

GDT表实现

GDT表实现

段界限计算

段界限用 20 个二进制位来表示。只不过此段界限只是个单位量,它的单位要么是字节,要么是 4K,这是由描述符中的G位来指

定的。由于段界限只是个偏移量,是从 算起所以实际的段界限边界值=

(描述符中段界限+1) * (段界限的粒度大小: 4k或者 1) -1

这个公式很简单,就是表示有多少个 4KB 由于描述符中的段界限是从 起的,所以左边第个括号中要加个 ,表示 4KB 的实际数量。它与第二个括号中的段粒度大小相乘后得到的乘积是以

为起始的段的实际大小 由于地址是以0为起始的,所以公式的最后又减了1.

如果G位为 1,表示段界限粒度大小为 4KB 字节,故实际段界限=(描述符中段界限+ 1) k-1

个例子,如果是平坦模型,段界限为 OxFFFFF, 位为 ,套用上面公式,段界限边界值=0x100000*0x1000-1 =0xFFFFFFFF =4G

段属性被拆分是由于历史原因。

段基地址要进行拼接才行形成完整的基地址。

GDT表属性

undefined

;————– gdt描述符属性 ————-
DESC_G_4K equ 1_00000000000000000000000b ;G位为1,4K粒子
DESC_D_32 equ 1_0000000000000000000000b ;DB位为1,32位系统
DESC_L equ 0_000000000000000000000b ;64位代码标记,此处标记为0便可。
DESC_AVL equ 0_00000000000000000000b ;cpu不用此位,暂置为0
DESC_LIMIT_CODE2 equ 1111_0000000000000000b ;代码段高32位长度F
DESC_LIMIT_DATA2 equ DESC_LIMIT_CODE2 ;数据段高32位长度F
DESC_LIMIT_VIDEO2 equ 0000_000000000000000b ;
DESC_P equ 1_000000000000000b ;P位在内存
DESC_DPL_0 equ 00_0000000000000b ;访问权限
DESC_DPL_1 equ 01_0000000000000b
DESC_DPL_2 equ 10_0000000000000b
DESC_DPL_3 equ 11_0000000000000b
DESC_S_CODE equ 1_000000000000b ;S位是系统段
DESC_S_DATA equ DESC_S_CODE
DESC_S_sys equ 0_000000000000b ;非系统段,是代码段或数据段
DESC_TYPE_CODE equ 1000_00000000b ;x=1,c=0,r=0,a=0 代码段是可执行的,非依从的,不可读的,已访问位a清0.

DESC_TYPE_DATA equ 0010_00000000b ;x=0,e=0,w=1,a=0 数据段是不可执行的,向上扩展的,可写的,已访问位a清0.

;以下为系统代码段,数据段,显存段选择子的高32位初始化

undefined

DESC_CODE_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0x00
DESC_DATA_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_DATA2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00
DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x0b

;0x00 << 24 是填充高32位31-24的段基地址都为0

GDT表实现

;构建gdt及其内部的描述符
   GDT_BASE:   dd    0x00000000
           dd    0x00000000

   CODE_DESC:  dd    0x0000FFFF
           dd    DESC_CODE_HIGH4

   DATA_STACK_DESC:  dd    0x0000FFFF
             dd    DESC_DATA_HIGH4

   VIDEO_DESC: dd    0x80000007           ;limit=(0xbffff-0xb8000)/4k=0x7
           dd    DESC_VIDEO_HIGH4  ; 此时dpl已改为0

   GDT_SIZE   equ   $ - GDT_BASE
   GDT_LIMIT   equ   GDT_SIZE -    1

   dq 50 dup(0)             ;不能预留 60个 ,60 * 8B 太大了(只有1M内存),50可以运行正常。
    ; times 60 dq 0                     ; 此处预留60个描述符的slot
   SELECTOR_CODE equ (0x0001<<3) + TI_GDT + RPL0         ; 相当于(CODE_DESC - GDT_BASE)/8 + TI_GDT + RPL0
   SELECTOR_DATA equ (0x0002<<3) + TI_GDT + RPL0     ; 同上
   SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0     ; 同上

GDT_BASE:规定第一个GDT元素必须为全0,预防一些错误。

CODE_DESC:系统代码段,基地址为全0,段界限 可以访问 0- 4G

DATA_STACK_DESC:栈段和数据段,可以访问0-4G,后面在操作系统初始化时会修改栈地址。

VIDEO_DESC:显存段

访问每个GDT元素需要通过选择子进行访问,将选择子加载到段寄存器中,所以有了下面的几个SELECTOR。

计算GDT_LIMIT 是用于将GDT加载到GDT寄存器中

Original: https://www.cnblogs.com/thotf/p/16289706.html
Author: thotf
Title: GDT表实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582260/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux netstat:查看网络状态

    netstat 主要用于网络监控,在进程管理方面也很重要。它的输出分为两大部分,分别是网络和系统自己的进程相关性部分。 netstat [-atunlp] -a 列出目前系统上所有…

    Linux 2023年6月13日
    089
  • Jq 手机端输入框防止底部菜单被小键盘弹起

    var winHeight = $(window).height(); //获取当前页面高度 $(window).resize(function () { var thisHeig…

    Linux 2023年6月7日
    079
  • 11-K8S部署普罗米修斯

    K8S-Kubernetes 集群部署 Prometheus 和 Grafana 1.实验环境 控制节点/master01 192.168.80.20 工作节点/node01 19…

    Linux 2023年6月13日
    079
  • 关于 Promise 的一些简单理解

    一、ES6 中的 Promise 1、JS 如何解决 异步问题? (1)什么是 同步、异步?同步指的是 需要等待 前一个处理 完成,才会进行 下一个处理。异步指的是 不需要等待 前…

    Linux 2023年6月11日
    0105
  • tar压缩提示file changed as we read it

    压缩文件夹,过程中某个文件有变化,会提示 file changed as we read it 。不太确定是压缩到这里就中断了,还是压缩完,才提示的这个错误。 测试一下 做个实验,…

    Linux 2023年6月8日
    0163
  • 爱前端公开课学习笔记——JS01 认识js 变量

    认识js 在谷歌浏览器的控制台中右键单击空白处,选择检查可以打开控制台 查看console.log输出的内容。 JS的注释 是”//”或者”/ …

    Linux 2023年6月14日
    092
  • 2021年3月-第02阶段-前端基础-HTML+CSS阶段-Day03

    HTML5 第三天 一、 认识 3D 转换 3D 的特点 近大远小 物体和面遮挡不可见 三维坐标系 x 轴:水平向右 — 注意:x 轴右边是正值,左边是负值 y 轴:垂…

    Linux 2023年6月8日
    0104
  • 冒泡排序

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月8日
    0101
  • redis 基本信息查询

    在客户端可以用telnet命令 telnet ip port 再输入info 返回如下信息: 每个参数的含义: redis_version redis版本gcc_version g…

    Linux 2023年5月28日
    085
  • powershell 编写的tui界面脚本《电壳别名宝》

    中文名: 《电壳别名宝》 English name: 《Power Alias》 powershell 编写的tui界面脚本。 用途:保存容易记住的别名(支持中文),保存linux…

    Linux 2023年5月27日
    0127
  • 操作系统

    第1章习题1. 设计现代OS的主要目标是什么? OS的作用可表现在哪几个方面? 为什么说操作系统实现了对计算机资源的抽象? 试说明推动多道批处理系统形成和发展的主要动力是什么。 何…

    Linux 2023年6月6日
    078
  • 用户身份标识与账号体系实践

    互联网的账号自带备忘机制; 一、业务背景 通常在系统研发的过程中,需要不断适配各种业务场景,扩展服务的领域和能力,一般会将构建的产品矩阵划分出多条业务线,以便更好的管理; 由于各个…

    Linux 2023年6月14日
    085
  • jenkins

    jenkins 1.简介 1.1 SVN介绍 1.2 Maven介绍 1.3 Ant介绍 1.4 Gradle介绍 1.5 jenkins工作原理 1.6 jenkins特点 2….

    Linux 2023年6月7日
    0107
  • linux磁盘配额管理

    磁盘配额是一种磁盘空间的管理机制,使用磁盘配额可限制用户或组在某个特定文件系统中能使用的最大空间 1、查看内核是否支持磁盘配额 grep “CONFIG_QUOTA&#…

    Linux 2023年5月27日
    089
  • 常见的Redis面试”刁难”问题,值得一读

    字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、P…

    Linux 2023年5月28日
    078
  • 数据结构 一元多项式加减法计算器

    cpp;gutter:true;</p> <h1>include</h1> <p>using namespace std;</…

    Linux 2023年6月13日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球