首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GDT,LDT,GDTR,LDTR

GDT,LDT,GDTR,LDTR 前言 全局描述符表GDT 局部描述符表LDT 中断描述符表IDT 段选择子 任务寄存器TR 实例 1:访问GDT 2:访问LDT ---- 前言 所谓工作模式,是指CPU...GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。...指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。在保护模式初始化过程中必须给GDTR加载一个新值。...---- 中断描述符表IDT 与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。...---- 2:访问LDT 当TI=1时表示段描述符在LDT中,如上图所示: ①还是先从GDTR寄存器中获得GDT基址。 ②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。

1.2K10

GDT,LDT,GDTR,LDTR 详解

GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。...GDTR中存放的是GDT在内存中的基地址和其表长界限。 基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。...在保护模式初始化过程中必须给GDTR加载一个新值。 ? GDTR (2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。...段描述符在LDT中 当TI=1时表示段描述符在LDT中,如上图所示: ①还是先从GDTR寄存器中获得GDT基址。 ②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。...扩展 除了GDTR、LDTR外还有IDTR和TR (1)中断描述符表寄存器IDTR 与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。

1.9K40
您找到你想要的搜索结果了吗?
是的
没有找到

x86保护模式下的内存分段的地址映射

此前的分段地址映射的模式已经不再适用,但是Intel x86的CPU为了能够保证整个体系向前兼容的能力,所以它并不能删除80386之前已有的CPU内部寄存器,如段寄存器CS,DS,SS。...它的解决办法是对已有的段寄存器做出新的定义。 保护模式下内存分段的地址映射的模式:段描述符+段表。 其中段表是由段表项组成的,那么有多少个段表项?,段表项具体描述了什么信息?,每个段表项有多大字节?...(1)对段寄存器的重新定义,即段描述符: 从上图可以看到段表的下标的最大值为2^13=8192个,但是由于Linux内核使用了12个,那么剩余了8180个段表项可以被使用。...(2)因为8086中的段寄存器已经被重新定义,所以80386扩充了新的寄存器LDTR,GDTR寄存器,用于存放段表的起始地址。 (3)段表项是如何定义的?...4.如TI=0使用GDT, GDTR[CS>>3].BaseAddress + IP(需要与length做比较,方式越界) = 线性地址,由于此处没有分页的机制,线性地址就是物理地址。

61240

全局描述符表

Hi~朋友,码字不易,点点关注呗 摘要 什么是全局描述符表 什么是段描述符 GDTR寄存器 段选择子 什么是全局描述符表 进入保护模式以后,数据段、代码段等内存段不再是通过段寄存器获得段基址就可以使用,...如果段是代码段,0表示指令中的有效地址地址和操作数是16位,指令地址使用IP寄存器,1代表指令中的有效地址和操作数是32位,指令有效地址用EIP寄存器;对于栈段来说,0使用的是SP寄存器,1使用的是ESP...寄存器 GDTR寄存器 有了段描述符以后,我们可以清楚的定义各种内存段,并且保存到了全局描述符表中。...全局描述符表也是存放在内存中,需要使用GDTR寄存器来指向它,这样CPU才能知道怎样找到全局描述符表。 GDTR寄存器(48位)存储的数据格式如下: ?...GDTR寄存器的后32位是GDT的开始地址。 GDTR寄存器的初始化需要通过lgdt指令。

89250

Linux 0.12 内核管理存储器

(32位系统一个虚拟段的最大长度,理论上为4G) Linux 0.12内核人工定义的最大任务数为64个。...GDT本身并非一个段,而是线性地址空间中的一个数据结构(故其不须要经过段机制地址翻译,GDTR中不须要段选择子)。 GDT的基线性地址和长度值必须载入进GDTR寄存器中。...【内存管理寄存器】 处理器提供了4个内存管理寄存器GDTR、LDTR、IDTR、TR)。用于指定内存分段管理所用系统表的基地址。...此段表的起始地址和表长度放在被称为GDTR的特殊寄存器中了。 在机器刚加电或处理器复位后,基地址被默认地设置为0。而长度值被设置成0xFFFF。 在保护模式初始化过程中,必须给GDTR载入一个新值。...3、中断描写叙述符表寄存器IDTR 与GDTR的作用类似,IDTR寄存器用于存放中断记录表IDT的32位线性基地址和16位表长度值。 相同。

