内核_段寄存器|段描述符|段选择子(详解)

3 篇文章 1 订阅
订阅专栏
本文深入探讨了x86架构中段寄存器的工作原理,包括它们的属性、段选择子、段描述符的结构以及段权限检查。段寄存器如ES、CS等共有8个,段选择子用于定位段描述符,而段描述符则包含了段的基地址、限制和属性。通过GDT和LDT表,CPU根据段选择子找到相应的段信息。此外,文章还介绍了段描述符的P位、G位、DPL和RPL等关键字段,以及它们在权限管理中的作用。
摘要由CSDN通过智能技术生成

概述

段寄存器:
ES CS SS DS FS GS LDTR TR共8个。

可以通过MOV指令对寄存器进行读写(LDTR和TR除外)。

段寄存器结构分布

Struct SegMent{
WORD	Selector段选择子;//16位selector
WORD	Attribute;//16位的Attribute
DWORD	Base;//32位的Base
DWORD	Limit	//32位的Limit
}

段寄存器结构图
在这里插入图片描述
读一个段寄存器只读16位,写一个段寄存器写96位。

段寄存器属性

在这里插入图片描述注意:
红色数据在不同环境下,数值可能不一样。(如下图)

在这里插入图片描述

段描述符

详细设计参考_保护模式

GDT(全局描述符表) LDT(局部描述符表)
Windows里面并没有使用LDT,使用的都是GDT。
GDTR(48位寄存器,表中存放了GDT表 的起始地址(32位),外加存放GDT表的大小(16位))。

查表机制:
当我们执行类似MOV DS,AX(注:AX就是可见的Selector段选择子的内容)指令时,CPU会查表,根据AX的值来决定查找GDT还是LDT,查找表的什么位置,查出多少数据。

利用Windbg调试看看:
Windbg调试环境搭建
VBoxDbg调式内核方法:
VirtualBox内置调试器VBoxDBG入门 (推荐这种,方便简单)

 r gdtr 	//查看全局描述符表寄存器

在这里插入图片描述

GDTR(48位寄存器,表中存放了GDT表 的起始地址(32位),外加存放GDT表的大小(16位) )。(不知道这里VboxDbg显示的怎么前面位数超过了32位,后面知道了再补上解释)

gd	//查看GDT表

在这里插入图片描述

	dd [地址]	//每四字节查看数据
	dq [地址]	//每八字节查看数据

在这里插入图片描述

段描述符(8字节一组,64位)结构(记住结构)

高4字节+低4字节
在这里插入图片描述

段选择子(2字节,16位)

段选择子是一个16位的段描述符,该描述符指向了定义该段的段描述符。

在这里插入图片描述
说明:
MOV DS,AX指令时,
假如AX=1B,即001B,拆分为0000 0000 0001 1011

去掉TI和RPL值,后剩下Index值为11,即3,则查GDT表索引值为3 (GDT表中索引值从0开始,索引值为0处的段描述符为0)的段描述符。


加载段描述符至寄存器(dword 4个字节;fword 6个字节;qword 8个字节;)。
除了MOV指令,我们还可以使用LES,LSS,LDS,LFS,LGS指令修改寄存器。
CS不能通过上述的指令进行修改,CS为代码段,CS的改变会导致EIP的改变,要改CS,必须要保证CS与EIP一起改。
实例:

char buffer[6];
__asm{
les ecx,fword ptr ds:[buffer]//高2字节给es,低4个字节给ecx
}

注意:RPL<=DPL(在数值上)段权限检查

段描述符P位|G位

p=1段描述符有效

p=0段描述符无效(CPU后面就不检查别的位了)

段描述符与段寄存器的对应关系

