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)

大家都在看

  • KVM虚拟化

    1. 虚拟化介绍 2. 为什么要使用虚拟化技术 3. KVM介绍 4. KVM部署 4.1.开启CPU的虚拟化功能,添加一块新的硬盘用来存储kvm的数据 4.2. 安装kvm 4….

    Linux 2023年6月13日
    0128
  • K8S-kubeadm安装

    K8S-kubeadmin快速安装K8S集群 1.IP规划 节点 IP 组件 MASTER01(4C/6G,cpu核心数大于2) 192.168.80.20 docker、kube…

    Linux 2023年6月13日
    0107
  • Java刷题笔记—–>集合类

    一般提到某某集合区别,感觉必有线程安全Arrylist线程不安全,Vector反之 几个方面:线程是否安全,效率问题,对Null Key和Null value的支持,初始容量大小和…

    Linux 2023年6月7日
    0104
  • 一文剖析HTML块和内联元素以及DIV容器,运维开发必备前端技能,基本功强化训练。

    写在开篇 运维开发必备前端技能!虽然很枯燥,知识点很多,但要坚持住哦!笔者和大家一起坚持。本篇和大家一起巩固html中的块元素和内联元素以及DIV容器。 块元素 块元素的特点是啥?…

    Linux 2023年6月7日
    0116
  • Linux 下 xargs 命令

    xargs 常常被大家忽略的一个命令,对它的一些用法很多人可能不熟悉,其实它是一个功能强大的命令,特别是在结合管道进行批量处理方面 语法 xargs 语法格式如下 xargs [O…

    Linux 2023年6月13日
    0120
  • SQLI-LABS(Less-2)

    Less-2(GET-Error based-Intiger based) 打开 Less-2页面,可以看到页面中间有一句 Please input the ID as param…

    Linux 2023年6月6日
    092
  • 如何在 python 中解决 ImportError: DLL load failed while importing win32api

    问题描述 安装完 pywin32 之后,如果直接在代码中 import win32api 可能会报下述错误: ImportError: DLL load failed while …

    Linux 2023年6月7日
    089
  • pymysql模块的使用

    pymysql模块的使用 import pymysql 1、连接数据库 conn = pymysql.connect( user=’root’, # The first four …

    Linux 2023年6月14日
    098
  • Java基础 String

    String类 字符串是一个特殊的对象。 字符串一旦初始化就不可以被改变。 String s="abc"; 特点: String构造函数 主要几个String构…

    Linux 2023年6月14日
    0137
  • 前端之HTML

    一、HTML介绍 1.1 web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80…

    Linux 2023年6月14日
    085
  • Paxos 协议简单介绍

    一、简介 Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Ch…

    Linux 2023年6月16日
    0144
  • 笔记:Java集合框架(一)

    Java集合框架(一) Collection接口 继承结构 Iterator接口 Iterator接口定义了迭代器的基本方法: java;gutter:true; hasNext(…

    Linux 2023年6月14日
    081
  • shell operator EOF shell 操作符 << <<<

    总结: 这些被叫做shell操作符 shell operator 主要分为 control operators和redirection operators < Origina…

    Linux 2023年5月28日
    0101
  • 软件负载均衡

    软件负载均衡成本几乎为零,基本都是开源软件。例如:LVS、HAProxy、Nginx等。 该机群包含一台Nginx服务器,两台Web服务器(node2和node3) 修改nginx…

    Linux 2023年6月11日
    074
  • 2012年脱离程序员队伍,时隔9年,居然一次性把“冒泡排序”算法写对了

    2012年脱离程序员队伍,时隔9年,居然一次性把”冒泡排序”算法写对了 2021年2月7日 立贴纪念 #include int bubble_sort(in…

    Linux 2023年6月13日
    075
  • Redis核心技术与实战:学习总结目录

    1 Redis学习路径 在《Redis核心技术与实战》课程的学习中,我经常看到一位课代表的发言,他就是Kaito,他总结了一份 Redis学习路径脑图(建议收藏),将Redis的知…

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