X86 是否可以在支持英特尔IA-32e模式的操作系统中运行16位代码?

X86 是否可以在支持英特尔IA-32e模式的操作系统中运行16位代码?,x86,kernel,x86-64,cpu,X86,Kernel,X86 64,Cpu,在《英特尔64&IA-32体系结构手册》第3A卷第9章“处理器管理和初始化”中,我发现了以下内容: 在代码段的基础上选择兼容性模式执行。此模式允许遗留应用程序与以64位模式运行的64位应用程序共存。在IA-32e模式下运行的操作系统可以通过将其代码段描述符的CS.L位清除为0来执行现有的16位和32位应用程序 这是否意味着在IA-32e模式下运行的操作系统上,传统的16位和32位应用程序可以与64位应用程序共存 但据我所知,64位操作系统通常不支持传统的16位代码。如果支持,如何启动16位应用程

在《英特尔64&IA-32体系结构手册》第3A卷第9章“处理器管理和初始化”中,我发现了以下内容:

在代码段的基础上选择兼容性模式执行。此模式允许遗留应用程序与以64位模式运行的64位应用程序共存。在IA-32e模式下运行的操作系统可以通过将其代码段描述符的CS.L位清除为0来执行现有的16位和32位应用程序

这是否意味着在IA-32e模式下运行的操作系统上,传统的16位和32位应用程序可以与64位应用程序共存


但据我所知,64位操作系统通常不支持传统的16位代码。如果支持,如何启动16位应用程序?

32位应用程序受64位architectire支持,因此它们可以共存,对于16位应用程序,您需要一些工具来模拟addresing space shuch,因为windows上的dosbox无法在64位windows下运行,因为virtual-8086模式在长模式下不可用

不过,16位保护模式仍然可用,因此从技术上讲,可以运行16位Windows 3.x应用程序。就是这样。遗憾的是,64位Windows没有相同的功能,尽管原因是不是,因为64位模式无法运行16位指令,但重要部分已增加

主要原因是在64位Windows上,句柄有32个有效位。因此,句柄不能在不丢失数据的情况下被截断并传递给16位应用程序

因此,如果你想在64位Windows上运行16位应用程序,你必须使用虚拟机

有关更多详细信息,请阅读


另请参见64位内核下的,16位保护模式用户空间可用,但virtual-8086模式不可用。

大多数16位软件是为DOS编写的,并期望在实际模式下运行。vm86(virtual-8086)模式基本上是针对real模式的硬件虚拟化,允许来宾使用
cli
/
sti
,而不影响EFLAGS中的real IF位

在16位保护模式下,
cli
仅在IO权限级别为0(如环0)时才起作用,并且它将禁用实际CPU内核上的中断,而不仅仅是在16位模拟环境中因此,在现代操作系统下运行16位DOS程序是没有用的。

所以,是的,您可以在64位内核下运行16位用户空间代码,但只能在16位保护模式下运行,这是从来没有人使用过的(AFAIK)。我认为Linux本机不支持16位进程,尽管您可以使用
modify\u ldt
系统调用和
jmp far
创建一个定制的16位代码段


可以构建一个软件虚拟化系统,该系统使用16位保护模式运行16位DOS客户机,当客户机运行诸如
cli
之类的指令时,会捕获内核/虚拟机监控程序@Lưu Vĩnh Phúc的回答是MS没有尝试这样做的原因之一

不过,x86的软件虚拟化并非微不足道,因为您需要模拟的某些指令(如
pushf
)实际上并没有陷阱。来宾可能会注意到(或因为)pushf结果中的中断启用标志(IF)与刚刚运行的
cli
不匹配


即使是速度最慢的x86-64 CPU也足够快,可以运行DOSBOX这样的软件,该软件完全模拟x86 PC和可直接访问的旧硬件,因此对于能够以本机方式运行16位代码的需求不大,或者对于以看起来“本机”的方式运行它的需求也不多,也就是说,能够在主操作系统下启动其他程序,而不仅仅是在模拟环境中

显然,要在64位内核下运行vm86,可能需要暂时将内核切换到保护模式?或者只是运行软件仿真


64位内核可以切换回传统模式,从而可以使用vm86模式

现实生活中的一些内核确实以32位模式运行部分/大部分内核,可能只有在需要运行64位用户空间时才切换到长模式,或者在无法映射到有限的32位虚拟地址空间时才切换到读/写RAM


我想我已经读到MacOS这样做了,也许是为了支持32位二进制内核驱动程序。

传统保护模式16位程序。极为罕见的是,操作系统并不麻烦。虚拟8086模式不受支持,所以DOS程序需要一个模拟器。相关:,Linux相关:你知道,这个问题困扰了我很长时间。现在我终于有了一个像样的答案。我认为linux amd64版本上的Wine也有类似的问题?@64位linux上的Olorin Wine可以毫无问题地运行16位Windows应用程序,因为从技术上讲,它不会遇到32位句柄问题,除非您有支持虚拟模式扩展(VME)的处理器并且操作系统启用CR4中的VME位。处理器级别不支持虚拟中断标志。VME是486 SL处理器和奔腾的新产品。第一代Ryzen处理器支持VME,但一个严重的错误会削弱它的使用,您必须退回到非VME v8086。如果您在IOPL=3的v8086模式下运行,则CLI和STI指令将修改真实if标志,而不会捕获。这样的代码是有问题的,因为ring 3程序可以使用CLI禁用中断,并处于无法中断的无限循环中。当IOPL=0时,CLI和STI将陷阱,您必须模拟中断标志(创建虚拟标志),但这可能会导致与直接检查IF标志的实模式代码不兼容。VME是为了克服v8086模式中的许多缺点而设计的,它在EFLAGS.As中引入了一个硬件虚拟中断标志