33

C 语言用于编写 UNIX 以实现可移植性——使用不同编译器编译的相同 C 语言程序产生不同的机器指令。为什么 Windows 操作系统能够同时在 Intel 和 AMD 处理器上运行?

4

6 回答 6

35

AMD 和 Intel 处理器 (*) 有大量共同的指令,因此编译器或汇编器可以编写在两者上运行“相同”的二进制代码。

但是,即使来自一个制造商的不同处理器系列也有自己的指令集,通常称为“扩展”或其他。忽略 x87 协处理器,我第一次记得这是一个营销点是当一切突然“使用 MMX(TM) 技术”时。期望在任何处理器上运行的二进制代码要么需要避免扩展,要么在使用它们之前检测 CPU 类型。

Intel 的 Itanium 64 位架构与 AMD 的 x86-64 架构完全不同,因此有一段时间他们的 64 位产品不兼容(并且 Itanium 与 x86 完全不同,而 x86-64 通过添加 64 位指令扩展了指令集)。Intel先眨眼采用了x86-64,虽然还是有一些区别:http ://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64

Windows 可能对几乎所有代码都使用通用 x86 或 x86-64 指令集。如果各种驱动程序和编解码器以多个版本提供,并且在询问 CPU 后选择正确的一个,我不会感到惊讶。

(*) 实际上,英特尔制造或已经制造了各种处理器,包括 ARM(英特尔的 ARM 处理器被称为 XScale,但我认为他们已经出售了该业务)。AMD 也生产其他处理器。但我们知道您指的是哪种 Intel/AMD 处理器 :-)

于 2009-07-10T14:00:52.620 回答
9

正如您所怀疑的,主流的 Intel 和 AMD 处理器具有相同的指令集。

例如,Windows 不能在 ARM 或 PowerPC 芯片上运行,因为它在某种程度上依赖于底层指令集。

但是,大多数 Windows 都是用 C++ 编写的(据我所知),它应该可以移植到其他架构。Windows NT 甚至可以在 PowerPC 和其他体系结构上运行

于 2009-07-10T13:41:52.487 回答
9

AMD 与 Intel 兼容,否则他们永远不会在市场上站稳脚跟。

它们有效地与克隆兼容。

瑞安

于 2009-07-10T13:42:25.683 回答
6

Intel 的 80x86 CPU 和 AMD 的 80x86 “基本上是同一类”,但有些东西完全不同(例如虚拟机扩展 - SVM 与 VT-x),有些东西(扩展)可能受支持,也可能不支持。但是,同一制造商的不同 CPU 上也有一些不同的地方(例如,一些英特尔芯片支持 AVX2,而一些不支持)。

有多种方法可以处理差异:

  • 只使用公共子集,以便在所有 80x86 CPU 上运行相同的代码(例如,将其视为 8086 芯片)。

  • 使用一系列 CPU 共有的功能子集,以便在该范围内的所有 80x86 CPU 上运行相同的代码。这很常见(例如,“该软件需要支持 64 位扩展的 80x86 CPU(和操作系统)”)。

  • 使用安装时测试。例如,可能有 4 个不同的软件副本(针对 4 个不同范围的 CPU 编译),安装程序决定哪个副本对正在安装软件的计算机有意义。

  • 使用运行时测试。例如,代码可以使用CPUID指令来做if( AVX2_is_supported() ) { set_function_pointers_so_AVX2_is_used(); } else {set_function_pointers_so_AVX2_is_not_used(); }注意:一些编译器(英特尔的 ICC)可以自动生成执行运行时测试的代码。

这些不是相互排斥的选择。例如,安装程序可能决定安装 64 位版本(而不是 32 位版本),然后 64 位版本可能会在运行时检查哪些功能受支持并具有不同的代码来使用不同的功能。

另请注意,操作系统的不同部分可以单独处理。例如,一个操作系统可能有 6 个不同的引导加载程序、4 个不同的“HAL”、4 个不同的内核和 3 个不同的“内核模块”来支持虚拟化;其中一些可能会进行运行时测试,而有些可能不会。

Intel 和 AMD 处理器是否具有相同的汇编程序?

几乎所有 80x86 的汇编器都支持几乎所有的扩展(来自所有 CPU 制造商 - 例如 Intel、AMD、VIA、Cyrix、SiS,...)。一般来说; 由程序员(或编译器)来确保他们只使用他们知道存在的东西。一些汇编器提供了使这更容易的特性(例如,NASM 提供了一个CPU ...指令,以便程序员可以告诉汇编器在看到指定 CPU 不支持的指令时生成错误)。

于 2019-01-11T05:05:09.313 回答
5

AMD 和 Intel 使用相同的指令集。

当您在 AMD 处理器或 Intel 处理器上安装 Windows 时,它不会在机器上“编译”代码。

我记得很多人在大学期间对这个问题感到困惑。他们认为“设置”意味着它正在您的机器上编译代码。它不是。大多数(如果不是全部)自由领域之外的 Windows 应用程序都是以二进制形式提供给您的。

至于可移植性,这不一定是 100% 正确的。虽然 C 具有高度可移植性,但在许多情况下,为特定操作系统或系统编写代码将导致代码只能在该机器上编译/执行。例如,某些 Unix 机器处理文件和目录的方式不同,因此它可能不是 100% 可移植的。

于 2009-07-10T13:48:09.797 回答
-3

Intel 和 AMD 处理器是否具有相同的汇编程序?汇编程序组装要在处理器上运行的程序,因此您的问题有缺陷。处理器不使用汇编程序。

如果您的意思是英特尔和 AMD 处理器可以运行相同的汇编程序吗?那么答案是YES!!!

所有的汇编程序都是从结构化文本文件中汇编其他程序的程序。Visual Basic 是汇编程序的一个示例。

于 2017-05-03T06:38:32.773 回答