操作系统如何决定运行 .exe 文件

4
假设我在Windows上启动一个.exe文件。这个文件可以用C++编写,或者用Java或C#编写并编译为.exe文件。
对于C++,操作系统可以直接执行命令。但是Windows如何知道它必须启动Java或C#的运行时(JVM或CLR)?此外,如何决定启动哪个运行时?
2个回答

4
对于CLR,您要查找的信息在可执行文件的PE头中。 Wikipedia 和 Microsoft 规格说明 中有关CLR的部分。
在节列表中有一个用于CLR的部分。

在.NET可执行文件中,PE代码部分包含一个存根,该存根调用CLR虚拟机启动入口,即mscoree.dll中的_CorExeMain或_CorDllMain,就像Visual Basic可执行文件那样。然后,虚拟机使用存在的.NET元数据,其中根元素是IMAGE_COR20_HEADER(也称为“CLR标头”),由PE头数据目录中的IMAGE_DIRECTORY_ENTRY_COMHEADER [6]条目指向。 IMAGE_COR20_HEADER非常类似于PE的可选头,从本质上讲为CLR加载程序扮演其角色。 2

与CLR相关的数据,包括根结构本身,通常包含在公共代码部分.text中。它由几个目录组成:元数据,嵌入式资源,强名称和一些用于本机代码互操作性的目录。元数据目录是列出程序集中所有不同.NET实体的一组表,包括类型,方法,字段,常量,事件以及它们之间和对其他程序集的引用。

来自Microsoft的信息:

.cormeta部分(仅对象) CLR元数据存储在此部分中。它用于指示对象文件包含托管代码。元数据的格式未记录,但可以将其交给CLR接口以处理元数据。

对于Java,有一个加载器会加载嵌入到可执行文件中的JAR文件(类似于DOS加载器或EXE打包程序的旧时代)。可以将后一种技术应用于任何东西,例如将作为资源嵌入在.EXE内部的.bat文件,由某个加载器加载并执行。这不需要Windows加载程序的任何帮助。

3
一般来说,Windows仅识别PE格式。当PE可执行文件启动时,它的职责是引导整个系统。
为了证明这一点,在Unix/Linux世界中有一个名为crt0的开源程序,您可以查看crt0的工作原理。
顺便提一下,在rt0之外,还有rt1、rti、rtn,它们在引导或终止的不同阶段运行。

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