实模式/保护模式,GDT/LDT的含义

简介: 1、实模式、保护模式CPU启动时有两种模式,分别是:实模式 和 保护模式 实模式:不能使用多线程。不能实现权限分级。还不能访问20位以上地址线,也就是说只能访问1M内存(!!!)地址转换公式是:物理地址 = 线性地址 = 段地址*16 + 段偏移 保护模式:操作系统(system模块中的head.s程序)接管CPU后,会使CPU进入保护模式. 包括CPU权限分级. 多任务,内存分页等各种功能。

1、实模式、保护模式
CPU启动时有两种模式,分别是:实模式 和 保护模式


实模式:不能使用多线程。不能实现权限分级。还不能访问20位以上地址线,也就是说只能访问1M内存(!!!)
地址转换公式是:物理地址 = 线性地址 = 段地址*16 + 段偏移



保护模式:操作系统(system模块中的head.s程序)接管CPU后,会使CPU进入保护模式.
包括CPU权限分级. 多任务,内存分页等各种功能。


2、地址转换步骤

地址转换:查全GDT--> 查LDT --> 找到段(确定段基址) --> 确定线性地址 = 段基址 + 偏移 --> 物理地址 = 线性地址 + 分页 

段寄存器中存放的不再是被寻址段的基地址,而是一个段描述符表某一描述符项在表中的索引值。 
全局段描述符表:  线性地址空间上一个数组。每个结构单元代表一个“段”     一“段”的含义:   段基地址 (BASE)和大小(LIMIT),它们会参与到逻辑地址的转换过程。 
局部段描述符表:   通常每个任务使用一个LDT表。作为对GDT表的扩充。
(在Linux中,4个最主要的段描述符-
    用户态代码/用户态数据段/内核态代码段/内核态数据段
 都被设置成 BASE=0x0000000, LIMIT=0xffffffff)
实模式/保护模式,GDT/LDT的含义  

3、GDT,LDT  

(1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。

GDTR结构

(2)段选择子(Selector)由GDTR访问全局描述符表(GDT)是通过“段选择子”(实模式下的段寄存器(我个人理解的CS寄存器))来完成的,如图三①步。段选择子是一个16位的寄存器(同实模式下的段寄存器相同)如图四

selector 

选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。他的index(描述符索引)部分表示所需要的段的描述符 在描述符表的位置(我的理解是根据这个CS寄存器里面的index去GDT或LDT中找对应的段),由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符(如图三①步)。然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址(如图三②步),段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。

关于特权级的说明:任务中的每一个段都有一个特定的级别。每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。

例如给出逻辑地址:21h:12345678h转换为线性地址 a. 选择子SEL=21h=0000000000100 0 01b 他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1 b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h

3)局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干张,每个任务可以有一张。我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。如图

 gdt寻址

LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。LDTR记录局部描述符表的起始位置,与GDTR不同LDTR的内容是一个段选择子。由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。LDTR可以在程序中随时改变,通过使用lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。

举个例子:如果我们想在表LDT2中选择第三个描述符所描述的段的地址12345678h。 

1. 首先需要装载LDTR使它指向LDT2 使用指令lldt将Select2装载到LDTR 

2. 通过逻辑地址(SEL:OFFSET)访问时SEL的index=3代表选择第三个描述符;TI=1代表选择子是在LDT选择,此时LDTR指向的是LDT2,所以是在LDT2中选择,此时的SEL值为1Ch(二进制为11 1 00b)。OFFSET=12345678h。逻辑地址为1C:12345678h 

3. 由SEL选择出描述符,由描述符中的基址(Base)加上OFFSET可得到线性地址,例如基址是11111111h,则线性地址=11111111h+12345678h=23456789h 

4. 此时若再想访问LDT1中的第三个描述符,只要使用lldt指令将选择子Selector 1装入再执行2、3两步就可以了(因为此时LDTR又指向了LDT1) 由于每个进程都有自己的一套程序段、数据段、堆栈段,有了局部描述符表则可以将每个进程的程序段、数据段、堆栈段封装在一起,只要改变LDTR就可以实现对不同进程的段进行访问。



 http://blog.csdn.net/lianxi1999/article/details/1799298
1.
因为CPU使用的logical addr。为了使CPU能正常工作,我们需要提供给它的各种寄存器以logical addr。   2.  维护多进程切换信息。        A.gdtr寄存器指向GDT在内存中的首地址。用CS,DS中的内容做为segment selector。        B.CS前13位作为index,最低2位用来判断CPU是运行在0级还是3级(DPL),剩下那位指明访问GDT还是LDT。           GDT/LDT的表项里有DPL, CPU访问它时要对比CS最低两位和GDT表项中的DPL,通过了检查才可以继续访问.        C.TSS(状态段)是一个特殊的段。进程切换前把CPU寄存器压栈入内

 
 

保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成 

