我读到 Windows 和 Linux 的二进制文件是相同的(我不确定它是否具有不同的格式)。
Linux 的二进制文件和 Windows 的二进制文件有什么区别(就格式而言)?
如果没有,是什么阻止我们为两个操作系统制作单个二进制文件(请确保我指的是可以运行的最后一个文件,而不是源代码)?
既然二进制格式存在差异,那么操作系统本身是如何编译的呢?
如果我没记错的话,微软使用 Windows 来编译下一个 Windows 版本/更新。
这些二进制文件如何由机器执行(甚至内核也是其中之一)?
它们的格式不是一样的吗? (对于这么低级的程序。)
正如@AlanBirtles 的评论中提到的,这实际上是可能的。请参阅 Actually Portable Executable、Redbean 和 有关两者的文章。
即使二进制格式不同,也可以提供一个在多种不同格式下都有效的文件。
但是,这是一个不起眼的黑客行为,我会在生产中(或根本)远离它。
我读到 Windows 和 Linux 的二进制文件是相同的(不确定它是否具有不同的格式)
那你就读错了。它们是完全不同的格式。
Linux 的二进制文件和 Windows 的二进制文件有什么区别(就格式而言)?
Windows:可移植可执行文件(PE)
Linux:可执行和可链接格式(ELF)
如果没有的话
有很多差异。
是什么阻止我们为两个操作系统制作一个二进制文件?
不同操作系统各自的可执行文件需要不同的二进制格式。
既然二进制格式存在差异,那么操作系统本身是如何编译的呢?
详情请咨询操作系统厂商。但基本上,它们的编译就像任何其他程序一样(只是非常复杂的程序)。与任何其他程序一样,它们的源代码被编译成针对其目标平台甚至每个目标 CPU 的格式适当的可执行文件。例如,Windows 的所有可执行文件都使用 PE 格式,但无论可执行文件是在 x86 CPU、x64 CPU 还是 ARM CPU 上运行,每个可执行文件内的底层机器代码都是不同的。
如果我没记错的话,微软使用 Windows 来编译下一个 Windows 版本/更新
是的。这通常被称为 “dog-fooding” 或 “bootstrapping”。例如,在Windows上运行的VC++用于开发新版本的VC++、Windows等
这些二进制文件如何由机器执行(甚至内核也是其中之一)?
当可执行文件(由用户、程序等)运行时,请求会发送到操作系统,操作系统的可执行加载程序会根据需要解析文件的格式以找到文件的机器代码,然后运行该文件根据需要在目标 CPU 上编写代码。
至于运行用户的操作系统本身,机器上运行着一个更基本的操作系统(即 BIOS),它(除其他外)在机器启动时加载用户的操作系统并开始在可用的 CPU 上运行。有关详细信息,请参阅引导操作系统。
它们的格式不是一样的吗? (对于这么低级的程序。)
没有。