文章随机晒最新文章关照最多的

jiayi Rss

80386段转换 Segment Translation

| Posted in Assembly |

27

80386的段寄存器是16位的,存储的地址为逻辑地址。不过,这只是段寄存器的可见部分(visible portion)…没错,正如我们所想的,段寄存器还有不可见部分(invisible portion)。其中的可见部分其实是个16位的 Selector,可以被程序操纵。而不可见部分只能被处理器操作,处理器自动地从段描述符(segment descriptor)中取出 基地址、段大小容限、描述符类型 等一系列信息,并将其载入寄存器的不可见部分。所以给我们造成了段寄存器只有16位的假象。具体结构看下图

再说说上面提到的 Selector
Selector 是存入 段寄存器 的16位信息,它只是逻辑地址,并不是一些人想象的物理地址。这个 Slector 向CPU提供三种信息
        Index:描述符表单的8192个描述符中选出一个
        Table Indicator: 置0时表示从 全局描述符表单(GDT)中索引,置1时表示从局部描述符表单(LDT)中索引
        Requested Privilege Level: 用于保护机制

描述符(Descriptor)也说一下
描述符向CPU提供从逻辑地址 映射到 线性地址所需的数据,不能由程序创建,而要靠 编译器、链接器、装入器甚至是操作系统来创建。其中包含如下信息:
        BASE: 段在4GB线性地址中的位置
        LIMIT: 段地址的大小,由如下规则决定
                1. 当以 1byte 为单元时,段大小的容限为 1MB
                2. 当以 4kbyte 为单元是,段大小的容限为 4GB
        Granularity bit: 间隔尺寸位,指定控制 LIMIT 的"单元"。置 0 时,单元大小为 1byte;置 1 时,单元大小为 4 kbyte
        TYPE: 用于区分不同的描述符
        DPL: 描述符特权级别,用于保护模式
        Segment-Present bit: 置 0 时,描述符在地址变换中不可用;置 1 时可用。基于段的虚拟内存管理的操作系统在下面情况下将该位置 0
                1. 被段构架的线性地址不是通过换页机制映射的时候
                2. 该段不在内存里
        Accessed bit: 置 1 表示该段被访问过。换而言之,一个 selector 被载入到 段寄存器,或者被一个 selector 测试指令访问过,该位置 1

知道了描述符(Descriptor),理解描述符表(Descriptor Table)就简单了~
一个段描述符被存储在 全局描述符表(global descriptor table – GDT) 或者 本地描述符表(local descriptor table – LDT) 中。一个 描述符表 是一段内存阵列,以 8 byte 为单位,每 8 byte 存一个描述符表项。描述符表的大小是可变的,但不能超过 8192 (2^(13)) 个描述符。CPU 通过 GDTR LDTR 寄存器,将描述符表放进内存。这些寄存器存储着描述符表在线性地址空间的基地址,还有段的大小限制。操作 描述符表寄存器 的指令为 LGDT  SGDT 和 LLDT  SLDT

看完上面的内容,逻辑地址映射到线性地址的段转换就能理解啦,如下图

Comments (27)

考试刚刚考过,微机原理。

jiayi Reply:

@猫猫的园地,
我们微原里没有些东东。。。

Write a comment

You must be logged in to post a comment.