【操作系统】段描述符、全局描述符表和选择子

news2024/11/25 11:33:43

一、保护模式的内存寻址过程

        与实模式不同的是,保护模式下内存段不再是简单地用段寄存器加载一下段基址然后乘以16位结合偏移地址得出实际要访问的内存地址,而是通过选择子全局描述符表中找到对应的段描述符,CPU从段描述符中提取段基址,再与偏移地址结合得出实际要访问的内存地址。

        以下我们来模拟一下保护模式寻址过程,下面会出现大量的专业术语,暂时看不懂也没关系,后面会有各个名词的详解:

        首先,在保护模式下,每一个内存段都不能再被简单地直接读取,而是用一个表来记录每一个内存段的详细信息(为了安全),该表包括这段内存谁可以访问(权限),起始地址在哪里(段基址)等等。每一段内存段都会有一个表格来记录,这个用来描述某一个内存段的表就叫做段描述符

         段描述符可不是随随便便乱扔的,系统会将这些段描述符全部收集整理在一起,并且汇总成一个list目录,这个list目录就称之为描述符表。按照描述符的作用域,又可以将描述符表分为全局描述符表(GDT局部描述符表(LDT

         由于段基址存放在了段描述符中,所以那些段寄存器就不再存放段基址了,而是存放一个称之为选择子(selector的东西。选择子是一个索引值,此索引值用于在段描述符中索引相应的段描述符,从段描述符中得到内存段的起始地址和段界限等相关信息。

        至此,所有主角已经全部登场,我们可以从头到尾推理一遍保护模式的寻址过程。首先,保护模式下的寻址方式为“段基址:段内偏移地址”。在访问具体某个内存段时,根据段寄存器中的选择子索引到全局描述符中该内存段的段描述符,并从该段描述符中提取出需要访问的内存段的段基址部分,最后CPU将段基址与段内偏移地址相加,得到实际的访存地址。

         由此也可以得出实模式下与保护模式下的区别:

功能

实模式

保护模式

访问内存的方式

段基址:段内偏移地址

段寄存器保存的内容

段基址

选择子

获取内存地址的方式

段基址乘以16,再与段内偏移地址相加得出实际内存地址

选择子索引到描述符后,CPU自动从段描述符中取出段基址,再加上段内偏移地址得出内存地址

二、选择子

        我们重新将选择子的结构图示端上来:

         可以看到选择子是16位的(因为段寄存器也是16位的),其中0~2位是RPL位,用于存储请求者的当前权限级别,权限级别有0、1、2、3四个等级。2~3位为TI位(Table indicator),用来表明选择子是在全局描述符表(GDT)中,还是在局部局部描述符表(LDT)中索引描述符,剩下的3~15位就是描述符的索引值,用于在描述符表中索引对应的描述符,选择子的索引值一共13位,即2的13次方8192,所以选择子最多可以索引8192个段,这与全局描述符表最多能容纳8192个描述符是吻合的。

三、段描述符

        段描述符用于描述一段内存段的属性信息,该结构一共8个字节,结构如图先所示:

         PS:可以看到,结构里面“段基址”和“段界限”两个属性被人为拆分放置在各个位置上,这其实属于一个历史遗留的问题,具体的原因不在此赘述,你可以理解为Intel为了兼容旧时代的CPU而做的兼容性措施,实际上使用时CPU会将其合并在一起形成一个连续完整的信息,并且存放在段描述符缓冲寄存器(如果不知道什么时段描述符缓冲寄存器,可以查看以前写的一篇文章:XXX)中以备后续使用。

         下面我们在将每个位置都进行讲解:

(1)段基址位:这个没有什么好说的,将低32位的16~31位、高32位的0~7位以及高32位的24~31位组合在一起就是32位的段基址了

(2)G字段:Granularity粒度,处于高32位的23位中,用来指定段界限的单位大小的,如果G位为0,则代表段界限的单位为1字节,如果G位为1,则代表段界限的单位为4KB。

(3)段界限:位于低32位的0~15位,以及高32位的16~19位,凑成20位的段界限属性,该属性值用于限制段内偏移地址的,段内偏移地址必须在段界限范围以内,否则CPU将会认为是非法访问,并且抛出异常。段界限有最大界限最小界限两种。对于数据段和代码段这种属于向上扩充的,地址越来越高的,此时段界限用来表示段内偏移地址的最大范围,而栈段则是向下扩充的,地址越来越低,此时段界限用来表示段内偏移地址的最小范围。那段界限可以表示的最大的范围是多少呢?这个主要是按照G字段的值来确定的:

  •          如果G位为0,那个段界限的单位为1字节,那么段的范围最多可以表示为2的20次方等于1MB
  •         如果G位为1,那个段界限的单位为4KB字节,那么段的范围最多可以表示为2的32次方(4KB等于2的12次方,12+20=32)等于4GB 

(4)DPL字段:位于高32位的13~14位,Descriptor Privilege Level描述符特权级,用于表示内存段的特权级,特权级分为0~3级,数字越小权限越大,用户一般在3级,而CPU一般在0级。

(5)P字段:位于高32位的15位,Present在位符,如果该值为1,则表示段存在内存中,否则为0,该字段由CPU自行检查,我们来进行赋值。该字段其实也是为了兼容新的CPU做的措施,旧时代的CPU因为内存不足,允许段描述符中对应的内存段暂时换出来存放到硬盘中,待需要使用时再加载进行,现在的CPU即使内存不足也不会将整段换出,而是通过分页的功能按照页的单位将内存换入换出。

(6)AVL字段:位于高32位的20位,该字段没有专门的用途,我们可以随意的操作此位

(7)L字段:位于高32位的21位,用于设置是否位64位代码段,1即为64位代码段,0即为32位代码段。

(8)D/B字段:位于高32位的22位,用来指定有效地址(段内偏移地址)以及操作数的大小,指定操作数的大小,也就是对“指令”来说的,和指令相关的内存段是代码段和栈段,所以该字段会根据代码段/栈段的不同定义也不同。

  • 如果是代码段,此位是D位,如果为0,表示指令中的有效地址和操作数是16位,指令有效地址用IP寄存器。如果为1,表示指令中的有效地址和操作数是32位的,指令有效地址用EIP寄存器。
  • 如果是栈段,此位是B位,用来指定操作数的大小,如果为0,使用的是sp寄存器,那么栈的起始地址是16位寄存器的最大寻址范围0xFFFF。如果为1,使用的是esp寄存器,那么栈的起始地址是32位寄存器的最大寻址范围0xFFFFFFFF。

(9)S字段:位于高32位的12位,该字段和下面的type字段需要配合着用,该字段用于描述当前描述符是否为系统段,0表示系统段,1表示数据段/非系统段。系统段是各种称呼为“门”的结构,比如调用们、任务门之类的,它是硬件系统需要的结构,我们目前只需要关注非系统段(S字段为1)的就行。

(10)Type字段:位于高32位的8~11位,是整个段描述符中比较重要的字段,用来指定本段描述符的类型的,类型由以下这些:

        我们目前只用到非系统段,所以当前只介绍非系统段的属性值。

  • A位表示Accessed,由CPU自行设置,每当该段被CPU访问过后,CPU会将此位设置成1,我们在调试时就可以根据此位判断该描述符是否可用,在创建一个新的段描述符时,需要将此位置设置为0。
  • C位表示Conforming,指如果自己是转移的目标段,并且自己是一致性代码段,那么自己的特权级一定要高于当前特权级,转移后的特权级不予自己的DPL为主,而是与转移前的低特权级一直,也就是听从转移前的低特权级。C为1时表示该段是一致性代码段,0时表示为非一致性代码段。
  • R位表示Read,指是否可读,1表示可读,0表示不可读。一般用来限制代码段的访问。比如指令执行过程中,CPU发现某些指令对R为0的段进行访问,CPU将会抛出异常。
  • X位表示Executable,指该段是否可以执行,X为1是代表代码段是可执行的,X为0时表示数据段是不可执行的。
  • E位表示Extend,用来标识段的扩展方向,E为0表示向上扩展,地址越来越高,用于代码段和数据段,E为1表示向下扩展,地址越来越低,用于栈段。
  • W位表示Writable,用来表明段是否可写,W为1表示可写,通常用于数据端,W为0表示不可写入,通常用于代码段。如果W为0的段有写入行为,CPU同样会抛出异常。

四、全局描述符表

        描述符表可以分为全局描述符表(GDT,golbal descriptor table)和局部描述符表(LDT,local descriptor table)。

        (1)全局描述符表

        全局描述符表相当于描述符的数组,数组中每个元素都是8字节的描述符,可以用选择子中提供的下标在GDT中索引描述符。全局描述符表的“全局”体现在多个成都在里面定义自己的段描述符,是公用的。

        (2)局部描述符表

        局部描述符表和全局描述表其实差不多都是一个容纳描述符的数组,区别CPU厂商建议每个任务的私有内存段都使用自己的段描述符表来装,这个就是局部描述符表,随着任务之间的切换,局部描述符表也跟着切换,但是现实中很少用到局部描述符表,所以这里点到为止。

        (3)描述符表寄存器

        描述符表一般都位于内存中,需要使用专门的寄存器来初始化、调用它,用在全局描述符表的寄存器叫做GDTR,也就是GDT Register,用在局部描述符表的寄存器叫做LDTR,也就是LDT Register,寄存器的结构如下:

        在使用描述符表寄存器之前,需要对寄存器进行初始化操作,指令格式为:

         Lgdt  48位内存数据

         48位内存数据刚好对应寄存器的48位,其中前16位为GDT的以字节为单位的界限值,后32为是GDT的起始地址。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode 重命名很慢或失败 vscode renames are slow

网上问题, 插件问题(我遇见的排除,不是)被其他程序占用问题,(我这边是这个) 解决方案: 打开【资源管理器】,使用火绒 或其他软件,查看文件夹 or 文件 被哪个…

2024.4.9-day12-CSS 常用样式属性和字体图标

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 作业 <!DOCTYPE html> <html lang"zh-CN"><he…

C++进阶之路---何为智能指针?

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&am…

通过系统防火墙,禁用同网段主机互访

要通过系统防火墙禁止同网段主机之间的互访&#xff0c;您可以在Windows操作系统中使用高级防火墙规则来实现。以下是在Windows环境中创建一条规则以阻止本地同一子网内的计算机互相访问的基本步骤&#xff1a; 对于Windows防火墙&#xff08;适用于Windows 7至Windows 11&…

一文带你全面了解功能安全软件监控方案

引言&#xff1a;功能安全标准&#xff08;ISO26262 Part6&#xff09;提到了用于错误探测的安全机制&#xff0c;其中就有程序流监控&#xff0c;如图1所示&#xff1b;本文主要探讨在AUTOSAR CP以及AP的场景下&#xff0c;怎么实现程序流监控。 图1 ISO26262 Part6 一、CP场…

Android设备使用DS file远程访问群晖NAS管理本地文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用程序具有…

JS--demo实现随机点名

逻辑就是通过点击事件得到数组里面的随机一个值&#xff0c;再把这个值给删除&#xff0c;当数组长度为1的时候&#xff0c;停止点名&#xff0c;用disabled属性让用户不能进行点击。 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】

基于springboot实现校园资料分享平台系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff…

电脑微信双开,微信微信多开支持多个微信同时登录,快速切换,方便快捷 电脑最简单的微信双开多开方法 电脑上怎么登录两个微信账号?电脑微信怎么能够双开?

支持多个微信账号同时登录&#xff0c;不限微信登录个数&#xff0c;运行快速&#xff0c;稳定不卡顿 集成所有聊天窗口&#xff0c;一键快捷切换&#xff0c;窗口再多也不乱&#xff0c;提高你的工作效率 同时管理多个微信号&#xff0c;且需要分别维护用户关系、粉丝社群 …

Oracle表空间满清理方案汇总分享

目录 前言思考 一、第一种增加表空间的数据文件数量达到总容量的提升 二、第二种解决方案针对system和sysaux的操作 2.1SYSTEM表空间优化 2.2sysaux表空间回收 2.2.1针对sysaux的表空间爆满还有第二套方案维护 三、第三种解决方案使用alter tablespace resize更改表空间的…

HTML转EXE工具(HTML App Build)永久免费版:24.4.9.0

最新版本的HTML2EXE即将发布了。自从去年发布了HTML2EXE之后&#xff0c;我就正式上班了&#xff0c;一直忙于工作&#xff0c;实在没有时间更新&#xff08;上班时间不能做&#xff09;&#xff0c;很多网友下载使用&#xff0c;反应很好&#xff0c;提出了一些改进的建议&…

Tomcat项目部署spring mvc项目,压测出现的问题

Tomcat项目部署spring mvc项目&#xff0c;压测出现的问题 项目部署&#xff1a;docker部署时候设置的内存是80G&#xff0c;JVM堆内存的初始堆和最大堆设置的内存都是64G 1、压测的时候&#xff0c;并发1000&#xff0c;循环1次 日志显示&#xff1a;堆内存溢出 2、排查出…

蓝桥杯单片机之PCF8591的使用

下文仅仅讲怎么使用。 本文章参考&#xff1a; 【蓝桥杯】PCF8591 A/D D/A转换应用_pcf8591中输出电压2v怎么表示-CSDN博客 蓝桥杯电子类单片机学习三——PCF8591 AD/DA转化器&#xff0c;AT24C02 EEPROM存储器&#xff08;iic驱动&#xff09;_蓝桥杯da转换输出的是什么-CS…

dg_mmld部分复现

Ours ( K ˆ \^{K} Kˆ2)复现结果– Photo&#xff1a;0.9634730538922156 (at Epoch 23) Art&#xff1a;0.8125 (at Epoch 23) Cartoon&#xff1a;0.7713310580204779 (at Epoch 18) 差距在可接受范围内 辅助信息 If you send 作者 an e-mail, 作者 will tell you a URL w…

C/C++中const关键字用法总结

C基础专栏&#xff1a;http://t.csdnimg.cn/4FdOH 目录 1.引言 2.修饰变量 2.1.修饰普通变量 2.2.修饰指针 2.3.修饰对象 3.修饰函数形参 4.修饰函数返回值 5.修饰类成员函数 6.const与constexpr区别 7.总结 1.引言 在面试的过程&#xff0c;面试官经常都会问到const…

arm-linux-gnueabihf-gcc默认目录

默认编译的头文件目录&#xff1a; /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib 默认编译的库文件目录&#xff1a; /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/include/ …

[C++]哈希应用之位图布隆过滤器

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 前言&#xff1a; 我们之前…

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性&#xff0c;本文主要描述NameNode多节点高可用性的安装部署。 如上所示&#xff0c;Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点&#xff0c;当Master主节点发生故障变得不可用时&#xff0c;ZooK…

Vulnhub:DEVCONTAINER: 1

目录 信息收集 arp nmap nikto whatweb WEB 信息收集 dirmap 文件上传 提权 系统信息收集 横向提权 信息泄露 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd…

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡

一、Windows Server 2008添加Web服务器&#xff08;IIS&#xff09; &#xff08;1&#xff09;添加角色&#xff0c;搭建web服务器&#xff08;IIS&#xff09; &#xff08;2&#xff09;添加网站&#xff0c;关闭默认网页&#xff0c;添加默认文档 在客户端浏览器输入服务器…