以下内容都是我阅读《从x86实模式到保护模式》一书的总结笔记,大约在11章~13章,主要记录一下有关GDT的内容。分两部分,第一部分简单介绍GDT,第二部分深入保护模式下的特权保护。

GDT的引入

在实模式下最大可以访问1M大小的地址,进入保护模式后,由于需要内存保护,必须一五一十的记录段的权限–哪个段是系统级别的权限,哪个段时应用级别的权限,这样就可以使得系统可以对所有硬件进行直接访问,限定应用程序对硬件的直接访问,以免怀有恶意的应用程序对计算机破坏。

负责记录段权限的就是GDT,全称全局描述符表,它由64位比特组成,也就是两个字,下图是GDT的示意图

  • Base:段的基地址,由一个字大小组成,意味着它可以是保护模式下4G内存中任意一个地址。
  • LimitG:Limit 是段的大小范围也叫段界限,由20个比特组成,也就是1M大小,G是段界限的单位。另外,如果G位为0就以字节为单位,如果为1就以4KB为单位。假设G位为0,那么Limit+1是多少,此段大小就为多少字节,范围为1B~1M;设G位位1,那么此段大小为(Limit+1)*4KB大小,范围为4KB~4G
  • P:存在标志位,为0就说明段不存在内存中,为1就存在内存中。这里可以引发一个中断,当CPU检查到这一位为0,后面指令又要使用此段的时候,可以引发一个缺段中断,然后跳转到加载段的中断程序以加载此段到内存中。
  • DPL: 此段的特权等级,由两位比特组成,最高特权等级为00,最低特权等级为11,一共有三个特权等级。
  • STYPE: S 位用于指定描述符的类型。当该位是0时,表示是一个系统段;为“1时,表示是一个代码段或者数据段(栈段也是特殊的数据段)。当S为1时,也就是为代码段或数据段时,TYPE的情况如下:

    也就是说,X为0时候就是数据段,X为1时候就是代码段,而关于依从的概念是关系到切换任务时候特权的更变的,后面再说。当S为0时也就是此段是一个系统段,而系统段也有好几种,TYPE里所代表的就是系统段的种类。(目前据我所知,TYPE是0010的为 LDT描述符、是1011或1001的为TSS描述符、是1100的为调用门描述符等)
  • D/B:默认的操作数大小或者默认的栈指针大小,该标志位主要是为了能够在32位处理器上兼容运行16 位保护模式的程序。该标志位对不同的段有不同的效果。对于代码段,此位为D位,用于指示指令中默认的偏移地址和操作数尺寸。D=0 表示指令中的偏移地址或者操作数是16 位的;D=1,指示32 位的偏移地址或者操作数。对于数据段,此位为B位…
  • L:是64 位代码段标志,保留此位给64位处理器使用。如果还是32位保护模式,我们将此位置0即可。
  • AVL:此位是保留位,留给操作系统用的,用也可以不用也可以。

段界限

这里重点关注一下段界限,有两点:

  • 段界限的计算
  • 栈段界限和栈的范围

段界限的计算

有一点需要注意段界限在数值上,是比实际大小少1的,为什么呢?比如内存单元的0~7,这里的0也是可以作为一个内存单元的,因此0~7实际的大小为8比特,而不是7比特。

实际段界限值=(描述符中段界限值+1)*(段界限的颗粒大小:4KB或1B)-1

这里假设描述符中段界限值为0xFFFFF
G为0,颗粒大小为1字节,根据公式实际段界限值就是描述符中段界限值
G为1,颗粒大小为4KB字节,实际段界限值=0x100000*0x1000-1=0xFFFFFFFF

4KB=4*1024B=4096B
4096为十进制
4096B的十六进制为1000

栈段界限与栈的范围

我当时也一脸懵逼,但是后来慢慢理解上了。

普通的数据段,偏移量是从0x00000000开始,一直到段界限值,因为数据段是向上增长的,是增加的;而作为栈的数据段就不一样了,栈是向下减少的,方向和数据段相反,所以偏移量的起点应该也要相反,也就是说偏移量应该是从0xFFFFFFFF开始,一直减少到段界限值。

总的来说,数据段的范围为:0x00000000 ~ Limit,栈段的范围为:0xFFFFFFFF ~ Limit

而栈基址的作用是啥?我认为是一种定位的作用,比如我设置一个栈段界限为0xFFFFE,栈段基地址为0x7c00,会发生什么呢?看下图就懂了:

原本栈段基地址为0时候,栈段范围为0xFFFFFF ~ 0xFFFFEFFF ,有了基地址,两头分别加上栈段基地址0x7c00,由于底部和顶部两端是相连的(0xFFFFFF + 1 = 0x000000),所以栈段的范围变成了0x00006C00~0x00007BFF

而关于ESP的值的问题,原本不加栈段基地址设置为0,那就可以自动从0落到0xFFFFFF ~ 0xFFFFEFFF 范围,如果加了栈段基地址,就会落到0x00006C00~0x00007BFF范围里。

一旦CPU访问此栈段时候,实际访问的物理地址超过0x00006C00~0x00007BFF这个范围,就会触发异常中断,以保护其他段的数据安全。