1K10

内核的雏形(上) -- 创建属于 kernel 的堆栈与 GDT

切换 GDT 切换 GDT 的工作主要分两个步骤: 通过 sgdt 指令获取当前 gdtr 寄存器存储的 loader 的 GDT 存储空间首地址与界限 创建属于 kernel 的新的 GDT 存储空间...将 loader 的 GDT 拷贝到新的 GDT 存储空间中 通过 lgdt 指令将 kernel 的 GDT 存储空间首地址与界限载入到 gdtr 寄存器中 相对于堆栈切换,这部分的工作略微多了一些...加载新的 GDT 接下来,我们要在 kernel.asm 中调用 copy_gdt 并且通过 lgdt 指令加载新的 gdt 起始地址与界限到 gdtr。...长跳转,进入新的 GDT 程序执行中,段选择子被加载到 cs 寄存器中,除非进行长跳转,否则 cs 寄存器的值是不会发生变化的。...我们虽然通过上面的指令实现了 gdtr 寄存器的更新,但我们紧接着必须通过长跳转把新的段选择子更新到 cs 寄存器中: SELECTOR_KERNEL_CS equ 8 jmp

39220

80386的各种寄存器一览

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...(16位) • CS:代码段寄存器 • DS:数据段寄存器 • SS:堆栈段寄存器 • ES、FS 及GS:附加数据段寄存器 这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector...4、系统地址寄存器 • 全局描述符表寄存器GDTR(Global Descriptor Table Register ),是48 位寄存器,用来保存全局描述符表(GDT)的32 位基地址和GDT 的大小...• 任务状态寄存器TR(Task State Register)是16 位寄存器,用于保存任务状态段TSS 段的16 位选择符。 ? 5、调试寄存器和测试寄存器(32位) ?...80386 有两个32 位的测试寄存器TR6 和TR7。TR6 是测试命令寄存器,其内存放测试控制命令。TR7 是数据寄存器,其内保存转换旁路缓冲器测试的数据。

1.6K00

Linux从头学10:理解了这三个概念,才能彻底理解【任务管理】和【任务切换】

Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...正如处理器中有一个寄存器 GDTR,保存着 GDT 的开始地址和长度,处理器中还有一个寄存器 LDTR,存储着当前正在执行的那个应用程序的 LDT 开始地址和长度: 所有应用程序的虚拟内存的高端地址部分...,映射的都是操作系统的内存空间,按照 Linux 中的做法,3G ~ 4G 空间被操作系统使用。...GDTR 中的内容不变,因为每个应用程序中的 GDT 都是从操作系统“继承”而来的,开始地址和长度都是一样的。 TSS: 任务状态段 顾名思义,任务状态段就是用来存储和恢复任务的状态信息。...当然,Linux 系统中的处理过程更为复杂,它把每一个任务按照优先级放在不同的等待队列中,然后利用哈系桶算法来查找任务。 ------ End ------

68050

Windows程序设计学习笔记(一)Windows内存管理初步

在早期的16位8086CPU中我们使用段与段内的偏移偏移的方式寻址,得到的是真实的物理地址,当时的寄存器是16位而地址总线是20位,为了充分利用这些地址总线,Intel的工程师采用的是分段的方式,将段寄存器与通用寄存器中的数值通过地址加法器合成...所以用32位的通用寄存器都可以访问4GB的内存空间,这个时候段寄存器不在存储段的首地址段,寄存器DS、CS、ES等寄存器中存储的是段选择子的索引。...为了管理段描述符表,80386引入两个寄存器一个是48位的GDTR(全局段描述符表寄存器)另一个是16位的LDTR(局部段描述符表寄存器)分别指向GDT(全局段描述符表)和LDT(局部段描述符表)。...对于一个虚拟地址XXXX:YYYYYYYY首先判断XXXX中TI位的值,当TI = 0时表示的是全局段描述符表,这个时候首先利用GDTR中的值确定GDT的位置,然后直接取段寄存器中高13位的值作为索引在...GDTR中查找得到相应的段描述符,由于段描述符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址;当TI等于1时表示的是局部的段描述符表,这个时候寻址变得相对比较复杂,第一步还是从GDTR获得