Intel白皮书Volume III
在这里插入图片描述

  • Attribute //16位 对应段描述符(高四字节) 第8位~第23位

  • Base //32位 (高四字节)第24位 ~ 第31位 + (高四字节)第0位 ~ 第7位+(低四字节)第16位 ~ 第31位

  • Limit //32位 (高四字节)第16位 ~ 第19位 +(低四字节)第0位 ~ 第15位 总共20位 最大值也就是FFFFF,此时分情况
    1,如果G位为0,那么Limit单位是字节,此时高位填0,即最大值也就是0x000fffff
    2,如果G位为1,那么Limit单位是4KB,4x1024=4096,4096代表有多少个,但是地址计算都是从0开始的,那么需要减1,即上限为4096-1=4095,刚好转为0xfff,如果此时Limit此时界限为1的话,那么此时为0x1FFF,则最大可以为0xffffffff

总结:
如果G为0的话,那么Limit为0x000FFFFF
如果G为1的话,那么Limit为0xFFFFFFFF

注意:
FS对应的短描述符比较特殊,FS是与线程相关,查分后的值与段寄存器中的值不符合。
在这里插入图片描述

段描述符S位|Type域

S = 1 代码段或者数据段描述符
S = 0 系统段描述符

TYPE域

当S = 1 时,

A 访问位
R 可读位

C 一致位

  • C=1 ,一致代码段
  • C=0 , 非一致代码段

在这里插入图片描述
数据段补充:
在这里插入图片描述

段描述符DB位

三种情况:
在这里插入图片描述

在这里插入图片描述


当S=0时,

在这里插入图片描述

段权限检察

CPU分级拥有0~3环权限,OS只使用了0和3环。

查看程序处于第几环?(CPL-Current Privilege Level)

查看CS和SS中存储的段选择子后2位。(CS和SS永远一样)

  • 3环实例
    在这里插入图片描述
  • 0环实例
    在这里插入图片描述

是否允许访问(DPL-Descriptor Privilege Level)

在这里插入图片描述

RPL(Request Privilege Level)

在这里插入图片描述

数据段的权限检察(举例)

在这里插入图片描述原理参考操作系统设计: 操作系统_保护模式和分段机制

为什么要有RPL存在?

在这里插入图片描述

段寄存器|段选择子|段描述符 三者关系

  • 段寄存器(96位)
    {
    WORD Selector段选择子;//16位selector
    WORD Attribute;//16位的Attribute
    WORD Base;//32位的Base
    DWORD Limit //32位的Limit
    }

段寄存器的值是通过段描述符填充的。

  • 段选择子(16位)。

  • 段描述符(64位) 映射 段寄存器里面属性

在这里插入图片描述

typedef struct Descriptor{
WORD	Attribute;//16位的Attribute
WORD	Base;//32位的Base
DWORD	Limit	//32位的Limit
}

16+32+32=80?
通过Limit和属性里面的G位获得80位(上面已解释G位作用)。

