自己动手写操作系统——厚积薄发,要烂熟于心的各种描述符

高楼万丈平地起,不懂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这段,我初步理解可以用这个把栈限制在高端空间,防止越界,不知道是不是理解正确,还请哪位懂的大神指导一下鄙人

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值