use*_*281 20 c x86 compatibility amd intel
C语言用于编写UNIX以实现可移植性 - 使用不同编译器编译的相同C语言程序生成不同的机器指令.为什么Windows操作系统能够在Intel和AMD处理器上运行?
Ste*_*sop 24
AMD和Intel处理器(*)有一组共同的指令,因此编译器或汇编器可以编写在两者上运行"相同"的二进制代码.
然而,甚至来自一个制造商的不同处理器系列具有它们自己的指令集,通常被称为"扩展"或其他.忽略x87协处理器,我第一次记得这是一个营销点,当时一切都突然"采用MMX(TM)技术".期望在任何处理器上运行的二进制代码要么需要避免扩展,要么在使用它们之前检测CPU类型.
英特尔的Itanium 64位架构与AMD的x86-64架构完全不同,因此有一段时间他们的64位产品不兼容(Itanium与x86完全不同,而x86-64通过添加64位指令扩展了指令集).英特尔首先眨眼并采用了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处理器:-)
Intel 的 80x86 CPU 和 AMD 的 80x86 CPU“大致相同”,但有些东西完全不同(例如虚拟机扩展 - SVM 与 VT-x),有些东西(扩展)可能受支持,也可能不支持。但是,同一制造商的不同 CPU 上的某些东西也有所不同(例如,某些 Intel 芯片支持 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 不支持的指令时生成错误)。
如您所料,主流Intel和AMD处理器具有相同的指令集.
例如,Windows不能在ARM或PowerPC芯片上运行,因为它在某种程度上依赖于底层指令集.
但是,大多数Windows都是用C++编写的(据我所知),它应该可以移植到其他架构中.Windows NT甚至可以在PowerPC和其他架构上运行.
AMD 和 Intel 使用相同的指令集。
当您在 AMD 处理器或 Intel 处理器上安装 Windows 时,它不会在机器上“编译”代码。
我记得很多人在大学期间对这个主题感到困惑。他们认为“设置”意味着它正在您的机器上编译代码。不是。大多数(如果不是全部)免费领域之外的 Windows 应用程序都是以二进制形式提供给您的。
至于便携性,这不一定是 100% 正确的。尽管 C 具有高度可移植性,但在许多情况下,为特定操作系统或系统编写代码将导致代码只能在该机器上编译/执行。例如,某些 Unix 机器以不同的方式处理文件和目录,因此它可能不是 100% 可移植的。
| 归档时间: |
|
| 查看次数: |
23370 次 |
| 最近记录: |