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

GDT,LDT,GDTR,LDTR 详解

二、详解 先说明一下概念 (1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,...但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器...,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。...我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。如图 ? 局部描述符表LDT LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。...三、实例(对理解非常有用) 1:访问GDT ? 段描述符在GDT中 当TI=0时表示段描述符在GDT中,如上图所示: ①先从GDTR寄存器中获得GDT基址。

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

在winxp环境下,用windbg查看GDT表、IDT表、TSS描述符

网上搜索了一圈,才觉得查看GDT、IDT、TSS这些应该是属于内核调试的。...cosmoslife/article/details/48785683)(话说这个博客的头像有点眼熟啊,会不会我上次那个安装bochs就是参考这位大牛的……) 一开始看这个博客没怎么看懂,不知道显示指定范围和查看GDT...NextThread: 00000000 IdleThread: 80553840 DpcQueue: 仔细看一下,会发现里面有显示IDT、GDT...、TSS,那时候我以为这个就算查看到了吧,但是感觉又有点不相信,接着往下看,第一次看的时候没看懂下面的dd是干什么,后来好像有点懂了,这里dd后面加的是8003f000,这不就是GDT后面的值嘛,应该是它的地址了...,那既然查看GDT是这样,那查看IDT、TSS不是也可以dd后面加它们对应的后面的数字就可以了嘛。

1.4K40

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

下一篇文章,我们就把 x86 中的分页机制打开,并与 Linux 中的分段和分页机制进行对比。...实模式:bootloader 为程序计算段的基地址 在之前的文章:Linux从头学06:16张结构图,彻底理解【代码重定位】的底层原理中,我们讨论了 bootloader 是如何把应用程序读取到内存中...这个准备工作中,最重要的就是:建立 GDT 这个表,并且把 GDT 的开始地址,存储到寄存器 GDTR 中。...在准备这篇文章的时候,我特意看了一下 《深入理解 Linux 内核》这部书的第二章:"内存寻址"部分的内容。...如果把之前的这几篇文章都理解了,再去看 Linux 内核的相关书籍,就不会那么吃力了。 Linux 虽然很复杂,但是它也是建立在处理器所提供的基本功能上的。

81430

操作系统的几种地址详解

