一张全景图——保护模式下的“任务”(Task)

来源:互联网 发布:营销网络 编辑:程序博客网 时间:2024/06/11 20:32

     

        (上图其实有纰漏,IDRT与GDTR直接含有地址信息,但是TR和LDTR却只包含选择子信息,而选择子指向了GDT条目,GDT条目最终指明TSS和LDT的位置。TR和LDTR通过选择子间接指向TSS和LDT,并非如上图所示的那样直接指向TSS和LDT)

        最近读了《x86汇编语言——从实模式到保护模式》一书的第二部分:保护模式。了解了关于保护模式的皮毛知识。画了一张图,帮助理解所谓“任务”。下图展示了一个运行中的任务,包括LDTR、TR、GDTR等寄存器,IDT、TSS、GDT、目录表、页表等数据结构,线性地址和物理地址之间的映射,以及这些寄存器和数据结构之间的关系。

      草草一张图,顿感保护模式之复杂,又叹保护模式之简单。
      复杂就复杂在各种数据结构交织叠加,配合紧密,绝非这么一张图就能展示的明白。如果将这张图稍加细化,画出所有数据结构的细节与相互关系,那这张图估计会密密麻麻,没法看了。
      简单却简单在思路。保护模式似乎尊崇以下几个思路:
      1. 先注册,再使用。这就是之所以存在那么多descriptor的理由。要想使用某段内存,无论那段内存里是代码也好,数据也好,先用一个descriptor描述之,然后才能使用。8个子节的描述符作为中间人告诉CPU那段内存在哪儿,有哪些性质。而正是这些性质才让CPU得以实现繁杂的保护工作,譬如界限保护和特权级检查。在这个思路下,诞生了GDT、IDT、LDT、选择子(selector)等诸多数据结构。
      2. 任务隔离。虽然描述符、分页机制等都为任务隔离带来的帮助,但是我认为,其中和任务隔离最直接相关的设计是TSS。TSS是一个任务存在的标志,它保护了务的上下文,完整传达了一个任务的所有关键信息。
      3. 分页机制。虽然分页机制的初始目标是提高内存利用率,但是一个附带效果(一个惊人的、amazing的效果)却是隔离了不同任务的线性地址空间。一套目录和页表就意味着一种线性地址到物理地址的映射,而不同任务拥有不同的目录和页表,意味着它们使用着不同的线性地址-物理地址映射,进而产生如下事实:它们的线性地址空间是隔离的。同一个线性地址,譬如0x1111 1111,之于任务A和任务B可以拥有不同的含义——0x1111 1111被不同的目录和页表映射到不同的物理地址。当然,如果希望,也可以让0x1111 1111映射到同一个物理地址。因此,通过精心设置目录和页表,不同任务的线性地址空间可以被方便的隔离和“融合”。下图展示了《x86汇编语言——从实模式到保护模式》一书中的做法。线性地址空间的前2GB(0x0000 0000 - 0x7fff ffff)是相互隔离的——指向不同的物理地址,而后2GB(0x8000 0000 - 0xffff ffff)是“融合”的——指向共同的物理地址。
      沿着这三个思路,最终衍生出了精巧的保护模式。
0 0
原创粉丝点击