当前位置: 首页 > 汇编 > 正文

汇编学习(十七)X86汇编学习 (4) GDT

从今天起我们就进入保护模式的学习了,不过考试,课设也随之而来。所以基本规划下,接下来的学习计划吧。距离放暑假还有4周,首先是《X86实模式,保护模式这本书》,还有8章,基本上4~5天一章吧,期间还有《并行程序设计导论》《并行编程模式》着两本,都很薄。基本最多看这么多了。但是我们还有数电,算法,这些东西要复习。最后4周就这么办吧。

保护模式概念:

保护模式,是一种80286系列和之后的x86兼容CPU操作模式。保护模式有一些新的特色,设计用来增强多工和系统稳定度,像是 内存保护,分页 系统,以及硬件支援的 虚拟内存。大部分的现今 x86 操作系统 都在保护模式下运行,包含 Linux、FreeBSD、以及 微软 Windows 2.0 和之后版本。
另外一种286和其之后CPU的运行模式是实模式,一种向前兼容且关闭了保护模式这些特性的CPU运行模式。用来让新的芯片可以运行旧的软件。依照设计的规格,所有的x86 CPU都是在实模式下开机,来确保传统操作系统的向前兼容性。在任何保护模式的特性可用前,他们必须要由某些程序手动地切换到保护模式。在现今的计算机,这种切换通常是由操作系统在开机时候必须完成的第一件任务的一个。它也可能当CPU在保护模式下运行时,使用虚拟86模式来运行设计运行在实模式下的代码。

 

全局描述符表GDT:

段描述符:8个字节,64位刻画一个段的信息。为了保存这些描述符,需要集中存放描述符,这就是一个描述符表。

其中最主要的描述符表是全局描述符表(global descriptor table,GDT) ,这个表为全局服务,所以在进入保护模式之前,必须定义全局描述符表。

为了跟踪全局描述符表,处理器内部有一个48位的寄存器,称为全局描述符表寄存器。寄存器分为两个部分,分别是32位的线性地址,16位的边界,数值上等与表的大小。

所以这里最多有8192个描述符。

每个描述符在GDT中占8字节,如下:

141721125

这里段基地址和段界限是不连续的, 这都是从80286上继承来的,真是恶心的布局。

G:粒度,用于解释段界限的含义G==0?字节:4KB

S :是否系统段,S==0 ? 系统段:数据代码段

DPL: 特权级,0,1,2,3

P:段存在位

D/B:默认操作数大小D=0 16位  ,否则为32位

L: 64位代码标志,保留此位给64位寄存器使用

TYPE :共4位,用于指示描述符的自类型。

对于数据段:X,E,W,A

对于代码段:X C R A

X: 表示是否可以执行,数据段不可执行,代码段总是可以执行的

E:指示段的扩展方向,E=0 向上扩展,是普通数据段,E=1向下扩展是栈段

W: 0 表示不可写

C:表示特权级依从关系。= 0 表示非依从的关系,可以从同级别代码,或者门调用。= 1 表示可以从低特权级的程序转移到该段执行。

R: 指示代码段是否可以允许读出,代码段总是可以执行的。

A: 指示最近是否被访问的位

AVL :是可以使用的位,通常由操作系统来用,处理器并不使用它。

CR0: 32位寄存器,包含一系列用于控制处理器操作模式和运行状态的标志位.它的第一个位,PE位指示的是保护模式的允许位。

保护模式下的栈:

对于描述符中G位是0的段来说,粒度值是1字节,而对于G位是1的段来说,粒度值为4KB 。

 

本文固定链接: http://zmrlinux.com/2016/06/12/%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0%ef%bc%88%e5%8d%81%e4%b8%83%ef%bc%89x86%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0-4-gdt/ | Kernel & Me

该日志由 root 于2016年06月12日发表在 汇编 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 汇编学习(十七)X86汇编学习 (4) GDT | Kernel & Me