【发布时间】:2012-07-22 06:20:46
【问题描述】:
我正在使用 DOS Extender 为 FreeDOS 开发一个保护模式应用程序。我的应用程序执行密集的 I/O。
由于所有 DOS 扩展程序都在 Ring3(即 CPL=3)中运行他们的应用程序,而它们自己在 Ring 0(即 CPL=0)中运行,我想到了一些关于 I/O 保护的问题。
从 x86 文档中,我得到以下信息:
IOPL 敏感指令:IN、INS、OUT、OUTS、CLI 和 STI。
如果 CPL
如果 CPL > IOPL,并且指令是这些指令之一(IN、OUT、INS 或 OUTS),则处理器检查当前任务的 IO 权限位图(在其 TSS 中)以确定当前应用程序是否被允许访问寻址的 IO 端口。如果位图指示允许任务访问指示的 IO 端口,则不产生异常并执行 IO 指令。否则会产生 GP 异常。
如果 CPL > IOPL,并且指令是 CLI 或 STI,则处理器会生成 GP 异常。
这意味着如果我们的应用程序。在 Ring3 上运行,然后要执行 IN,OUT,INS,OUTS 指令,我们必须有 CPL IOPL(转换为 IOPL 任何 I/O端口。
但在后一种情况下,我们仍然不能使用 Ring3 应用程序中的 CLI 和 STI 指令,因为 CPL > IOPL。
所以,事实证明,只有当 CPL
现在我的问题是,所有 dos 扩展程序是否在它们启动的任务/应用程序的 TSS 中设置 IOPL = 3?
如果他们不这样做,那么他们必须在 Ring0 (CPL=0) 中运行任务/应用程序,否则应用程序无法执行 IOPL 敏感指令。
文档还声明:
程序或任务只能通过 POPF 和 IRET 指令改变其 IOPL; 然而,这样的改变是有特权的。 除非以特权级别 0 即 CPL=0 运行,否则任何程序都不能更改当前的 IOPL。较低特权的过程尝试更改 IOPL 不会导致异常; IOPL 保持不变。
这意味着:如果在 Ring 3 代码中遇到 POPF 或 IRET 指令,则 IOPL 字段将不会被修改/恢复,CPU 不会产生异常。
这没关系,因为我们不想修改 IOPL 字段,让它由 DOS Extender 处理。 但是这是否意味着其他标志(EFLAGS reg.的bit0到bit11)将被恢复?
我的应用程序。可能还需要执行POPF指令和IRET。
该文档还指出:
只有当 CPL
这意味着:如果在 Ring3 代码中遇到 POF 指令,则仅当 CPL
我正在寻找一个通用的答案——即不是 DOS Extender 特定的。这是因为,似乎虽然它们在实现上有所不同,但基本原则仍然是相同的 b/w DOS 扩展器——例如他们在 Ring3 中运行应用程序。
【问题讨论】:
-
@AlexeyFrunze- 我明白 :) 但除了this 问题,我没有得到我可以称之为答案的东西。但我并不否认这里发布的答案的有用性,因为它们给了我对问题的不同看法,或者有时激励我找到解决方案。其次,在我问了这些问题之后,没有多少时间过去了。如果我接受答案,那么更多的人将无法参与讨论 - 更多的参与也会对其他 SO 用户有益。 :)
-
@AlexeyFrunze - 我确实理解,因此我从昨天开始获得投票的特权,即开始投票。 :)