-1 peripherals cpu assembly cross-platform cpu-architecture
我正在研究计算机体系结构,但我不明白是什么真正使一台机器的软件与另一台机器“兼容”。让我们以两台使用相同 intel cpu 的机器(例如 Mac OS 和 Windows)为例。现在,如果操作码相同,它们的软件怎么可能彼此不兼容?
1)有人可以概述一下兼容性词所涉及的内容吗?
2)除了CPU的操作码之外,还有哪些因素可以使两台机器相互兼容?
除了其他硬件组件之外,正如已经指出的那样,软件本身也是兼容性问题的一个巨大根源。
这并不是什么新鲜事,您不能总是使用不同的应用程序打开专有文件格式。
Linux 可执行文件的格式是ELF,Windows 的可执行文件格式是PE,macOS 使用mach-o。
阅读链接的页面,看看这些格式有多少共同点和不同点。
然而,没有什么可以阻止操作系统支持多种可执行格式(Linux 实际上是这样,Windows 也是如此,macOS 也可能如此)。
如果我们忽略文件格式问题,仍然存在库问题。为 Linux 编写的程序可以编写为使用仅限 Linux 的库。
即使有端口,由于调用约定不同,也需要重新编译。
例如,在 Windows 下调用 C 标准函数如下所示:
lea rdx, [REL filename]
lea rcx, [REL mode]
call fopen
在 Linux 下你必须使用:
lea rdi, [REL filename]
lea rsi, [REL mode]
call fopen
如果您将所有需要的库(具有正确的调用约定)与应用程序一起提供,那么仍然存在另一个问题。
库需要与操作系统通信,并且完成此操作的方式是特定于操作系统的。
例如,int 80hLinux下和int 2ehWindows下使用的32位应用程序。
您仍然可以通过移植库来解决此问题,它现在必须使用本机操作系统的调用约定,但使用主机操作系统的接口(例如,Linux SYS V ABI,但 Windows 系统调用号)。
变量的数量已经变得指数级复杂,但真正的问题不是如何调用系统调用,而是它们提供的接口。
简而言之,GUI 系统几乎是 Windows 的一个整体,但在 Linux 下,您可以使用任何您喜欢的窗口管理器。因此,如果您有一个程序调用特定于 Windows GUI 的函数,如何将其转换为 Linux?
高级操作,例如create a window,可以被翻译(这就是 Gtk 和 Qt 等库所做的),但低级操作(例如:RegisterClassEx)不会一对一映射。
如果您考虑一些内核接口有多么不同,这会变得更加混乱。
例如,Linux 中的 uid/gid/permissions 事物和 Windows 中的 SID/DACL 事物。
但是,您仍然可以解决此问题:您必须重新实现其他操作系统接口。这是一项大量的工作,但可以通过一个技巧来跳过:在虚拟机中运行其他操作系统。
这就是 WLS2 的工作原理,也是它允许您在 Windows 下使用 Linux 二进制文件的原因。
请注意,WLS2 是可能的,因为:
情况并非总是如此,Linux 无法在 VM 中运行 Windows 内核来支持 Windows 二进制文件,它必须模拟它(请参阅:Wine),这类似于重新实现 Windows 的很大一部分!