非常好!!!【从头开始写操作系统系列】实现一个-GDT(1)【转】

简介:
 
 

在这篇文章中我们完成了以下内容:

  • 介绍 GDT
  • 介绍段描述符
  • 实现一个段描述符

介绍 GDT

GDT 是什么?

GDT(Global Descriptor Table)是一种数据结构,用来提供段式存储机制,这种机制是通过段寄存器和 GDT 中的描述符共同提供的。

在保护模式下,虽然现在的寄存器已经有32位的,但是我们依旧采用『段:偏移』的形式来寻址,只不过『段』的概念就相当于 GDT,段值仍然由16位的 cs、ds 等寄存器表示,但是这时段值仅仅是相当于一个索引,指向一个数据结构,这个数据结构就是 GDT一个表项,这个表项定义有段的起始地址、界限、属性等内容,这个表项也叫做描述符(descriptor)

描述符结构

  • 代码段和数据段描述符

    段描述符是一个8个字节的结构体,其中包含了段基址、段界限、段属性等信息

    • 段基址(32位):表示物理地址
    • 段界限(20位):表示段的长度(并不是地址,而是字节长度)
    • 段属性(12位):系统、门、数据等属性

    下面我们来实现这个结构体:

;描述符
;3个参数:
;   1.段基址:32位(4字节)
;   2.段界限:低20位 ; 3.属性:12位(高字节中的低4位总是0) %macro Descriptor 3 ;定义宏Descriptor,有3个参数 dw %2 & 0FFFFh ;用参数2的低16位填充一个WORD dw %1 & 0FFFFh ;用参数1的低16位填充一个WORD db (%1 >> 16) & 0FFh ;用参数1的17-25位填充一个BYTE dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ;用参数2的17-21位以及参数3的1-8位和13-16位填充一个WORD dw (%1 >> 24) & 0FFh ;用参数1的25-32位填充一个WORD %endmacro 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

从代码中我们可以分析出各个参数的有效位:(F为有效)

  • 段基址:0xFFFFFFFF
  • 段界限:0x000FFFFF
  • 属性:0x0000F0FF

    我们得到了如下图所示的结构:

    image

下面我们来介绍每一位的作用:

  • 第0、1字节:表示段界限
  • 第2、3、4字节:表示段基址
  • 第5、6字节比较复杂

    • 第5字节(从低到高): 
      • 0-3:TYPE,说明存储段描述符所描述的存储段的具体属性
    S 段类型 类型值 说明
    0 数据段 0000 只读
    0 数据段 0001 只读、已访问
    0 数据段 0010 读/写
    0 数据段 0011 读/写、已访问
    0 数据段 0100 只读、向下扩展
    0 数据段 0101 只读、向下扩展、已访问
    0 数据段 0110 写、向下扩展
    0 数据段 0111 写、向下扩展、已访问
    0 代码段 1000 只执行
    0 代码段 1001 只执行、已访问
    0 代码段 1010 执行/读
    0 代码段 1011 执行/读、已访问
    0 代码段 1100 只执行、一致码段
    0 代码段 1101 只执行、一致码段、已访问
    0 代码段 1110 执行/读、一致码段
    0 代码段 1111 执行/读、一致码段、已访问
    1 系统段 0000 (未定义)
    1 系统段 0001 可用286TSS
    1 系统段 0010 LDT
    1 系统段 0011 忙的286TSS
    1 系统段 0100 286调用门
    1 系统段 0101 任务门
    1 系统段 0110 286中断门
    1 系统段 0111 286陷阱门
    1 系统段 1000 (未定义)
    1 系统段 1001 可用386TSS
    1 系统段 1010 (未定义)
    1 系统段 1011 忙的386TSS
    1 系统段 1100 386调用门
    1 系统段 1101 (未定义)
    1 系统段 1110 386中断门
    1 系统段 1111 386陷阱门
    • 4:S,说明描述符的类型。对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。
    • 5-6:DPL,表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。
    • 7:P,存在(Present)位。
      • P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中
      • P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。
      • 第6字节
    • 0-3:段界限
    • 4:AVL,软件可利用位。80386对该位的使用未做规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。
    • 5:0(未定义)
    • 6:D/B,D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。 
      1. 在描述可执行段的描述符中,D位决定了指令使用的地址及操作数所默认的大小
        • D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段;
        • D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。
      2. 在向下扩展数据段的描述符中,D位决定段的上部边界 
        • D=1表示段的上部界限为4G
        • D=0表示段的上部界限为64K,这是为了与80286兼容
      3. 在描述由SS寄存器寻址的段描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器 
        • D=1表示使用32位堆栈指针寄存器ESP;
        • D=0表示使用16位堆栈指针寄存器SP,这与80286兼容
    • 7:G,段界限粒度(Granularity)位

      • G=0 表示界限粒度为字节
      • G=1 表示界限粒度为4K 字节

      注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位


版权声明:本文为博主原创文章,未经博主允许不得转载。

文章来源:http://blog.luoyuanhang.com










本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5714940.html,如需转载请自行联系原作者



相关文章
|
2月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
70 0
Vanilla OS:下一代安全 Linux 发行版
|
2月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
81 4
|
2月前
|
人工智能 安全 Linux
|
6月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
6月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
3月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
5月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
156 3
|
6月前
|
弹性计算 运维 Linux
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
作为一名技术运维的工作者,每天做的最多一件事就是在Linux下敲各种各样的命令,或完成功能性的部署,或检查系统的稳定性。如果 OS Copilot 作为我的日常工具,我使用场景会更集中于快捷命令或脚本的实现,智能帮我生成各类功能脚本,为我提高运维效率。
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
|
6月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
417 1
阿里云Linux os copilot 运维助手初体验