OK,来看看Linux怎么做的。3、Linux的段式管理 Intel要求两次转换,这样虽说是兼容了,但是却是很冗余,呵呵,没办法,硬件要求这样做了,软件就只能照办,怎么着也得形式主义一样。...另一方面,其它某些硬件平台,没有二次转换的概念,Linux也需要提供一个高层抽像,来提供一个统一的界面。所以,Linux的段式管理,事实上只是“哄骗”了一下硬件而已。...按照Intel的本意,全局的用GDT,每个进程自己的用LDT——不过Linux则对所有的进程都使用了相同的段来对指令和数据寻址。即用户数据段,用户代码段,对应的,内核中的是内核数据段和内核代码段。...5.Linux的页式内存管理 原理上来讲,Linux只需要为每个进程分配好所需数据结构,放到内存中,然后在调度进程的时候,切换寄存器cr3,剩下的就交给硬件来完成了(呵呵,事实上要复杂得多,不过偶只分析最基本的流程...5.Linux的页式内存管理 原理上来讲,Linux只需要为每个进程分配好所需数据结构,放到内存中,然后在调度进程的时候,切换寄存器cr3,剩下的就交给硬件来完成了(呵呵,事实上要复杂得多,不过偶只分析最基本的流程

1.8K10

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

公众号:【IOT物联网小镇】,专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。...我们可以联想一下: 现代 Linux 系统中 ELF 文件的格式,在文件头部中记录了每一个段的长度,具体解析请参考这篇文章:Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索...段寄存器的 bit2 位 TI 标志,就说明了需要到 GDT 中查找段描述符?还是到 LDT 中去查找? 为了方便起见,我们就把所有的段描述符都放在 GDT 中。...此时的 GDT 就是下面这样: 从这张图中已经可以看出一个问题了: 如果所有应用程序的段描述符都放在全局的 GDT 中,当应用程序结束之后,还得去更新 GDT,势必给操作系统的代码带来很多麻烦。...对于第一个问题,所以 Linux 中通过中断,提供一个统一的调用入口地址,然后通过一个寄存器来区分是哪一个函数。

49750

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

其次,当引入特权级别之后,如果应用程序的段描述符放在 GDT 中,那么就意味着应用程序需要有权限来访问 GDT,而 x86 系统中只有一个 GDT(所以叫做 Global Description Table...在 Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...,映射的都是操作系统的内存空间,按照 Linux 中的做法,3G ~ 4G 空间被操作系统使用。...看一下 Linux 2.6 内核代码中的结构体:struct task_struct{ ... },就知道 TCB 有多复杂了,有些书籍上也称之为 PCB(Process Control Block,进程控制块...当然,Linux 系统中的处理过程更为复杂,它把每一个任务按照优先级放在不同的等待队列中,然后利用哈系桶算法来查找任务。 ------ End ------

67750

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

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...Linux 在启动的过程中设置了段寄存器的值和全局描述符表GDT 的内容,段寄存器的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS 0x10 /...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 表中的下标。...放在数组变量gdt_table 中。...TSS 描述符存放在GDT 中,它是GDT 中的一个表项,由中断描述符表(IDT)中的任务门(存放TSS段的选择符)装入TR来进行索引。

91230

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

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...Linux 在启动的过程中设置了段寄存器的值和全局描述符表GDT 的内容,段寄存器的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS 0x10 /...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 表中的下标。...放在数组变量gdt_table 中。...TSS 描述符存放在GDT 中,它是GDT 中的一个表项,由中断描述符表(IDT)中的任务门(存放TSS段的选择符)装入TR来进行索引。

1.3K50

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

一丶段描述符 1.1 GDT与LDT 1.1.1 段描述符之GDT表 与 LDT表的概述 GDT表 查询inter手册可以得知. 当我们在保护模式下. 进行内存访问的时候 所有的内存访问....一个全局或者局部标志 决定了 段选择子 是指向GDT 还是 LDT. 想要访问GDT 或者LDT 要提供 段选择子以及偏移地址....以上就是对GDT表或者 LDT表的描述 总结来说 GDT或者LDT 就是一块内存. 也可以看成一个数组....根据长度可以确定一个GDT表示的内存有多大 2.GDT是一个数组.数组里面保存的是段描述符结构 请不要搞混概念 在这里我们就可以用驱动程序来读取 GDT了.并且我们进行打印输出即可. 3.1.3 LDTR...总结与实验 总结1 GDT的操作 1.1 获取GDT数组表.输出所有段描述符 遍历获取GDT表 只是获取GDT表的首地址.

1.9K21

进入Linux内核前的准备

最近看到这个github仓库flash-linux0.11-talk,觉得还算是蛮有意思的,加上网络编程的课程又有抄写一段tcp协议实现代码或者交一篇linux内核源码阅读的笔记,还是比较讨厌这种低效率的抄写的所以就想写篇文章记录一下粗浅阅读源码后的大概了解...进入linux内核前的准备 开机 如果问电脑是如何一步一步开始运行操作系统的,那么第一件事情当然是按下开机键啦。...那么对于linux0.11来看,这个512Byte大小的启动程序就是/boot目录下的bootsect.s这个文件。按下开机键后,它会被编译成二进制文件,并且被存放在硬盘中的0盘0道1扇区。...我们把gdt_48赋值给gdtr寄存器,gdt_48中存储的又恰好是gdt表的地址,那么我们就可以通过gdtr寄存器找到gdt了,现在让我们来看一下gdt标签的内容是啥。...eax movl %eax,%cr0 /* set paging (PG) bit */ ret /* this also flushes prefetch-queue */ 我们需要提一下,linux

5.5K20
领券