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

GDT,LDT,GDTR,LDTR

GDT,LDT,GDTR,LDTR 前言 全局描述符表GDT 局部描述符表LDT 中断描述符表IDT 段选择子 任务寄存器TR 实例 1:访问GDT 2:访问LDT ---- 前言 所谓工作模式,是指CPU...我们可以这样理解GDTLDTGDT为一级描述符表,LDT为二级描述符表。...LDTGDT从本质上说是相同的,只是LDT嵌套在GDT之中。 LDTR记录局部描述符表的起始位置,与GDTR不同,LDTR的内容是一个段选择子。...---- 2:访问LDT 当TI=1时表示段描述符在LDT中,如上图所示: ①还是先从GDTR寄存器中获得GDT基址。 ②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。...③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器高13位位置索引值从LDT段中得到段描述符。

1.2K10

GDT,LDT,GDTR,LDTR 详解

然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。...我们可以这样理解GDTLDTGDT为一级描述符表,LDT为二级描述符表。如图 ? 局部描述符表LDT LDTGDT从本质上说是相同的,只是LDT嵌套在GDT之中。...由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。...2:访问LDT ? 段描述符在LDT中 当TI=1时表示段描述符在LDT中,如上图所示: ①还是先从GDTR寄存器中获得GDT基址。...②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。 ③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器高13位位置索引值从LDT段中得到段描述符。

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

VV的操作系统笔记(二)保护模式及GDTLDT

学习过操作系统的都了解一个多任务的操作系统中是通过时间轮盘算法来对程序进行调度,使得CPU在不同周期执行着不同的指令,通过汇编代码可以看到每个程序都有着自己的描述符号即LDT局部描述符表来组建对变量和代码之间的符号描述...然而此时还需要一个针对全局的,对计算机运行状态进行控制的全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置...unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #ifndef FRTOS_GDT_H...#define FRTOS_GDT_H #include "types.h" class GlobalDescriptorTable { public: class SegementDescriptor...#include "gdt.h" #include "types.h" GlobalDescriptorTable::GlobalDescriptorTable() : nullSegementDescriptor

97330

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

LDT:局部描述符表 在上一篇文章中,操作系统把应用程序从硬盘读取到内存中之后,为应用程序创建了三个段描述符,这三个段描述符都放在了 GDT 表中,这是不合理的。...LDT 所占用的空间也属于内存的一部分,有起始地址和长度界限,因此也需要为它创建一个段描述符,这个描述符就放在 GDT 中。...在 Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...,映射的都是操作系统的内存空间,按照 Linux 中的做法,3G ~ 4G 空间被操作系统使用。...TSS 也有起始地址和长度界限,也需要为它在 GDT 中创建一个段描述符。 与 LDT 类似,在处理器中也有一个寄存器 TR,用来指向当前正在执行的那个任务的 TSS。

76150

实战局部描述符表 LDT

内存中只能有一个 GDT,但却可以存在多个 LDT,如上图所示,每个 LDT 作为 GDT 中一个描述符描述的内存段。 通常,一个 LDT 用于划分一个特定任务执行过程中需要使用的内存分段。 3....描述符结构 LDT 描述符与 GDT 描述符的结构是一模一样的: 可以参看: 详解 32 位保护模式与内存分段机制 4....equ LABEL_DESC_LDT - LABEL_GDT 4.4....初始化 GDT 中指向 LDT 的描述符的段基址及 LDT 代码描述符段基址 ; 初始化 LDTGDT 中的描述符 xor eax, eax mov ax, ds shl eax, 4 add eax...由于 GDT 描述的内存对于所有进程来说都是可见的,且具有相同权限,如果需要为每个进程单独定义权限,也可以通过定义 LDT 的方式来解决,具体做法是创建 LDT 描述符,定义独立的属性,但内存指向 GDT

74230

Linux 0.12 内核管理存储器

大家好,又见面了,我是全栈君 Linux 0.12 内核管理存储器 其分段,用分段的机制把进程间的虚拟地址分隔开。 每一个进程都有一张段表LDT。整个系统有一张GDT表。...(32位系统一个虚拟段的最大长度,理论上为4G) Linux 0.12内核人工定义的最大任务数为64个。...,可訪问的段包含自己LDT段表中的段和GDT中操作系统的段。...LDT表存放在LDT类型的系统段中。此时GDT必须含有LDT的段描写叙述符。 【内存管理寄存器】 处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR、TR)。...2、局部描写叙述符表寄存器LDTR LDT表是当前进程的段的段表。 包括LDT表的段必须在GDT表中有一个段描写叙述符项。

