我正在读一本书,书中说有这些子系统:
win32,os/2,posix,etc..
但是我对这些符号没有任何感性认识,你能用简短的语言解释一下吗?
发布于 2011-04-26 15:27:14
如果我们知道你指的是哪本书,可能会有所帮助!
更广泛地说,Win32 (32位视窗,即视窗NT3.5或更高版本)、OS/2和POSIX族都是操作系统。(POSIX是类UNIX操作系统中的标准API系列-有关更多信息,请参阅here。)
听起来,您所描述的程序可以在许多不同的操作系统上运行,并且具有特定于操作系统的组件--这些组件就是“子系统”。
然而,以这种方式创建应用程序听起来确实像是15年或20年前所做的事情。这也是人们过去经常提到这三个操作系统家族的时候……
发布于 2013-11-21 14:20:10
我感觉“子系统”的概念有些模糊,或者至少在不同的上下文中有不同的含义。
根据MSDN documentation的说法
环境子系统是模拟不同操作系统环境的Windows NT进程。Windows NT执行程序提供所有环境子系统都可以调用的通用服务,以执行基本的操作系统功能。
Windows Internals book介绍了以下两个子系统:
(它拥有键盘、鼠标和显示器,即使在没有交互用户登录的服务器系统上,它也需要存在。实际上,其他两个子系统(哪两个?)被配置为按需启动,而对于基于
现在,可以发送到微软VS C++链接器的documentation中的/SUBSYSTEM选项说,我引用
您可以指定以下任何一个子系统:
BOOT_APPLICATION在Windows引导环境中运行的应用程序。有关启动应用程序的详细信息,请参阅关于BCD WMI提供程序。
控制台Windows字符模式应用程序。操作系统为控制台应用程序提供了一个控制台。
可扩展固件接口( EFI )映像EFI子系统选项描述在可扩展固件接口环境中运行的可执行映像。此环境通常随硬件一起提供,并在加载操作系统之前执行。EFI图像类型之间的主要区别在于图像加载到的内存位置以及图像调用返回时所采取的操作。当控制返回时,将卸载EFI_APPLICATION图像。仅当control返回错误代码时,才卸载EFI_BOOT_SERVICE_DRIVER或EFI_RUNTIME_DRIVER。从只读存储器中执行EFI_ROM映像。有关详细信息,请参阅Unified EFI论坛网站上的规范。
在没有子系统环境的情况下运行的本机代码-例如,内核模式设备驱动程序和本机系统进程。此选项通常保留用于Windows系统功能。
POSIX在Windows的POSIX子系统中运行的应用程序。
WINDOWS在Windows图形环境中运行的应用程序。这包括桌面应用程序和Windows应用商店应用程序。
WINDOWSCE WINDOWSCE子系统指示应用程序打算在具有Windows CE内核版本的设备上运行。内核的版本包括PocketPC、Windows Mobile、Windows phone7、Windows CEV1.0-6.0R3和Windows Embedded 7。
这就对了。最后,人们有时会谈论"Win32“子系统,我不知道我应该把它理解为"windows”子系统还是链接器选项意义上的“控制台”子系统。
回到Windows Internals这本书中,它进一步指出“每个可执行镜像(.exe)都绑定到一个且只有一个子系统”,这将解释在链接时指定应用程序的子系统的必要性。
发布于 2016-12-31 15:08:50
从NT (NT 3.1)开始的Windows能够支持当时(1993)存在的不同操作系统(或OS系列)的语义。微软称它们为子系统(今天他们可能会称它们为仿真层)。
当链接到一个子系统时,它决定了你的语义是如何的。例如,对于Win32子系统,文件名不区分大小写(foo.txt
和fOo.Txt
指的是同一个文件),设备文件(如con
或nul
)存在于每个目录中。对于POSIX子系统,文件名区分大小写,并且设备文件只存在于一个位置。通过将现有(遗留)应用程序链接到不同于Win32
的子系统,这些应用程序“感觉”更像是各自的OSes和移植工作减少了。
如果你想知道EXE/DLL的子系统,你可以在DependencyWalker中打开它-如果它(直接或间接)依赖于KERNEL32.DLL,它就是Win32子系统,如果它(直接)依赖于NTDLL.DLL,它就是本机子系统(请注意,KERNEL32.DLL本身将依赖于NTDLL.DLL,为Win32子系统提供兼容层)。
这在今天基本上已经过时了。我说的主要是因为微软在Windows10周年纪念更新中包含了一个新的"Linux子系统“(这是一个像Native,Win32或POSIX的子系统),它的行为与Linux的二进制等效,使得编译Linux应用程序在Windows (或者更准确地说,它的Linux子系统)上运行变得很容易。
Windows开关一开始做的是完全相同的事情,但后来增加了更多的选项(/SUBSYSTEM:CONSOLE
也为Win32子系统编译,但如果应用程序没有从其父进程继承,它将分配一个控制台窗口,/SUBSYSTEM:EFI_APPLICATION
将编译一个根本不能在Windows上运行的可执行文件,但将在可扩展固件接口(EFI/UEFI)引导环境中运行,等等)。
https://stackoverflow.com/questions/5792498
复制相似问题