## 7.7 任务寻址空间(Task Address Space)
TSS中的LDT选择子和PDBR字段给了软件系统设计者一个可伸缩性的段页式映射特性。通过为每一个任务一定的段页映射选择,任务可以共享地址空间,可以有不同与其它任务的很大的地址空间,或者以两种极端来共享。
每个任务有不同的地址空间的特性是80386的一个重要的保护特性。如果模块间没有共享地址空间的话,在一个任务中的模块不可以干涉另一个任务中的模块。80386的这种可伸缩性的内存管理机制允许系统设计者把要想协作的在不同任务中的模块设计成部分的地址空间共享。
### 7.7.1 任务线性——物理地址空间映射(Task Linear-to-Physical Space Mapping)
一般来说,安排任务的线性——物理地址空间的映射可以分为以下两类:
1、 一个线性——物理地址空间被所有任务共享。
当分页没有启用时,这是唯一的一种选择。没有启用分页的话,所有线性地址空间映射到相同的物理地址空是上。
当启用分页时,这种线性地址——物理地址的映射方式导致了所有任务使用一个页目录。如果操作系统支持页级虚拟内存的话,这种线性空间可能超过了物理地址空间。
2、 线性——物理地址空间部分重叠映射。
这种实现的话,要为每一个任务使用不同的一张页目录。因为PDBR(page directory base register)在每次任务切换时被加载,每个任务可以有不同的页目录。
在这样的技术里,不同任务的线性空间可能被映射到不同的物理地址空间上。如果页目录表项指向不同的页表,页表项又指向不同的物理页面的话,任务就不共享任何物理地址空间。
在实际中,所有任务的线性空间中的一部分必须要映射到相同的物理地址空间上去。任务状态段必须要位于一个公共的空间上,以便在处理器做任务切换,更新和读取TSS信息的时地址映射都相同。被GDT映射的线性空间也应该被映射到公共的物理地址空间上。否则,GDT的目的未做定义。图7-6显示了以共享页表的形式如何将线性地址空间的两个任务映射到相同的物理地址空间上。
### 7.7.2 任务逻辑地址空间(Task Logical Address Space)
如果只是通过线性——物理地址空间的映射将不能达到任务间数据的共享。为了共享数据,任务必须还要有一个公共的逻辑——线性地址空间的映射。也就是说,他们必须要有访问指向共享线性地址空间的描述符的权限。有3种办法可以建立公共的逻辑地址——物理地址空间的映射:
1、 通过GDT。所有任务都可以通过GDT访问描述符。如果这些描述符指向了一个映射到公共物理空间的线性地址空间的话,所有任务都共享了数据和指令。
2、 通过LDT。如果两个任务的TSS中的LDT选择子部分指向了相同的LDT。这些LDT又包含了一些指向相同物理空间的线性空间的描述符。这种共享的方法比在GDT中共享要更有选择性一点,这种共享可以只局限在几个任务中。其它一些有着不同LDT的任务不可以访问这些公共区域。
3、 通过在LDT中使用别名(aliases)技术。不同的LDT可以包含一些指向相同线性空间的描述符。如果这些线性空间被映射到相同的物理地址空间上去的话,这些描述符就允许任务间共享公共的地址空间。这些描述符被称作“别名”。这种共享机制比前两种更好。在LDT中的其它的描述符也以指向不同的线性空间中。
![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif)
- 第一章 80386介绍
- 1.1 该手册的组织结构
- 1.2 其他文献
- 第二章 编程基本模型
- 2.1 存储器组织和段
- 2.2 数据类型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作数选择
- 2.6 中断和异常
- 第4章 系统寄存器
- 4.1 系统寄存器 (System Registers)
- 4.2 系统指令 (System Instructions)
- 第五章 内存管理
- 5.1 分段地址转换(Segment Translation)
- 5.2 分页地址转换(Page Translation)
- 5.3 混合分段和分页地址转换(Combining Segment and Page Translation)
- 第六章 内存管理
- 6.1 为什么要保护(Why Protection?)
- 6.2 80386保护机制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段级保护(Segment-Level Protection)
- 6.4 页级保护(Page-Level Protection)
- 6.5 混合分页和分段保护(Combining Page and Segment Protection)
- 第7章 多任务(Multitasking)
- 8.1 I/O 寻址(I/O Addressing)
- 7.1 任务状态段(Task State Segment)
- 7.3 任务寄存器(Task Register)
- 7.4 任务门描述符(Task Gate Descriptor)
- 7.5 任务切换(Task Switching)
- 7.6 任务链(Task Linking)
- 7.7 任务寻址空间(Task Address Space)
- 第8章 输入 输出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保护和I/O(Protection and I/O)
- 第9章 异常和中断(Exceptions and Interrupts)
- 9.1 识别中断(Identifying Interrupts)
- 9.2 允许和禁止中断(Enabling and Disabling Interrupts)
- 9.3 同时发生的中断和异常的优先级(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中断描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中断任务和中断子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出错码(Error Code)
- 9.8 异常条件(Exception Conditions)
- 9.9 异常总结(Exception Summary)
- 9.10 出错码总结(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 复位后处理器状态(Processor State After Reset)
- 10.2 实模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切换到保护模式(Switching to Protected Mode)
- 10.4 保护模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB测试
- 第十四章 80386实地址模式
- 14.1 物理地址构成
- 14.2 寄存器和指令
- 14.3 中断和异常处理
- 14.4 进入和离开实地址模式
- 14.6 实地址模式异常
- 14.7 与8086的不同
- 14.8 与80286实地址模式的不同