1.1K10

80386的分段机制、分页机制和物理地址的形成

每一个任务的局部描述符表LDT 本身也用一个描述符来表示,称为LDT 描述符,它包含了有关局部描述符表的信息,被放在全局描述符表GDT 中,使用LDTR进行索引。...5、linux中的段机制 从2.2 版开始,Linux 让所有的进程(或叫任务)都使用相同的逻辑地址空间,因此就没有必要使用局部描述符表LDT。...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 表中的下标。...按Intel 的规定,每个进程有一个任务状态段(TSS)和局部描述符表LDT,但Linux 也没有完全遵循Intel 的设计思路。...如前所述,Linux 的进程没有使用LDT,而对TSS 的使用也非常有限,每个CPU 仅使用一个TSS。

99130

80386的分段机制、分页机制和物理地址的形成

每一个任务的局部描述符表LDT 本身也用一个描述符来表示,称为LDT 描述符,它包含了有关局部描述符表的信息,被放在全局描述符表GDT 中,使用LDTR进行索引。...5、linux中的段机制 从2.2 版开始,Linux 让所有的进程(或叫任务)都使用相同的逻辑地址空间,因此就没有必要使用局部描述符表LDT。...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 表中的下标。...按Intel 的规定,每个进程有一个任务状态段(TSS)和局部描述符表LDT,但Linux 也没有完全遵循Intel 的设计思路。...如前所述,Linux 的进程没有使用LDT,而对TSS 的使用也非常有限,每个CPU 仅使用一个TSS。

1.3K50

保护模式 3讲-段寄存器GDT表与个人代码总结

一丶段描述符 1.1 GDTLDT 1.1.1 段描述符之GDT表 与 LDT表的概述 GDT表 查询inter手册可以得知. 当我们在保护模式下. 进行内存访问的时候 所有的内存访问....一个全局或者局部标志 决定了 段选择子 是指向GDT 还是 LDT. 想要访问GDT 或者LDT 要提供 段选择子以及偏移地址....GDT表或者LDT表的线性地址都存储在 GDTR 寄存器与 LDTR寄存器 中. 通过上面我们可以得出几点概要 保护模式下.我们的内存访问其实都是查表. 查的是GDT 或者 LDT....这一项保存的是 段描述符结构 GDT或者LDT表中.保存的是段描述符结构 段描述符里面才真正的 描述了 段的基地址 访问特权 类型 和用法信息 访问GDT或者LDT 就要提供段选择子以及偏移地址....以上就是对GDT表或者 LDT表的描述 总结来说 GDT或者LDT 就是一块内存. 也可以看成一个数组.

2.1K21

操作系统内存分区与分页--11

---- 但是因为每个进程都需要一个LDT表,进程数量又是在动态变化的,因此为了统计和管理LDT表,就利用GDT表来存放所有存在的LDT表,GDT表整个系统只有一份: GDT,LDT,GDTR,LDTR...所以,是先通过GDTR寄存器定位到GDT表在内存中的位置,然后通过LDTR中保存的选择子(下标),去GDT表中定位到对应的LDT表描述符,该描述符提供了当前LDT表的基值,然后将该基址赋值给LDTR...,那么LDTR就指向了当前进程的LDT表。...---- 可以看出来,每个进程关联的LDT表,其实就是我们之前说的,用来完成进程间内存隔离用到的映射表,因此,再进行进程切换时,需要切换LDT表,即处理器会把新任务LDT的段选择符和段描述符自动地加载进...不需要内存紧缩,因为内存分配最小单元为页 最大浪费内存为4k,例如: 有个段需要3页多一丢丢的内存,此时还是需要分配给他四页内存,相当于浪费了接近一页内存,而一页内存在linux 0.11中的大小为4k

72630

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