48110

Linux从头学09:x86 处理器如何进行-层层的内存保护?

下一篇文章,我们就把 x86 中的分页机制打开,并与 Linux 中的分段和分页机制进行对比。...这个准备工作中,最重要的就是:建立 GDT 这个表,并且把 GDT 的开始地址,存储到寄存器 GDTR 中。...根据以上这些信息,就可以创建出栈的段描述符,如下: 当以上这几个段的描述符都创建好之后,就可以把 GDT 的地址(0x0001_0000),设置到 GDTR 寄存器中了。...在准备这篇文章的时候,我特意看了一下 《深入理解 Linux 内核》这部书的第二章:"内存寻址"部分的内容。...如果把之前的这几篇文章都理解了,再去看 Linux 内核的相关书籍,就不会那么吃力了。 Linux 虽然很复杂,但是它也是建立在处理器所提供的基本功能上的。

81530

一文讲透计算机的“中断”

咱们在此只介绍中断门描述符,4种描述符除了任务门其他都类似,中断门也是最常用的,如Linux的系统调用就是使用中断门实现的。...部分中断向量表,需要了解的部分如下图所示: image.png 3 中断描述符表寄存器IDTR image.png IDTR也类似于GDTR,存放的是48位数据信息,高32位是IDT的地址,低16...同GDTR,IDTR也有相应的加载指令:lidt m16&32,m是那48位数据信息,lidt指令将其加载到IDTR寄存器,使得CPU知道IDT在哪。...2、据中断描述符中的段选择子去GDT中索引段描述符,具体操作:取出GDTR中的GDT地址。加上段选择子高13位 * 8, 得到的地址为中断处理程序所在段的段基址。...5 中断处理过程 中断的实际处理过程就是执行中断处理程序,Linux将中断处理程序分为上下两部分,需要紧急处理立即执行的归为上半部,不那么紧急的归为下半部。 这便涉及到了开关中断的问题。

93221

一文详解 32 位保护模式与内存分段机制

分段与保护模式 IA-32 CPU 80286 的诞生,提供了 32 位的地址总线,与一系列 32 位寄存器,这让 CPU 拥有了 4GB 内存空间的寻址能力。...分段寻址过程 IA-32 CPU 中存在一个 48 位的分段描述符表寄存器 GDTR,他存储了 32 位的分段描述符表起始地址与 16 位的分段描述符表偏移量,因此只要读取分段描述符表寄存器,就可以在内存中找到对应的分段描述符表...全局描述符表寄存器 GDTR 下图展示了 48 位全局描述符表寄存器 GDTR 的存储结构: 显而易见,GDTR 定义了全局描述符表 GDT 的起始地址与界限,由于 GDTR 中 GDT 界限为 16...与 GDT 对应,每当操作系统需要使用某个 LDT 中的内存段时,都需要先将 LDT 的起始地址与界限载入到 LDTR 寄存器中。 8....当前特权级 CPL(Current Privilege Level) 他被存储在 cs 寄存器与 ss 寄存器的第 0 位和第 1 位上。

85631

Linux下开发stm32 ③ | 寄存器工程开发

先来回顾一下前两篇 Linux下开发stm32(一) | 使用gcc-arm-none-eabi工具链编译 Linux下开发stm32(二) | 使用openocd下载与调试 前两篇我们介绍了如何创建一个空的裸机工程...main文件),并编译工程生成elf文件,然后将其转为bin格式或hex格式,使用openocd下载,最后编写了一个makefile雏形,并成功点亮了一个LED~ 但是这个LED我们是通过指针直接操作寄存器地址来完成的...,接下来,我们在此基础上,引入stm32头文件,其中包含了寄存器的宏定义,也就是使用寄存器进行开发~ 1.创建寄存器工程 首先将上一节中创建的裸机工程00-template-reg复制一份出来,改名为01...0x40010c00+0x0c) &= ~(1<<0); GPIOB->ODR &= ~(1<<0); while(1); } void SystemInit(void) { } 至此,寄存器工程创建完毕...,接下来开始编译~ 2.编译&下载寄存器工程 编译寄存器工程的重点就在于C头文件和C源文件,启动文件的编译和链接都和之前一样。

