- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读 Intel 和 AMD 之间的文档并查看代码有时很难理解如何创建没有 IO 端口位图 (IOPB) 的正确任务状态段 (TSS)。使用 IOPB 创建 TSS 似乎也存在混淆,因为 IO 位图 (IOPB) 是否需要尾随 0xff
字节似乎不明确。
我知道 TSS 和 TSS 描述符(在 GDT 中)之间存在依赖关系。 TSS 描述符控制 TSS 的基地址和限制。描述符中的限制比结构的实际大小小一(本质上类似于 GDT 和 IDT 记录中指定的大小)。 TSS 限制用于确定 IOPB 大小。
我知道:
32-bit TSS structure can be visualized这样:
该链接还包含 16 位 TSS 和 64 位 TSS 结构的布局。
问题:
0xff
字节?xxxxx111
。如果最后一个字节假设为 0xff
,那不就是 11111111
吗?最佳答案
这是一个非常公平的问题。尽管乍一看带有或不带有 IO 端口位图 (IOPB) 的 TSS 本质上似乎相当微不足道,但它一直是激烈讨论的焦点;辩论;文件不正确;模棱两可的文件;以及来自 CPU 设计者的信息,这些信息有时会混淆水域。关于这个主题的很好的读物可以在 OS/2 Museum 中找到。 .尽管名称如此,但信息并不限于 OS/2。摘自那篇总结它的文章:
It is obviously not trivial to use the IOPB correctly. In addition, an incorrectly set up IOPB is unlikely to cause obvious problems, but may disallow access to desired ports or (much worse, security-wise) allow access to undesired ports.
TSS 和 IOPB 的肮脏历史,因为它与 386BSD、NetBSD、OpenBSD 中的安全漏洞和错误有关,值得一读,如果您希望避免引入错误,应该表明您提出的问题是合理的。
如果您不需要 IOPB,您可以简单地用整个 TSS 结构的长度填充 IOPB 偏移字段(不要减去 1)。您的 TSS 结构中不应有尾随 0xff
字节。 TSS 描述符中的 TSS 限制(如您所知)将比该值小 1。 Intel手册上说如果IOPB偏移值中的值大于TSS限制就没有IOPB。如果 IOPB 偏移字段中的值始终比限制大 1,则满足此条件。这就是现代 Microsoft Windows 处理它的方式。
如果使用 IOPB,请根据 Intel 文档在末尾设置一个附加字节到 0xff
。通过为所有 0xff
设置一个额外的字节,可以防止在最后 8 个端口开始或结束的任何多端口访问(INW/OUTW/INL/OUTL)。这将避免多端口读/写可能跨越 IOPB 的末端导致访问超出 IOPB 范围的端口的情况。它还会拒绝从最后 8 个端口之前的端口开始并进入后面 8 个端口的多端口访问。如果多端口访问的任何端口的权限位设置为 1,则拒绝整个端口访问(根据 Intel 文档)
不清楚 x
在图表的上下文中代表什么,但如果这些位设置为 0,它们将显示为允许的端口,这不是您想要的。同样,坚持使用 Intel 文档并将额外的尾随字节设置为 0xff
(所有位都设置为拒绝访问)。
来自Intel386 DX Microprocessor Data Sheet :
Each bit in the I/O Permission Bitmap corresponds to a single byte-wide I/O port, as illustrated in Figure 4-15a. If a bit is 0, I/O to the corresponding byte-wide port can occur without generating an exception. Otherwise the I/O instruction causes an exception 13 fault. Since every byte-wide I/O port must be protectable, all bits corresponding to a word-wide or dword-wide port must be 0 for the word-wide or dword-wide I/O to be permitted. If all the referenced bits are 0, the I/O will be allowed. If any referenced bits are 1, the attempted I/O will cause an exception 13 fault.
和
**IMPORTANT IMPLEMENTATION NOTE: Beyond the last byte of I/O mapping information in the I/O Permission Bitmap must be a byte containing all 1’s. The byte of all 1’s must be within the limit of the Intel386 DX TSS segment (see Figure 4-15a).
在 NASM 程序集中,您可以创建如下所示的结构:
tss_entry:
.back_link: dd 0
.esp0: dd 0 ; Kernel stack pointer used on ring transitions
.ss0: dd 0 ; Kernel stack segment used on ring transitions
.esp1: dd 0
.ss1: dd 0
.esp2: dd 0
.ss2: dd 0
.cr3: dd 0
.eip: dd 0
.eflags: dd 0
.eax: dd 0
.ecx: dd 0
.edx: dd 0
.ebx: dd 0
.esp: dd 0
.ebp: dd 0
.esi: dd 0
.edi: dd 0
.es: dd 0
.cs: dd 0
.ss: dd 0
.ds: dd 0
.fs: dd 0
.gs: dd 0
.ldt: dd 0
.trap: dw 0
.iomap_base:dw TSS_SIZE ; IOPB offset
;.cetssp: dd 0 ; Need this if CET is enabled
; Insert any kernel defined task instance data here
; ...
; If using VME (Virtual Mode extensions) there need to bean additional 32 bytes
; available immediately preceding iomap. If using VME uncomment next 2 lines
;.vmeintmap: ; If VME enabled uncomment this line and the next
;TIMES 32 db 0 ; 32*8 bits = 256 bits (one bit for each interrupt)
.iomap:
TIMES TSS_IO_BITMAP_SIZE db 0x0
; IO bitmap (IOPB) size 8192 (8*8192=65536) representing
; all ports. An IO bitmap size of 0 would fault all IO
; port access if IOPL < CPL (CPL=3 with v8086)
%if TSS_IO_BITMAP_SIZE > 0
.iomap_pad: db 0xff ; Padding byte that has to be filled with 0xff
; To deal with issues on some CPUs when using an IOPB
%endif
TSS_SIZE EQU $-tss_entry
特别说明:
__attribute__((packed))
或 MSVC 的 #pragma pack
)。查看您的编译器文档以获取更多详细信息。不听从这个建议可能会导致额外的字节被添加到您的 TSS 结构的末尾,如果您有 IOPB,这可能会导致问题。如果 IOPB 存在于 TSS 中并且添加了额外的填充字节,那么这些字节将成为 IO 位图的一部分,并且可能会授予/拒绝您不想要的权限。这是在 BSD 内核中产生错误的失败之一。LTR
加载到任务寄存器中,方式与在传统保护模式下完成的方式相同。指导。关于x86 - 使用和不使用 IO 位图创建适当的任务状态段 (TSS) 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54876039/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!