高楼万丈平地起,不懂GDT表就别搞计算机操作系统,这是基础的基础,关键的关键,所有的都从他开始,熟记熟背,是重点。
;8-11位 TYPE位TYPE 字段共 4 位,用于指示描述符的子类型,或者说是类别。如表 11-1 所示,对于数据段来
;说, 这 4 位分别是 X、 E、 W、 A 位;而对于代码段来说,这 4 位则分别是 X、 C、 R、 A 位。
;表 11-1 代码段和数据段描述符的 TYPE 字段
;X E W A 描述符类别 含 义
;0 0 0 x 数据 只读 0
;0 0 1 x 数据 读、写 2
;0 1 0 x 数据 只读,向下扩展 4
;0 1 1 x 数据 读、写,向下扩展 6
;8位,数据段和代码段的 A 位是已访问(Accessed)位,用于指示它所指向的段最近是否被访问过。在描述符创建的时候,应该清零。之后,每当该段被访问时,处理器自动将该位置“ 1”。
;--------------------------------------------------------------
;X C R A 描述符类别 含 义
;1 0 0 x 代码 只执行
;1 0 1 x 代码 执行、读
;1 1 0 x 代码 只执行,依从的代码段
;1 1 1 x 代码 执行、读,依从的代码段
;--------------------------------------------------------------
;8-11位TYPE
;8位,数据段和代码段的 A 位是已访问(Accessed)位,用于指示它所指向的段最近是否被访问过。在描述符创建的时候,应该清零。之后,每当该段被访问时,处理器自动将该位置“ 1”。
;9位,数据段W,表示是否可写;代码段R是否可读
;10位,数据段E表示扩展方向,E=1向下扩展,通常定义栈,E=0向上,普通数据段;代码段C 位指示段是否为特权级依从的( Conforming)。 C=0 表示非依从的代码段,这样的代码段可以从与它特权级相同的代码段调用,或者通过门调用;C=1 表示允许从低特权级的程序转移到该段执行。
;11位,X 表示是否可以执行( eXecutable)。数据段总是不可执行的, X= 0;代码段总是可以执行的,因此, X= 1。
;12位的S 位用于指定描述符的类型(Descriptor Type)。当该位是“0”时,表示是一个系统段;为“1”时,表示是一个代码段或者数据段(堆栈段也是特殊的数据段)。
;13-14位的DPL 表示描述符的特权级(Descriptor Privilege Level, DPL)。这两位用于指定段的特权级。共有 4 种处理器支持的特权级别,分别是 0、 1、 2、 3,其中 0 是最高特权级别, 3 是最低特权级别。
;15位的P 是段存在位(Segment Present)。 P 位用于指示描述符所对应的段是否存在。一般来说,描述符所指示的段都位于内存中。
;20位AVL 是软件可以使用的位( Available),通常由操作系统来用,处理器并不使用它。
;21位L位是 64 位代码段标志(64-bit Code Segment),保留此位给 64 位处理器使用。目前,我们将此位置“0”即可。
;22位D/B 位是“默认的操作数大小”(Default Operation Size)或者“默认的堆栈指针大小”(DefaultStack Pointer Size),又或者“上部边界”(Upper Bound)标志。
;设立该标志位,主要是为了能够在 32 位处理器上兼容运行 16 位保护模式的程序。尽管这种程序现在已经非常罕见了,但它毕竟存在过,兼容,这是 Intel 公司能够兴旺发达的重要因素。
;该标志位对不同的段有不同的效果。对于代码段,此位称做“D”位,用于指示指令中默认的偏移地址和操作数尺寸。 D=0 表示指令中的偏移地址或者操作数是 16 位的; D=1,指示 32 位的偏移地址或者操作数。
;举个例子来说, 如果代码段描述符的 D 位是 0,那么,当处理器在这个段上执行时,将使用 16位的指令指针寄存器 IP 来取指令,否则使用 32 位的 EIP。
;23位G位是粒度( Granularity)位,用于解释段界限的含义。当 G 位是“0”时,段界限以字节为单位。此时,段的扩展范围是从 1 字节到 1 兆字节( 1B~1MB),因为描述符中的界限值是 20 位的。
;相反,如果该位是“1”,那么,段界限是以 4KB 为单位的。这样,段的扩展范围是从 4KB到 4GB。
这里有个坑,向下扩展,向上扩展问题,折腾我好久,突然有一天顿悟了,难怪圣人都需要闭关,然后顿悟,我这个算是小的顿悟,而且还不知道正不正确。我的正常理解向下扩展是不是用于栈,这样压栈操作就好由高地址向低地址扩展,结果不对,他是用于计算段界限的,具体没实践过,就类似于0——4G正常扩展是从0开始的到设置的段界限比如1G,而向下扩展是从段界限1G位置到4G这段,我初步理解可以用这个把栈限制在高端空间,防止越界,不知道是不是理解正确,还请哪位懂的大神指导一下鄙人