段描述符寄存器: 存储段描述符 选择器:存储段描述符的索引

PS:原先实模式下的各个段寄存器作为保护模式下的段选择器,80486中有6个(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同时提供6个段左右机器当前运行的地址空间。由选择器CS对应表示的段仍为代码段,选择器SS对应表示的段仍为堆栈段

-----------------------------------------------我是分割线------------------------

段描述符

P,present位,1表示所描述的段存在(有效),为0表示所描述的段无效,使用该描述符会引起异常 DPL,Descriptor privilege,描述符特权级别,说明所描述段的特权级别 DT,描述符类型位,1说明当前描述符为存储段描述符,0为系统描述符或门描述符. TYPE: 位0:A(accessed)位,表明描述符是否已被访问;把选择子装入段寄存器时,该位被标记为1 位3:E(EXECUTABLE?)位,0说明所描述段为数据段;1为可执行段(代码段) 当为数据段时, 位1为W位,说明该数据段是否可写(0只读,1可写) 位2为ED位,说明该段的扩展方向(0向高位扩展,1向低位扩展) 当为可执行段是, 位1为R位,说明该执行段是否可读(0只执行,1可读) 位2为C位,0说明该段不是一致码段(普通代码段),1为一致码段 G为粒度位,0说明LIMIT粒度为字节,1为4K字节. D位: 1.在可执行段中,D为1,表示使用32位地址,32/8位操作数;为0表示使用16位地址,16/8位操作数 2.在由SS寻址的段描述符(堆栈段?)中,D为1表示隐含操作(如PUSH/POP)使用ESP为堆栈指针,/ 为0使用SP(隐含操作:未明确定义段属性类型USE16/USE32?66H,67H?) 3.在向低扩展的存储段中,D为1,表示段的上限为4G;为0上限为64K 存储段描述符的结构表示:

分段管理可以把虚拟地址转换成线性地址,而分页管理可以进一步将线性地址转换成物理地址。当CR0中的PG位置1时,启动分页管理功能,为0时,这禁止启动分页管理功能,并且把线性地址作物理地址使用。

虚拟地址转为线性地址:

线性地址= 段基指 + 偏移地址

32位线性地址转为物理地址 32位分为: 页目录索引:占最高10位,指示页目录表中第几个页表描述符 页表索引:占12位到21位,也是10位。指示这页表中第几个页描述符 页描述符:线性地址的低12位为页内偏移量。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
网络协议 安全 测试技术
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
420 2
|
4月前
|
数据采集 人工智能 监控
零代码改造!LoongSuite AI 采集套件观测实战
本文介绍了AI应用生态的快速发展及可观测性的重要性,重点阐述了LLM(大语言模型)应用的复杂性对全链路监控的需求。LoongSuite作为开源的可观测性数据采集套件,提供无侵入式埋点、全栈观测与多语言支持,助力AI应用实现从端侧到模型层的端到端链路追踪,提升系统稳定性与运维效率。
295 1
|
4月前
|
算法 数据挖掘 异构计算
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
281 0
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
|
9月前
|
数据库 对象存储
2025年 | 4月云大使推广奖励规则
【近期云大使规则升级】①上线老用户返佣规则。②企业云大使提现功能上线。③优化推广奖励限制。④调整用户关联周期。⑤新增沉睡用户返利 。⑥推荐企业认证新用户首购最高奖励45%。
2025年 | 4月云大使推广奖励规则
|
存储 NoSQL Java
面试官:项目中如何实现布隆过滤器?
面试官:项目中如何实现布隆过滤器?
257 1
面试官:项目中如何实现布隆过滤器?
|
网络协议 安全 Java
Java Socket原理
Java Socket原理是指在Java中通过Socket实现的网络通信的基础理论与机制。Socket是网络中不同设备间通信的一种标准方式,它允许应用程序之间通过TCP/IP等协议进行数据交换。在Java中,利用Socket编程可以方便地创建客户端与服务器端应用,实现跨网络的数据传输功能,是互联网软件开发中的重要技术之一。它支持多种通信模式,如可靠的流式套接字(TCP)和数据报式套接字(UDP)。
274 10
|
存储 自然语言处理 数据库
UTF-8编码:打破字符编码的国界
UTF-8编码:打破字符编码的国界
|
存储 编译器 API
BackTrader 中文文档(十)(1)
BackTrader 中文文档(十)
650 0
|
API Windows
微软新一代输入法框架 TSF - Text Service Framework 小小的研究
原文:微软新一代输入法框架 TSF - Text Service Framework 小小的研究 虽说是转载的,但是其中,有很多我自己的评论,我会用红色的字标出来,参考的博文有: TSF架构:http://blog.
4886 0
|
缓存 前端开发 JavaScript
No43.精选前端面试题,享受每天的挑战和学习
No43.精选前端面试题,享受每天的挑战和学习