什么是子系统?

6

我正在阅读一本书,它提到了这些子系统:

win32,os/2,posix,etc..

但我对这些符号没有任何感性认识,您能用简单的话解释一下吗?

1
只是需要注意的是,POSIX是一个标准。 - Bakudan
@Bakudan,但是这本书说win32是Windows中最重要的子系统,在哪个操作系统中,posix是事实上的标准? - compile-fan
3个回答

6

从NT(NT 3.1)开始,Windows能够支持当时存在的不同操作系统(或OS家族)的语义(1993年)。微软称它们为子系统(今天他们可能会称之为仿真层)。

当链接到一个子系统时,它决定了你的语义。例如,对于Win32子系统,文件名不区分大小写(foo.txtfOo.Txt指的是同一个文件),设备文件(如connul)存在于每个目录中。对于POSIX子系统,文件名区分大小写,设备文件仅存在于一个位置。通过将现有(遗留)应用程序与不同于Win32的子系统链接起来,这些应用程序会“感觉”更像相应的操作系统,并且移植工作会减少。

如果要知道EXE / DLL的子系统,可以在DependencyWalker中打开它-如果它(直接或间接)依赖于KERNEL32.DLL,则为Win32子系统;如果它(直接)依赖于NTDLL.DLL,则为本地子系统(请注意,KERNEL32.DLL本身将依赖于NTDLL.DLL,为Win32子系统提供兼容性层)。

这在今天大多数情况下已经过时了。我说“大多数”是因为微软在Windows 10周年更新中包括了一个新的“Linux子系统”(类似于本机、Win32或POSIX的子系统),它的行为与Linux的二进制等效,使得编译Linux应用程序以在Windows上运行变得容易(更确切地说,是在其Linux子系统上)。
/linker开关/Subsystem最初就是要做同样的事情,但后来增加了更多选项(/Subsystem:CONSOLE也会为Win32子系统编译,但如果应用程序没有从其父进程继承控制台窗口,则会分配一个控制台窗口;/Subsystem:EFI_APPLICATION将编译一个无法在Windows上运行但可以在可扩展固件接口(EFI / UEFI)引导环境中运行的可执行文件等)。

4
我有一种感觉,“子系统”的概念在某种程度上是不太明确的,或者至少在不同的上下文中使用不同的含义。
根据MSDN文档
环境子系统是Windows NT进程,它们模拟不同的操作系统环境。 Windows NT执行程序提供通用服务,所有环境子系统都可以调用这些服务来执行基本的操作系统功能。
《Windows Internals》书籍讨论了以下两个子系统:
- Windows子系统,它说:“这个[子系统]是特殊的,因为Windows不能在没有它的情况下运行。(它拥有键盘、鼠标和显示器,并且即使在没有交互用户登录的服务器系统上也必须存在。实际上,其他两个(哪两个?)子系统配置为按需启动,而Windows子系统必须始终运行。” - 面向Unix应用程序的子系统,也称为SUA [POSIX]子系统
现在,在其文档中,可以将/SUBSYSTEM选项发送到Microsoft VS C++链接器中,它说:“我引用”
您可以指定以下任何一个子系统:
BOOT_APPLICATION 在Windows Boot环境中运行的应用程序。有关引导应用程序的更多信息,请参见BCD WMI提供程序。
CONSOLE Windows字符模式应用程序。操作系统为控制台应用程序提供控制台。
可扩展固件接口(EFI)映像 EFI子系统选项描述在可扩展固件接口环境中运行的可执行映像。这个环境通常是由硬件提供的,并且在操作系统加载之前执行。EFI映像类型之间的主要区别是加载图像的内存位置以及当调用返回到图像时所采取的操作。当控制返回时,会卸载EFI_APPLICATION映像。只有在控制返回错误代码时,才会卸载EFI_BOOT_SERVICE_DRIVER或EFI_RUNTIME_DRIVER。EFI_ROM映像从ROM中执行。有关更多信息,请参见Unified EFI Forum网站上的规格说明。
NATIVE 不需要子系统环境即可运行的代码,例如内核模式设备驱动程序和本机系统进程。此选项通常保留给Windows系统功能。
POSIX 在Windows的POSIX子系统中运行的应用程序。
WINDOWS 在Windows图形环境中运行的应用程序。这包括桌面应用程序和Windows Store应用程序。
WINDOWSCE WINDOWSCE子系统表示该应用程序旨在运行在具有Windows CE内核版本的设备上。内核的版本包括PocketPC、Windows Mobile、Windows Phone 7、Windows CE V1.0-6.0R3和Windows Embedded Compact 7。
所以这就是答案。最后,有时人们会谈论“Win32”子系统,我不知道是否应该将其视为链接器选项意义上的“windows”子系统或“console”子系统。
回到《Windows Internals》书中,它进一步说:“每个可执行映像(.exe)只绑定到一个子系统”,这解释了在链接时需要指定您的应用程序所需的子系统的原因。

0

如果我们知道你指的是哪本书,可能会更有帮助!

更一般地说,Win32(即32位Windows,例如Windows NT 3.5或更高版本)、OS/2和POSIX家族都是操作系统。 (POSIX是UNIX类操作系统的标准API系列-请参见此处了解更多信息。)

听起来你描述的是一个可以在许多不同操作系统上运行并具有特定于操作系统的组件的程序-这些将是“子系统”。

然而,以这种方式创建应用程序似乎像是十五或二十年前做的事情。那时人们也会提到这三个操作系统家族...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接