上文提到的 GDTLDT、IDT 又是什么呢?他们的结构是什么样的呢?保护模式中的“保护”体现在哪里呢? 本文就让我们来一探究竟。 2....与 GDT 对应,每当操作系统需要使用某个 LDT 中的内存段时,都需要先将 LDT 的起始地址与界限载入到 LDTR 寄存器中。 8....剩余 3 位分别是 TI 位与 RPL,TI 位为 0 表示当前索引的是 GDT,为 1 则表示当前索引的是 LDT。 RPL 是访问特权级,可以是 0、1、2 或 3,数字越小,特权级越大。 9....GDT/LDT 描述符属性 GDTLDT 的第 5、6 字节拥有一系列属性,如下图所示: 9.1....描述符特权级 DPL(Descriptor Privilege Level) 在附录中的 GDT 属性字段里,有另一个特权级字段 DPL。 他定义了 GDT/LDT 中对应对应内存段的特权级。

1.1K31

操作系统的几种地址详解

Intel设计的本意是,一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符表(LDT)”中。...那究竟什么时候该用GDT,什么时候该用LDT呢?这是由段选择符中的T1字段表示的,=0,表示用GDT,=1表示用LDT。...GDT在内存中的地址和大小存放在CPU的gdtr控制寄存器中,而LDT则在ldtr寄存器中。 好多概念,像绕口令一样。...按照Intel的本意,全局的用GDT,每个进程自己的用LDT——不过Linux则对所有的进程都使用了相同的段来对指令和数据寻址。即用户数据段,用户代码段,对应的,内核中的是内核数据段和内核代码段。...Linux中,绝大部份进程并不例用LDT,除非使用Wine ,仿真Windows程序的时候。4.CPU的页式内存管理 CPU的页式内存管理单元,负责把一个线性地址,最终翻译为一个物理地址。

1.9K10

java开发系统内核:使用LDT保护进程数据和代码

除了全局描述符表(GDT)外,X86还提供了另一种数据结构叫局部描述符表(LDT),局部描述符表的结构跟全局描述符表一模一样。不同的是,全局描述符表只能存在一份,而局部描述符表可以是每个进程一份。...//change here set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int)taskctl->tasks0[i].ldt,...AR_LDT); } .... } TASK_GDT0 的值是7,在全局描述符表中,前7个描述符有专门用途,从第7个往后就用来指向进程对应的任务门描述符(TSS),当前我们的系统内核最多支持同时运行的进程数是...语句: set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int)taskctl->tasks0[i].ldt, AR_LDT); 它的作用是将局部描述符表的起始地址放置到全局描述符表对应的描述符中...,AR_LDT的值是0x0082,用来表示当前描述符是专门指向一个局部描述符表的描述符。

76730

windows内核系统结构

idt可以查看IDT表 GDT全局描述表 windows分为实模式(内核)和保护模式 实模式,Segment+Offset的方式访问,Segment16位(向后兼容,cpu位数增加寄存器位数增加,16位段寄存器数据被写入内存...,所以增加了GDT描述段地址、段属性、段界限),每个段地址指向64k(16位cpu)大小,段地址因为左移4位所以地位大都是0,Offset是相对于Segment偏移 保护模式,内存的管理模式分为两种,分段模式...distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-12-115580324.pc_search_result_control_group&utm_term=idt+gdt...+ldt++%E5%88%86%E9%A1%B5&spm=1018.2226.3001.4187 LDT局部描述表 任务切换,系统当前的局部描述符表LDT也随之切换,LDT实现了任务间的隔离,GDT可以存放任务共享的段

40220

xv6(15) 进程一:数据结构

$LDT$,$TSS$ 的属性字段中就包括 $LDT$,诸位可能对 $GDT$(全局描述符表) 比较熟悉,这在前文也提到过很多次,那 $LDT$ 是什么呢?...每个 $LDT$ 都需要在 $GDT$ 中注册,也就是说对于每个 $LDT$,$GDT$ 中都要有相应的 $LDT$ 描述符,这也证明了 $GDT$ 才是老大哥。...那如何寻找 $LDT$ 呢,我们知道 $GDTR$ 中存放的有 $GDT$ 的地址和界限,$CPU$ 就知道 $GDT$ 从哪儿开始到哪结束。那 $LDT$ 是否有类似的寄存器 $LDTR$?...有倒是有,但 $LDTR$ 里面存放的并不是像 $GDTR$ 那样的基址和界限,因为 $LDT$ 在 $GDT$ 中有注册,靠 $GDT$ 来寻址,所以 $LDTR$ 里面存放 $LDT$ 的选择子就行了...因此每个进程的段描述符完全可以放在 $GDT$ 里面,而不必放在私有的 $LDT$ 里面,反正都共用了,直接放在 $GDT$ 里面肯定更省事。

24010
领券