【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】
CodingCos的博客
11-14 3760
ARM8v-A提供了31个通用寄存器,分别是X0-X30。还有SP、PC、XZR等寄存器, 每个寄存器是64bits,可以在任何 Exception Level访问。表1-3因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A中运行32位应用程序的时候,会时候 W0-W30 寄存器。只使用其中的低32位。下面详细介绍写这些通用寄存器(X0-X7用于参数传递;X9-X15在函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低,
3-选择描述符结构
热门推荐
进击的小学生
09-14 2万+
描述符选择结构选择结构选择一共有16位,结构如下:| 1 | 0 | 字节 |7654321076543 2 10| 比特 |-------------|-|--| 占位 | INDEX |T|R | 含义 | |I|P | | | |L | INDEX:在GDT数组或LDT数组的索引号 TI
X86_64 CR3控制寄存器详解
SweeNeil
05-18 1万+
CR3寄存器目前博客主要能查找到的内容都比较简单,例如 《控制寄存器 cr0,cr2,cr3》等博客,只对CR3寄存器进行了简单的介绍: 状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。 CR3含有存放页目录表页面的物理地址,因此CR3也被称为PDBR。因为页目录表页面是页对齐的,所以该寄存器只有高20位是有效的。而低12位保留供更高级处理器使用,因此在往CR3中加载一个新值时低12位必须设置为0。 使用MOV指令加载CR3时具有让页高
段寄存器
青菜里的小青虫
08-26 1186
含义 段寄存器是因为对内存的分管理而设置的。16位CPU有四个16位段寄存器,所以,其程序可同时访问四个不同含义的段寄存器CS指向存放程序的内存,IP是用来存放下条待执行的指令在该的偏移量,把它们合在一起可在该内存内取到下次要执行的指令。 段寄存器SS指向用于堆栈的内存,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,
段寄存器&选择&描述符
weixin_45678798的博客
07-05 1607
充分利用了分机制,提供了对代码,数据结构以及程序的硬件级保护,在这里每个进程(任务)都被分配了自己的描述符以及自己的,进程可以完全独自拥有这些分配到的,也可以与其他进程共享这些。单独的程序对和执行环境的访问由硬件控制 ......
描述符
couberlee的专栏
05-17 718
4.3.4  描述符前面我们已经说明了使用选择符来定位描述符表中的一个描述符描述符是GDT和LDT表中的一个数据结构项,用于向处理器提供有关一个的位置和大小信息以及访问控制的状态信息。每个描述符的长度是8字节,含有3个主要字基地址、限长和属性。描述符通常由编译器、链接器、加载器或者操作系统来创建,但绝不是应用程序。图4-13给出了所有类型描述符的一般格式。
描述符选择
qq_41490873的博客
03-03 729
GDTR 寄存器 存放的是GDT(全局描述符表)表的位置和大小,大小为48位 在windeg中 r gdtr 查看GDT表的位置 r gdtl 查看表的大小 GDT表里面存放的元素称为描述符 大小为8字节 dd +地址 查看地址里面的内容 查看4字节 dq +地址 查看8字节 描述符 选择 选择是一个16位的描述符 ...
LDT描述符与80386控制寄存器详解
LDT描述符的有效性依赖于全局描述符表(GDT),并且在装载时,会将LDT基地址和界限等信息存储到LDT描述符高速缓存寄存器中。 80386控制寄存器和系统地址寄存器对于处理器的运行模式和内存管理至关重要。控制...
理解thread_info与内核栈:迷你进程描述符与堆栈结构详解
在 Linux 内核中,thread_info 结构是一个重要的组成部分,它被称为“迷你进程描述符”,因为其设计精简,主要通过指向 task_struct 来间接表示进程信息,而非直接存储。这个结构通常占用 8KB(两个页,有时为 4KB)...
LPC1700系列芯片中发送描述符寄存器详解
描述符管理方面,有两个重要的寄存器与接收和发送过程紧密相关:接收消耗索引寄存器(RxConsumIndex)和发送描述符数目寄存器(TxDescriptorNumber)。 接收消耗索引寄存器(RxConsumIndex)用于指示NIC当前准备处理的...
Linux详解寄存器
程序员乌拉的博客!
04-19 2517
操作系统的设计者必须在硬件相关的代码与硬件无关的代码之间划出清楚的界限,以便将一个操作系统很容易地移植到不同的平台。 在X86系列中,8086和8088是16位的处理器,而从80386开始为 32 位处理器。这种变化看起来是处理器位数的变化,但实质上是处理器体系结构的变化,从寻址方式上说,就是从“实模式”到“保护模式”的变化。 从80386以后,Intel的CPU 经历了80486、Pentium、 Pentium II、Pentium III 等型号,虽然它们在速度上提高了好几个数量级,功能
段寄存器描述符
Starr
12-19 2878
文章目录0. 发展过程保护模式803861. 段寄存器1.0 选择2. 描述符2.0 S+Type数据描述符代码描述符系统描述符2.1 赋值原理2.2 权限检查1.4.0 数据权限检查1.4.1 代码权限检查2.2 其它检查有效位检查类型检查3. 系统描述符-门描述符3.0 调用门设置和使用3.1 任务门、中断门和陷阱门4. 其它寄存器4.0. 调试寄存器4.1. 控制寄存器C...
选择段寄存器
farmwang的专栏
08-27 1万+
保护模式就是对程序的运行加以保护,所以说保护模式较实模式的增强的最主要体现还不是寻址能力而是对多任务的支持,所提到的保护就是对不同任务间和同一任务内的程序加以保护,使它们的运行不受对方“有意”或“无意”影响,但同时也要对两个任务都要用到的部分代码实现共享。另外一个重要的增强就是对虚拟存储器的支持,从一定意义上说可以使程序设计人员不必考虑物理内存的大小。   有了新的模式,当然要有大量的新增寄
2-段寄存器
进击的小学生
09-14 6990
从 ds 说起 段寄存器 段寄存器有96位 段寄存器数据来源从 ds 说起如果你稍稍懂一点汇编,当你执行下面这行代码的时候,它会把 32 位整数 5 写入到地址 0x0012f000 这个位置处。dword 就表示这是一个 double word 宽度的数,一个 word 是 16 bit.mov dword ptr ds:[0x0012f000], 5不要惊讶,不要因为不懂汇编而苦恼,接触多了,就
04-描述符选择
啊哈的博客
11-28 402
要点回顾: 上一节课我们讲过,当写一个段寄存器的时候,只给了一个16位的数,但段寄存器有96位,那剩下的80位从哪里来的?这个16位的数是随便写的吗? 1、GDT(全局描述符表) LDT(局部描述符表) 当我们执行类似MOV DS,AX指令时,CPU会查表,根据AX的值来决定 查找GDT还是LDT,查找表的什么位置,查出多少数据. 2、描述符 3、选择 选择是一个16位的描述符,该描述符指向了定义该描述符. RPL:请求特权级别 TI: TI=0 查GDT表 TI=1 查LDT
【2021.02.26】段寄存器结构
oalken的博客
02-26 449
什么是段寄存器? 当使用汇编读写某一个地址时:mov dword ptr ds:[0x123456], eax。 真正读写的地址是:ds.base + 0x123456。 ds:段寄存器。 base:ds段寄存器中的某一个成员。 有哪些段寄存器? ES、CS、SS、DS、FS、GS、LDTR、TR 段寄存器结构 对通用寄存器可能都有一定的了解,比如EAX寄存器可以分为8位、16位和32位的。EAX最大就是32位。 但是段寄存器不是这样的,段寄存器相对来说要复杂,它有96位。
段寄存器结构基础
03-18 978
(80386CPU)保护模式的特点:机制和页机制(保护模式是保护硬件资源以及OS内核的作用)。 1、段寄存器结构 Segment{ WORD Selector; //选择(可见)16位 WORD Attributes; //属性 (不可见)16位 WORD Base; //起始地址(不可见)32位 WORD Limit; // 大小(不可见)32位 } 段寄存器结构96位,其中16位可见,80位不可见,80位不可见中存在64位数据有效。 2、段寄存器只能...
写文章

热门文章

  • Windows程序入口 14445
  • movups | movaps 指令问题 12676
  • HTML+CSS实战入门这篇就够了(五) 11526
  • 驱动实验准备篇(如何给驱动签名) 7989
  • 全网最硬核PWN入门_图解分析 7045

分类专栏

  • 电子技术
  • reverse 14篇
  • PWN 41篇
  • web 6篇
  • IOT 3篇
  • 调试 3篇
  • 虚拟蜜罐 1篇
  • 数据库SQL 3篇
  • JAVAWEB 18篇
  • Win驱动内核实验 7篇
  • Python 9篇
  • 嵌入式 2篇
  • Android 1篇
  • 0DAY 5篇
  • 网络 2篇
  • 一些遇到的问题 9篇
  • C/C++ 16篇
  • 操作系统 15篇
  • 单片机 4篇
  • Windows内核 3篇
  • PE 9篇
  • 数据结构 11篇
  • 汇编 6篇
  • 工具篇 3篇
  • LINUX 20篇
  • windows编程 2篇
  • 密码学 2篇
  • 数学问题 1篇
  • 前端技术 6篇

最新评论

  • 内核_段寄存器|段描述符|段选择子(详解)

    若白1: 博主你好,那几个段寄存器的值是怎么得到的,黄色底纹那个图

  • [ZJCTF 2019]Login

    qq_40756753: 偏移应为58,而非0x58

  • ciscn_2019_s_4-栈迁移

    不知道叫什么名字。。。: 在p32(sys_addr)前加上b'aaaa',后面就是p32(buf),这是为什么呢,是什么栈对齐方式?

  • 数组逆序打印

    饿雨: define N 5是什么作用啊

  • mrctf2020_shellcode

    CSDN-Ada助手: 亲爱的博主,非常感谢您的辛勤创作!您所撰写的《mrctf2020_shellcode》真是一篇令人振奋的文章。在这个充满技术挑战的CTF赛事中,您通过精彩的内容和深入的分析,向我们展示了对shellcode的独到见解和应用方法。 您的文章极大地拓宽了读者对于shellcode的认识,并且通过实战演练的方式,提高了我们的技能水平。我要由衷地赞叹您的创作才能和对于CTF赛事的专业知识。 在此,我非常期待您下一篇可能创作的博客,相信您能够选择一个同样引人入胜的主题,继续呈现给我们精彩纷呈的内容。或许您可以探讨一些反向工程的技巧,分享一些隐蔽的逆向分析方法或是介绍一些新的安全漏洞,让我们更深入了解黑客的思维方式和应对策略。 期待您在博客中继续散发您出色的洞察力和深刻的技术见解。我相信,您的下一篇博客将再次给我们带来无尽的启发和惊喜。加油,期待了解更多您的专业知识和卓越才华!

大家在看

  • 【SpringBoot】一张图看懂初始化阶段-ApplicationEventMulticaster 487
  • Golang | Leetcode Golang题解之第500题键盘行 141
  • C++ -string -常见用法3 1279
  • 程序查询以及软件硬件 80
  • 最实用的Nginx配置笔记 250

最新文章

  • 02-独立按键控制LED状态
  • 01-创建项目-工具使用备忘录
  • hitcontraining_magicheap-unlink
2023年40篇
2022年23篇
2021年142篇
2020年7篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家唐河玻璃钢雕塑上海楼盘玻璃钢园林艺术雕塑石家庄玻璃钢雕塑公司小破孩玻璃钢雕塑湖北玻璃钢牛雕塑许昌附近不锈钢校园玻璃钢雕塑商场dp美陈雕塑玻璃钢雕塑模具三明玻璃钢人物雕塑定制江苏玻璃钢人物雕塑定制海口玻璃钢大型雕塑设计贵不贵玻璃钢大白菜雕塑报价广州市番禺区玻璃钢雕塑公司南通玻璃钢仿铜雕塑商家上海主题商场美陈售价银川景区玻璃钢雕塑制作哈尔滨卖玻璃钢花盆电话玻璃钢鹿雕塑选哪家商场美陈制作哪家好遵义玻璃钢景观雕塑厂家克拉玛依商场美陈玻璃钢春节节庆雕塑龙井市政工程玻璃钢花盆泰州玻璃钢仿真水果雕塑陕西玻璃钢彩绘雕塑小品山东季节性商场美陈售价呼市玻璃钢雕塑设计哪家好深圳市龙翔玻璃钢雕塑厂湖北景观园林玻璃钢人物雕塑兴安盟玻璃钢雕塑公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化