阅读 Intel 和 AMD 之间的文档并查看代码有时会让人很难理解如何创建没有 IO 端口位图 (IOPB) 的正确任务状态段 (TSS)。使用 IOPB 创建 TSS 似乎也存在混淆,因为 IO 位图 (IOPB) 是否需要尾随字节似乎不明确0xff。
我知道 TSS 和 TSS 描述符(在 GDT 中)之间存在依赖关系。TSS 描述符控制 TSS 的基地址以及限制。描述符中的限制比结构的实际大小小一(本质上类似于 GDT 和 IDT 记录中指定的大小)。TSS 限制用于确定 IOPB 大小。
我知道:
- TSS描述符限制比整个TSS结构的大小小1
- 16位TSS没有IOPB并且结构是固定大小的
- 基本的32位和64位TSS结构大小相似(数据含义不同)
- 32 位 TSS 可以通过向基本结构添加额外的 DWORD 来支持控制流强制。
- TSS 中的 IOPB 偏移量(字)指向相对于任务段开头的偏移量。
- IOPB 偏移量指向 IOPB 结构的开头,并且在启用虚拟模式增强 (VME)的情况下,IOPB 之前的 32 个字节是中断重定向表。
- 如果未启用 VME,内核可以在基本 TSS 结构的末尾和 IOPB 偏移之间放置额外的每个任务实例数据
- 如果启用了 VME,内核可以在基本 TSS 结构的末尾和 IOPB 以下 32 字节的偏移量之间放置额外的每个任务实例数据。
- 如果存在 IOPB,则每个 0 位表示端口访问权限,1 位表示拒绝权限。 …