有关GDT的第一部分完成,第二部分是有关保护模式下的特权保护相关内容,会记录一下选择子的笔记,也就是GDT里的DPL以及CPL,还有选择子的RPL

你或许也想写一个简单的操作系统,没错我也是,欢迎来一起讨论操作系统相关问题,这是我的QQ:2197651308

全局描述符表GDT-第一部分相关推荐

  1. CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义

    一 计算机实模式和保护模式 实模式 在实模式下,内存被限制为仅有1M字节(220 字节).有效的地址从00000到FFFFF (十六进制). 这些地址需要用20位的数来表示.一个20位的数不适合任何一 ...

  2. gdt描述_全局描述符表(GDT)局部描述符表(LDT)

    这三个表是在内存中由操作系统或系统程序员所建,并不是固化在哪里,所以从理论上是可以被读写的.这三个表都是描述符表.描述符表是由若干个描述符组成,每个描述符占用8个字节的内存空间,每个描述符表内最多可以 ...

  3. gdt描述_全局描述符表GDT

    写在前面 添油加醋系列第二弹--剖析GDT 话说C语言的话除了刷刷OJ外,就是用来实现操作系统这个大头了.C语言比C++少了很多很多臃肿的语法特性,写起来非常优美(至少写操作系统是这样的).虽说C++ ...

  4. linux内核gdt,linux内核学习之全局描述符表(GDT)(二)

    在进入保护模式之前,我们先要学习一些基础知识.今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT). 同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移 ...

  5. [书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT; 第12章 别名,冒泡排序

    第11章 进入保护模式:初始化全局描述符表,通过GDT进入代码段.数据段.堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码; 设置 ...

  6. NASM汇编语言与计算机系统16-保护模式-全局描述符表GDT

    全局描述符表Global Descriptor Table 表中每个元素8个字节,每个元素表示一个段(代码段,数据段,栈段)的信息,且GDT在进入保护模式之前必须存在,所以它必须位于1MB以下(实模式 ...

  7. x86保护模式——全局描述符表GDT详解

    1 - GDT作用 GDT全称Global Descriptor Table,是x86保护模式下的一个重要数据结构,在保护模式下,GDT在内存中有且只有一个.GDT的数据结构是一个描述符数组,每个描述 ...

  8. gdt描述_获取全局描述符表GDT的内容 | 学步园

    /stdfx.h文件 //Ring0环的程序 //测试环境VS2005 #ifndef _WIN32_WINNT// Allow use of features specific to Windows ...

  9. GDT(全局描述符表)和LDT(局部描述符表)

    每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT.LDT描述局部于每个程序的段,包括其代码.数据.堆栈等.GDT描述系统段,包括操作系统本身. ①全局描述符表GDT(Global ...

  10. 全局描述符表(GDT)——《x86汇编语言:从实模式到保护模式》读书笔记09

    在进入保护模式之前,我们先要学习一些基础知识.今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT). 同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移 ...

最新文章

  1. 06-jvm-查询命令-01
  2. JavaScript开发规范 0.01版
  3. java框架_2020年Java框架排行榜,谁居榜首?
  4. 靶场练习第二十五天~vulnhub靶场之Raven-2
  5. VB6调用API打开目标文件所在文件夹且选中目标文件
  6. 柱状图中xy轴怎么出现_如果制砂机设备在工作中出现堵料现象该怎么办?
  7. 线程安全使用相关注意事项
  8. mysql事务最好别用_理解完这些基本上能解决面试中MySql的事务问题
  9. 计算机网络基础知识 帮助学习网络管理的初学者快速了解网络管理的初步结构知识...
  10. redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案
  11. 2019西安交大计算机专业研究生分数线,西安交通大学公布2019年硕士研究生招生复试基本分数线...
  12. 神武4最新服务器,神武4手游 角色转服扩大限服范围
  13. 如何将代码写的更加优雅?
  14. 【Apache NIFI 翻译】2-Getting Started with Apache NiFi 入门
  15. 斐讯n1盒子装网易音乐命令版
  16. 路由汇总带来的三层环路-解决实验
  17. 实数傅立叶变换和复数傅立叶变换
  18. win系统C++的udp通信(接收并发送)详细教程、win下inet_pton和inet_ntop无法使用解决方法
  19. 一文了解 DataLeap 中的 Notebook
  20. CA运作模式-认证与过期吊销

热门文章

  1. 解决error LNK2001: unresolved external symbol__imp__xxx
  2. MySQL-Front 导出MySQL表结构
  3. 积累按键精灵的编程技能减少一些繁琐操作增加效率
  4. AI,站在生态化反的废墟上
  5. 嵌入式系统学习——STM32之电容型触摸屏
  6. 利用Java的I/O流实现图片的压缩以及解压
  7. 中国手机以低价的4G手机击败5G的iPhone,苹果情何以堪
  8. 做人不忘本,才能走得更远 --- 我看电视剧《雍正王朝》
  9. 9000字深度复盘 | 创业公司1周年总结:拥抱不确定性谈何容易?来聊聊个人成长吧-Ω星 丨 产品经理与工作复盘 sprint...
  10. 《都挺好》苏明哲清华高材生,苏明玉草根创业,程序员引发的思考