首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GDT,LDT,GDTR,LDTR 详解

    二、详解 先说明一下概念 (1)全局描述符GDT(Global Descriptor Table)在整个系统中,全局描述符GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,...GDTR中存放的是GDT在内存中的基地址和其长界限。 基地址指定GDT中字节0在线性地址空间中的地址,长度指明GDT的字节长度值。指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。...然后用描述符中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代选择子是在LDT选择。...我们可以这样理解GDT和LDT:GDT为一级描述符,LDT为二级描述符。如图 ? 局部描述符LDT LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。...它引用GDT中的一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。

    2.2K41

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

    一丶段描述符 1.1 GDT与LDT 1.1.1 段描述符之GDT 与 LDT的概述 GDT 查询inter手册可以得知. 当我们在保护模式下. 进行内存访问的时候 所有的内存访问....以上就是对GDT或者 LDT的描述 总结来说 GDT或者LDT 就是一块内存. 也可以看成一个数组....来表示 GDT中的8192个描述符的某一项. 由此可以得知.GDT不会超过 8192项 索引值 * 8 来索引 段描述符 由此可以得知....占用了8个字节大小 是GDT或者LDT中的一个数据结构 其实上面也说了当进行内存访问的时候,段选择子 当索引 查询GDT.来得出段描述符. 段描述符表示了 段基地址 段的大小 访问权限....总结与实验 总结1 GDT的操作 1.1 获取GDT数组.输出所有段描述符 遍历获取GDT 只是获取GDT的首地址.

    2.2K21

    操作系统的几种地址详解

    Intel设计的本意是,一些全局的段描述符,就放在“全局段描述符(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符(LDT)”中。...另一方面,其它某些硬件平台,没有二次转换的概念,Linux也需要提供一个高层抽像,来提供一个统一的界面。所以,Linux的段式管理,事实上只是“哄骗”了一下硬件而已。...按照Intel的本意,全局的用GDT,每个进程自己的用LDT——不过Linux则对所有的进程都使用了相同的段来对指令和数据寻址。即用户数据段,用户代码段,对应的,内核中的是内核数据段和内核代码段。...——不过Linux并没有完全享受这种福利,它的页目录和与已分配页面相关的页都是常驻内存的。...——不过Linux并没有完全享受这种福利,它的页目录和与已分配页面相关的页都是常驻内存的。

    1.9K10

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

    1.全局描述符GDT) 全局描述符GDT(Global Descriptor Table),除了任务门,中断门和陷阱门描述符外,包含着系统中所有任务都共用的那些段的描述符。...Linux 在启动的过程中设置了段寄存器的值和全局描述符GDT 的内容,段寄存器的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS 0x10 /...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 中的下标。...TSS 描述符存放在GDT 中,它是GDT 中的一个表项,由中断描述符(IDT)中的任务门(存放TSS段的选择符)装入TR来进行索引。...Linux 采用三级分页模式而不是两级。如图2.28 所示为三级分页模式,为此,Linux定义了3 种类型的

    1.1K30

    又又又被内存坑了!!

    是一个表格中表项的号码,这个,有可能是全局描述符GDT,也有可能是局部描述符LDT。 那到底是哪个?是由段选择子从低到高的第三位来决定的,如果这一位是0,则是GDT,否则就是LDT。...:GDT 特权级:Ring3 十六进制:0023 二进制:0000000000100 0 11 段序号:4 类型:GDT 特权级:Ring3 也就是说,cs段指向的是GDT中的第3个表项,其他三个寄存器指向的是...以上是Windows的情况,我们再来看一下Linux情况呢。...:GDT 特权级:Ring3 十六进制:002B 二进制:0000000000101 0 11 段序号:5 类型:GDT 特权级:Ring3 Linux下我没有找到可以直接用什么命令或者工具查看GDT...Windows和Linux都选择了通过这种方式架空了CPU的分段内存管理机制。

    54740

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

    1.全局描述符GDT) 全局描述符GDT(Global Descriptor Table),除了任务门,中断门和陷阱门描述符外,包含着系统中所有任务都共用的那些段的描述符。...Linux 在启动的过程中设置了段寄存器的值和全局描述符GDT 的内容,段寄存器的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS 0x10 /...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 中的下标。...TSS 描述符存放在GDT 中,它是GDT 中的一个表项,由中断描述符(IDT)中的任务门(存放TSS段的选择符)装入TR来进行索引。...Linux 采用三级分页模式而不是两级。如图2.28 所示为三级分页模式,为此,Linux定义了3 种类型的

    1.3K50

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

    例如:在保护模式下的段选择器,我们一直都只把它看做一个段描述符的"索引号",用来在 GDT (全局描述描述符) 中查找一个段描述符,例如: 图中:代码段寄存器中的索引号是 4 ,GDT 中每一个表项占用...因此,我们需要纠正之前的错误:段寄存器中,不仅仅有段的索引号,还有另外两个属性:TI 和 RPL,如下图所示: TI 标志位:表示到哪个中(GDT or LDT)查找描述符; TI = 0: 到...LDT:局部描述符 在上一篇文章中,操作系统把应用程序从硬盘读取到内存中之后,为应用程序创建了三个段描述符,这三个段描述符都放在了 GDT 中,这是不合理的。...在 Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...,映射的都是操作系统的内存空间,按照 Linux 中的做法,3G ~ 4G 空间被操作系统使用。

    85150

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

    然后 OS 利用这个段索引号,去查找 GDT ,从而找到每一个段的基地址以及其他一些保护信息。...这个准备工作中,最重要的就是:建立 GDT 这个,并且把 GDT 的开始地址,存储到寄存器 GDTR 中。...确定 GDT 的地址 在创建段描述符之前,需要先确定: 把 GDT 放在内存中的什么位置? 暂且就把它放在 0x0001_0000 这个地址吧,距离零地址 64K 的位置。...想象一下:每执行一条指令,都会从逻辑地址中,获取到段索引号,然后去查找 GDT ,从而定位到段的基地址。 大家都知道程序有个“局部性”原理,也就是连续执行的代码,都是集中在一段连续的程序空间中的。...如果把之前的这几篇文章都理解了,再去看 Linux 内核的相关书籍,就不会那么吃力了。 Linux 虽然很复杂,但是它也是建立在处理器所提供的基本功能上的。

    86130

    《一个操作系统的实现》笔记(5)--内核雏形

    ---- 我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。...---- 在Linux下用汇编写程序 示例: ;hello.asm [section .data] ; 数据在此 strHello db "Hello, world!"...0 mov eax, 1 ; sys_exit int 0x80 ; 系统调用 编译链接方法: (ld 的‘-s’选项意为“strip all”) 去掉符号等内容...现在的内存分布式这样的:0x90000开始的63KB留给了Loader.bin,0x80000开始的64KB留给了Kernel.bin,0x30000开始的320KB留给了整理后的内核,而页目录和页被放置在了...在start.c中,我们成功的把gdt_ptr的值修改了,让它的基地址字段等于在start.c中定义的gdt数组变量。 memcpy把在loader.asm中定义的GDT复制给gdt数组了。

    1.2K40

    理解进程的新建和执行过程

    本文以linux0.11版本为基础,分析进程的内存布局,现代版本已经发生比较大的变化,都是很多原理都是类似的。...设置线性地址到ldt的描述符中 set_base(p->ldt[1],new_code_base); set_base(p->ldt[2],new_data_base); // 把父进程的页目录项和页复制到子进程...有自己独立的页,和父进程共享物理地址。那么当这个进程被调度的时候,他会发生什么。...结构体数组,然后根据当前段的属性,比如代码段,则从cs中取得选择子,系统从ldt中取得进程线性空间的首地址、限长、权限等信息。...用线性地址的首地址加上ip中的偏移,得到线性地址,然后再通过页目录和页得到物理地址,物理地址还没有分配则进行缺页异常等处理。

    74520

    Linux从头学10:三级跳过程详解-从 bootloader 到 操作系统,再到应用程序

    公众号:【IOT物联网小镇】,专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。...bootloader 跳转到操作系统 在上一篇文章中,讨论了 bootloader 在进入保护模式之后,在地址 0x0001_0000 处创建了全局描述符(GDT),中创建了 3 个段描述符:...我们可以联想一下: 现代 Linux 系统中 ELF 文件的格式,在文件头部中记录了每一个段的长度,具体解析请参考这篇文章:Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索...PS: 在现代操作系统中,应用程序都会有一个自己私有的局部描述符 LDT,专门存储应用程序自己的段描述符。 还记得之前讨论过的下面这张图吗?...此时的 GDT 就是下面这样: 从这张图中已经可以看出一个问题了: 如果所有应用程序的段描述符都放在全局的 GDT 中,当应用程序结束之后,还得去更新 GDT,势必给操作系统的代码带来很多麻烦。

    54650

    《一个操作系统的实现》笔记(2)--保护模式

    这个数据结构就是GDT(全局符号), 其中的表项叫做描述符(Descriptor),另外有一个指向描述符的指针叫做选择子(Selector)。...这样CPU就能知道GDT这张了,之后的内存寻址就会根据这张的指示去找了。 ; 加载 GDTR lgdt [GdtPtr] 3、实模式下的善后工作和保护模式下的初始化工作。...LABEL_SEG_CODE32: mov ax, SelectorVideo ;... ---- LDT(Local Descriptor Table) LDT跟GDT类似,都是描述...Linux内核中并没有用到调用门。 门调用过程: ? 通过调用门进行控制转移的特权级检查: ?...分段和分页操作都使用驻留在内存中的来指定它们各自的变换信息。这些只能由操作系统访问,以防止应用程序擅自修改。

    1.5K80

    进入Linux内核前的准备

    最近看到这个github仓库flash-linux0.11-talk,觉得还算是蛮有意思的,加上网络编程的课程又有抄写一段tcp协议实现代码或者交一篇linux内核源码阅读的笔记,还是比较讨厌这种低效率的抄写的所以就想写篇文章记录一下粗浅阅读源码后的大概了解...进入linux内核前的准备 开机 如果问电脑是如何一步一步开始运行操作系统的,那么第一件事情当然是按下开机键啦。...,所以全局描述符gdt的内存地址是用0x90200 + gdt描述的。...我们把gdt_48赋值给gdtr寄存器,gdt_48中存储的又恰好是gdt的地址,那么我们就可以通过gdtr寄存器找到gdt了,现在让我们来看一下gdt标签的内容是啥。...继续看head.s,两个call语句设置了中断描述符IDT和全局描述符GDT,然后后面又是重新执行了一遍前面的代码,为什么要重新设置段寄存器的值呢?

    5.6K20
    领券