<<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.3 分段机制

来源:互联网 发布:c语言 f是什么意思 编辑:程序博客网 时间:2024/05/04 00:01

4.3.1 段的定义

       段是虚拟地址到线性地址转换机制的基础。每个段由以下几个参数定义:

       (1)段基地址(Base Address):指定段在线性地址空间中的开始地址。

       (2)段限长(Limit):是虚拟地址空间中段内最大可用偏移位置。

       (3)段属性(Attributes):指定段的属性。


       为了把逻辑地址转换成一个线性地址,处理器会执行以下操作:

       (1)使用段选择符中的偏移值(段索引)在GDT或LDT表中定位相应的段描述符。

       (2)利用段描述符检验段的访问权限和范围,以确保该段是可用访问的并且偏移量位于段界限内。

       (3)把段描述符中取得的段基地址加到偏移量上,最后形成一个线性地址。

4.3.2 段描述符表

       段描述符表是段描述符的一个数组。描述符表的长度可变,最多可用包含8192个8字节描述符。有两种描述符表:全局描述符表GDT(Global Descriptor Table)和局部描述符表LDT(Local Descriptor Table)。

       当发生任务切换时,LDT会更换成新任务的LDT,但是GDT并不会改变。

       每个系统必须定义一个GDT,并可用于系统中所有程序或任务。另外,可选定义一个或多个LDT。

      GDT本身不是一个段,而是线性地址空间中的一个数据结构。GDT的基线性地址和长度值必须加载进GDTR寄存器中。

      LDT表存放在LDT类型的系统段中。此时GDT必须含有LDT的段描述符。如果系统支持多LDT的话,那么每个LDT都必须在GDT中有一个段描述符和段选择符。一个LDT的段描述符可以存放在GDT表的任何地方。

4.3.3 段选择符

       段选择符是段的一个16位标识符。段选择符并不直接指向段,而是指向段描述符表中定义段的段描述符。段选择符的3个字段分别是:请求特权级RPL(Requested Privilege Level)、表指示标志TI(Table Index)和索引值(Index)。

4.3.4 段描述符

       段描述符是GDT和LDT表中的一个数据结构项,用于向处理器提供有关一个段的位置和大小信息以及访问控制的状态信息。每个段描述符的长度是8字节,含有3个主要字段:段基地址、段限长和段属性。

4.3.5 代码和数据段描述符类型

4.3.6 系统描述符类型

       处理器能够处理以下一些类型的系统描述符:

       局部描述符表(LDT)的段描述符

       任务状态段(TSS)描述符

       调用门描述符

       中断门描述符

       陷阱门描述符

       任务门描述符


       这些描述符类型可分为两大类:系统段描述符和门描述符。系统段描述符指向段系统(如LDT和TSS段),门描述符就是一个“门”。对于调用、中断或陷阱门,其中含有代码段的选择符和段中程序入口点的指针;对于任务门,其中含有TSS的段选择符。

0 0
原创粉丝点击