什么是子系统?

时间:2011-04-26 15:17:18

标签: terminology subsystem

我正在读一本书,上面写着这些子系统:

win32,os/2,posix,etc..

但我对这些符号没有任何感性知识,你能用简短的词语来解释吗?

3 个答案:

答案 0 :(得分:3)

我觉得“子系统”的概念有些不明确,或者至少在不同的情境中使用不同的含义。

根据MSDN documentation

  

环境子系统是模拟不同操作系统环境的Windows NT进程。 Windows NT执行程序提供了所有环境子系统可以调用以执行基本操作系统功能的通用服务。

Windows Internals book讨论了以下两个子系统:

    它说的
  • Windows子系统 - “这个[子系统]的特殊之处在于没有它就无法运行Windows。(它拥有键盘,鼠标和显示器,它必须存在甚至在没有交互式用户登录的服务器系统上。事实上,另外两个(哪两个)子系统配置为按需启动,而Windows子系统必须始终运行。“
  • 基于Unix的应用程序的子系统,也称为SUA [ POSIX ] 子系统

现在,/ SUBSYSTEM选项可以发送到 documentation中的Microsoft VS C ++链接器并且我引用

  

您可以指定以下任何子系统:

     

BOOT_APPLICATION   在Windows引导环境中运行的应用程序。有关引导应用程序的更多信息,请参阅关于BCD WMI提供程序。

     

CONSOLE   Windows字符模式应用程序。操作系统为控制台应用程序提供了一个控制台。

     

可扩展固件接口(EFI)映像   EFI子系统选项描述在可扩展固件接口环境中运行的可执行映像。此环境通常随硬件提供,并在加载操作系统之前执行。 EFI图像类型之间的主要区别在于图像加载到的内存位置以及图像调用返回时所采取的操作。控制返回时,将卸载EFI_APPLICATION图像。仅当控制返回错误代码时,才会卸载EFI_BOOT_SERVICE_DRIVER或EFI_RUNTIME_DRIVER。从ROM执行EFI_ROM映像。有关更多信息,请参阅Unified EFI论坛网站上的规范。

     

NATIVE   在没有子系统环境的情况下运行的代码 - 例如,内核模式设备驱动程序和本机系统进程。此选项通常保留用于Windows系统功能。

     

POSIX   在Windows中的POSIX子系统中运行的应用程序。

     

WINDOWS   在Windows图形环境中运行的应用程序。这包括桌面应用程序和Windows应用商店应用程序。

     

WINDOWSCE   WINDOWSCE子系统指示该应用程序旨在在具有Windows CE内核版本的设备上运行。内核的版本包括PocketPC,Windows Mobile,Windows Phone 7,Windows CE V1.0-6.0R3和Windows Embedded Compact 7。

所以你去吧。最后,人们有时会谈论“Win32”子系统,我不知道我是否应该在链接器选项意义上指代“windows”子系统或“控制台”子系统。

回到Windows Internals的书中,它进一步说“每个可执行映像(.exe)绑定到一个且只有一个子系统”,这将解释在链接时指定应用程序所用子系统的需要。

答案 1 :(得分:0)

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

更一般地说,Win32(32位Windows,即Windows NT 3.5或更高版本),OS / 2和POSIX系列都是操作系统。 (POSIX是类UNIX操作系统的标准API系列 - 有关详细信息,请参阅here。)

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

然而,以这种方式创建应用程序听起来就像十五,二十年前所做的那样。这也是人们过去常常提到这三个操作系统系列的时间......

答案 2 :(得分:0)

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

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

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

今天这已经过时了。我主要说微软包括一个新的" Linux子系统"在Windows 10周年更新(这是一个像Native,Win32或POSIX这样的子系统)中,它的行为与Linux相当,可以很容易地编译Linux应用程序在Windows上运行(或者更确切地说,是Linux子系统)。

/SUBSYSTEM链接器开关开始完全相同,但后来增加了更多选项(/SUBSYSTEM:CONSOLE也为Win32子系统编译,但如果没有,应用程序将分配一个控制台窗口从父进程继承一个,/SUBSYSTEM:EFI_APPLICATION将编译一个根本无法在Windows上运行的可执行文件,但将在Exensible Firmware Interface(EFI / UEFI)启动环境等中运行。)