我正在使用DOS Extender开发FreeDOS的保护模式应用程序。我的应用程序执行大量的I / O。

由于所有DOS Extender都在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中),以确定是否允许当前应用程序访问IPL。寻址的IO端口。如果该位图指示允许该任务访问指定的IO端口,则不生成异常,并执行IO指令。否则,将生成GP异常。

如果CPL> IOPL,并且指令是CLI或STI,则处理器将生成GP异常。

这意味着如果我们的应用程序。在Ring3上运行,然后执行IN,OUT,INS,OUTS指令,我们必须具有CPL IOPL(这意味着IOPL
但是在后一种情况下,由于CPL> IOPL,我们仍然无法使用Ring3应用程序中的CLI和STI指令。

因此,事实证明,只有在CPL IN,INS,OUT,OUTS,CLI和STI。
在我们的情况下,这等于3
现在我的问题是,所有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法规的bit0至bit11)将被还原?

我的应用可能还需要执行POPF指令和IRET。

该文档还指出:

仅当CPL
这意味着:如果在Ring3代码中遇到POF指令,则仅当CPL
我正在寻找一个通用的答案-即不是特定于DOS Extender。这是becoz,似乎虽然实现方式不同,但是基本原理仍然是相同的b / w DOS扩展程序,例如他们在Ring3中运行一个应用程序。

最佳答案

我不明白为什么DOS扩展程序会要求在Ring 3中运行您的应用程序代码。我认为DPMI规范要求这样做,但是如果您的应用程序是唯一正在运行的应用程序,则不必真正遵循它。 This forum post提到了一些据说在环0中运行的扩展程序:


所有已知的Ring0主机(DOS32 / A,WDOSX,CWSDPR0)都不会交换-这
只是巧合,还是存在阻止Ring0的根本性“问题”
主机从交换?


CWSDPMI页上:


CWSDPR0.EXE是一个备用版本,在虚拟内存被禁用的情况下在环0上运行。如果需要访问ring-0功能,则可以使用它。


DOS/32 page



保护模式的应用程序以CPL 0运行



如果这些都不起作用,那么还有其他选择:


进行自己的保护模式设置-并不困难
使用现有的DOS扩展器并对其进行修改以使其在Ring 0中运行。HX-DOS源以及a couple of others均可用。

10-07 19:30