博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OS学习笔记】十三 保护模式一:全局描述符表(GDT)
阅读量:1997 次
发布时间:2019-04-28

本文共 1494 字,大约阅读时间需要 4 分钟。

上一篇文章,我们大致领略了现代处理器的结构和特点。点解链接查看上一篇文章:

本篇文章开始,学习保护模式下的的各种机制。什么是保护模式呢?

一般来说,操作系统负责整个计算机软硬件的的管理,它做任何事情都是可以的。但是用户程序就应当有所限制,用户程序它只能访问自己的数据自己的代码,即使是转移,也只允许在自己的各个代码段之间进行转移。

但是,在本篇文章之前,我们学习的各种机制下,用户代码对内存的访问是非常自由的,没有人管!它想访问哪里就访问哪里。如果一不小心,访问到了操作系统的代码段或者操作系统的数据段,并将其修改,那么就会发生无法预测的错误!

在多用户,多任务时代,内存中会存在很多的用户程序在运行。此时我们应该让他们彼此之间有一个间隔,让他们彼此不会因为不小心修改了彼此的代码或者数据而导致出错。那么如何实现?

其实就是我们即将要学习的保护模式的内容了。

1、全局描述符表(GDT)

在进入保护模式之前。首先来介绍一下,全局描述符表(Global Descriptor Table,GDT)。

在实模式下,处理器将内存分为逻辑上的段,在访问内存时,在指令中,使用段内偏移地址。这在之前的文章学习的很深刻了。

在保护模式下,就不太一样了。对内存的访问,依然使用段地址加偏移地址,但是,在每个段能够进行访问之前,必须先进行登记。

为什么进行登记呢?我们上面有一个疑问就是如何让各个用户程序彼此隔开,说白了就是让它们不要访问彼此的代码与数据以防造成混乱。 那么在这里,我们对各个用程序的段,进行登记,并记录各个段是属于哪个用户程序啊,各个段的大小以及属性啊之类的,对这些信息进行登记,当一个程序想要访问一个地址的时候,我们首先查看这个段是否是这个用户程序能够访问的,如果不能,就产生一个段错误之类的信息给用户,这样的话,看起来可以达到我们的目的:让各个用户程序隔离。

那么,和一个段有关的信息,需要8字节来描述,称为段描述符。每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟一段内存空间用于存放各个段的描述符。这些集中存放在一起的描述符构成了描述附表。

最主要的描述符表示全局描述符表(Global Descriptor Table,GDT),所谓全局,意味着该表是为整个软硬件系统服务的。对应的还有一个局部描述符表(LDT),这在后面会进行学习。

因为在进入保护模式之后,处理器立即需要按新的内存访问模式工作,所以必须在进入保护模式之前,就定义好GDT。但是由于在实模式下,只能访问1M以下的内存,所以如下图,在进入保护模式前,我们定义的GDT大致就是在下图中的位置:

在这里插入图片描述

上面的GDT放在1M以下指示为了兼容实模式。在进入保护模式后,可以修改全局描述符表的位置。

上述的GDTR是什么?

为了跟踪全局描述符表,处理器内部有一个48位的寄存器,称为全局描述符表寄存器(GDTR)。该寄存器分为两部分,分别是32位的线性地址和16位的边界。如下图所示:

在这里插入图片描述

  • GDTR的32位线性地址部分八寸的是全局描述符表在内存中的位置
  • GDTR的16位边界部分保存的是 全局描述符表的边界(界限),其在数值上等于表的大小(总字节数)减一。

因为GDT的界限值是16位的,所以该表最大是216字节,也就是65536字节(64KB)。又因为一个描述符占用8字节,故最多可以定义8192个描述符。

2、总结

循序渐进,本文只记录学习全局描述符表。理解GDT与GDTR。

笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。

学习探讨加个人:

qq:1126137994
微信:liu1126137994

转载地址:http://tbytf.baihongyu.com/

你可能感兴趣的文章
make: arm-linux-gcc: Command not found
查看>>
Ubuntu上nfs的安装配置
查看>>
u-boot-2009.08引导内核学习笔记
查看>>
内核启动参数简介
查看>>
LINUX CP命令详解
查看>>
nfs: server 192.168.0.3 not responding, still trying
查看>>
最全的Android源码目录结构详解
查看>>
Linux安装JDK详细步骤
查看>>
repo用法详解
查看>>
Linux / Unix Command: packet
查看>>
==把VIM打造成开发C的IDE==
查看>>
source insight快捷键及使用技巧
查看>>
映 射 ALT 键
查看>>
vim 插件echofunc.vim 翻页问题
查看>>
TCP中32位序号详解
查看>>
给github当前版本代码打tag标签
查看>>
org.apache.commons.fileupload.FileItemFactory
查看>>
centos ping不通百度 (ainusers亲测)
查看>>
应聘学习法开创者之一int和integer引发的惨案?(ainusers原创)
查看>>
应聘学习法开创者之二java中只有值传递是否是谣言?(ainusers原创)
查看>>