1.2K30

又又又被内存坑了!!

这两个表的表项叫做段描述符,描述了一个内存段的信息,比如段的基地址、最大长度、访问属性等等一系列信息,它长这个样子: CPU中单独添置了两个寄存器,用来指向这两个表,分别是gdtr和ldtr。...在寻址的时候,CPU首先根据段寄存器中的号码,通过gdtr或ldtr来到GDT/LDT中取出对应的段描述符,然后再取出这个段的基地址,最后再结合段内的偏移,完成内存寻址。...以上是Windows的情况,我们再来看一下Linux情况呢。...:4 表类型:GDT 特权级:Ring3 十六进制:002B 二进制:0000000000101 0 11 段序号:5 表类型:GDT 特权级:Ring3 Linux下我没有找到可以直接用什么命令或者工具查看...Windows和Linux都选择了通过这种方式架空了CPU的分段内存管理机制。

49140

基于 Linux 0.11 讲解 Linux 操作系统的启动原理

不知道大家有没有产生过一个疑问:从给 Linux 服务器按下开机电源按钮后到启动成功的一段时间里,在这中间 Linux 操作系统都做了哪些事情?...在 Linux 服务器没有通电的时候,操作系统还只是躺在硬盘启动区中的一段程序,CPU 没有工作,内存也没有启动。但是在你按下开机键后,Linux 服务器内部就开始变得热闹了起来。...叫做《Linux 源码趣读》。这周,这本新书正式印刷出炉了。 对于 Linux 启动过程,代码的运行在书中总结成下面一张图来表示。但分了 50 小节来讲述每一个步骤中的细节。...接着 CPU 的数据段寄存器 ds 、代码段集寄存器 cs 和 栈段寄存器 ss、栈基址寄存器 sp 都会进行初始化。...全局描述符表入口位置保存在 gdtr 寄存器中,是为了后面逻辑地址转化成物理地址时使用的。接着进入保护模式、开启分页机制后会进入到内核的 main 函数中。 是的,内核也有一个 main 函数。

26211

进军保护模式

开启保护模式 CPU 中有 4 个控制寄存器: CR0 — 硬件控制开关 CR1 — 预留控制寄存器 CR2 — 页故障线性地址寄存器 CR3 — 页目录基址寄存器 CR0 的结构如下图所示: 上图中位于...CR0 寄存器 bit 0 的 PE 标志,就是用来表示是否已开启保护模式的标志,当 PE 位为 1 则表示当前系统运行在保护模式下,CPU 就会通过上一篇日志中通过 GDTR、段选择子以及描述符表来进行寻址...执行步骤 要进入保护模式,需要按照上述描述,按下列步骤进行一系列操作: 准备 GDT 通过 lgdt 指令加载 gdtr 通过 cli 指令关闭硬件中断 打开 A20 地址线 置 cr0 的 PE 位,...eax, 16 mov byte [LABEL_DESC_CODE32 + 4], al mov byte [LABEL_DESC_CODE32 + 7], ah ; 准备加载 GDTR...; 计算出 GDT 基地址的物理地址 mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 ; 加载 GDTR lgdt

60420

保护模式进阶 -- 再回实模式

原理描述 还记得我们是怎么从实地址模式进入保护模式的吗: 准备 GDT 通过 lgdt 指令加载 gdtr 通过 cli 指令关闭硬件中断 打开 A20 地址线 置 cr0 的 PE 位,打开保护模式...段描述符高速缓冲寄存器 保护模式寻址需要通过 GDTR 寄存器 + 段选择子定位到 GDT 中的描述符,再通过描述符中的段基址定位。...作为缓冲寄存器,用户是不能直接操作的,但每一次对任何一个段基址寄存器的赋值操作都会更新对应的缓冲寄存器。...16 mov byte [LABEL_DESC_STACK + 4], al mov byte [LABEL_DESC_STACK + 7], ah ; 准备加载 GDTR...; 计算出 GDT 基地址的物理地址 mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 ; 加载 GDTR

58210
领券