assembly 如果两台计算机有相同的CPU(相同的机器指令),那么是什么阻止了一个程序在两台计算机上兼容?

bjg7j2ky  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(147)

我正在学习计算机体系结构,我不明白是什么让一台机器的软件与另一台机器“兼容”。让我们举个例子,像Mac OS和Windows这样的两台机器使用相同的英特尔CPU。现在,如果操作码相同,它们的软件怎么可能彼此不兼容呢?
1)谁能给予一个兼容性词所涉及的内容的大纲吗?
2)除了cpu的操作码之外,还有什么元素使两台机器相互兼容?

xeufq47z

xeufq47z1#

除了其他硬件组件,正如已经指出的,软件本身是兼容性问题的一个巨大来源。
这并不是什么新鲜事,你不能总是用不同的应用程序打开一个专有的文件格式。
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

如果您将所有需要的库(具有正确的调用约定)与应用程序一起提供,则还有另一个问题。
库需要与操作系统进行通信,其通信方式取决于操作系统。
例如,32位应用程序在Linux下使用int 80h,在Windows下使用int 2eh
您仍然可以通过移植该库来解决此问题,它现在必须使用本机操作系统的调用约定,而不是主机操作系统的接口(例如,Linux SYS V ABI,而不是Windows系统调用编号)。
这在变量的数量上已经变得指数级复杂,但是,真实的的问题不是如何调用系统调用,而是它们提供的接口。
简单地说,GUI系统几乎是Windows的一个整体,但在Linux下,你可以使用任何你喜欢的窗口管理器。那么,如果你有一个程序调用一个特定于Windows GUI的函数,你如何将其转换到Linux?
create a window 这样的高级操作可以被翻译(这是像Gtk和Qt这样的库所做的),但是低级操作(比如:RegisterClassEx)不进行一对一的Map。
如果您考虑到一些内核接口的不同,这就变得更加混乱了。
例如,Linux中的uid/gid/权限和Windows中的SID/DACL。
但是,您仍然可以修复此问题:你必须重新实现另一个操作系统接口。2这是一个巨大的工作量,但是可以用一个技巧跳过:在虚拟机中运行另一个操作系统。
这就是WLS 2的工作原理,也是它允许您在Windows下使用Linux二进制文件的原因。
请注意,WLS 2是可能的,因为:

  1. Linux是开放源代码的,因此可以很容易地修改。
  2. Linux在法律上允许这样做。
    1.微软认为在该项目上投入大量工时是有利可图的。
    情况并非总是如此,Linux无法在VM中运行Windows内核来支持Windows二进制文件,它必须模拟它(请参见:葡萄酒),这类似于重新实现Windows的一大部分!
rkkpypqq

rkkpypqq2#

你可以用与摩托车轮胎完全相同的橡胶和钢铁原材料制造半卡车轮胎,但轮胎不能因为它们来自相同的原材料而互换。
仅仅因为一种语言的字母表和字典是一样的,你就可以从这种字母表和语言中创造出不同的、不相容的东西,比如生物教科书和爱情小说。
假设有100个程序员,给予他们同样的编程任务,你不应该从他们所有人那里得到一个完全相同的答案,在两个到100个不同的解决方案之间,在许多方面不兼容,你不可能从一个人的程序中取出一个函数,然后随机地将它与其他人的函数混合在一起,并有任何成功的希望。
操作系统通常是用高级语言编写的,底层处理器只是这种语言你可以有一本德语生物书和一本法语生物书,它们以相同的顺序说同样的事情,只是使用不同的字母表和/或字典和/或语法,等等。我们已经在Windows和Macos以及其他许多操作系统中看到了这一点,在某种程度上,您可以重新编译并修补新目标。
就像你不能混合100个程序员的功能一样,你不能混合Macos和Windows驱动程序,它们的系统调用是不兼容的。作为一个很好的例子,看看这个网站和其他网站的系统调用为arm的例子。Linux系统调用为arm使用特定的软件中断数来做特定的事情,相同的硬件运行不同的操作系统,Map系统调用在不同的,不兼容的方式。(我猜Mips是一个更好的例子垃圾消息vs Linux)。
指令集就是字母表,同样的字母表可以用来产生很多不同的东西,用英语写的生物书不止一本,还有很多,不兼容的。同样的字母表和字典被用来写我的答案和这个问题的任何其他答案,但它们不是同一个答案。
指令集就像标准尺寸的螺母和螺栓,你可以用相同的基本部件建造许多彼此不相似或功能不相同的东西;你可以用相同类型的砖、板、紧固件和胶水建造一所学校或一所住宅,但它们不是可比的建筑。

相关问题