什么是 16、32 和 64 位架构?

Posted

技术标签:

【中文标题】什么是 16、32 和 64 位架构?【英文标题】:What are 16, 32 and 64-bit architectures? 【发布时间】:2011-04-05 09:30:17 【问题描述】:

对于微处理器和/或操作系统来说,16 位、32 位和 64 位架构是什么意思?

如果是微处理器,它是指General Purpose Registers 的最大大小或Integer 的大小或Address-lines 的数量或Data Bus lines 的数量还是什么?

我们所说的“DOS is a 16-bit OS”、“Windows in a 32-bit OS”等是什么意思?

【问题讨论】:

【参考方案1】:

如果您想了解cmets,我的原始答案如下。

新答案

正如您所说,有多种措施。幸运的是,对于许多 CPU,许多措施都是相同的,因此不会造成混淆。让我们看一些数据(对不起图片上传,我看不到在markdown中做表格的好方法)。

如您所见,许多列都是不错的候选。但是,我认为通用寄存器(绿色)的大小是最常见的答案。

当处理器的不同寄存器大小差异很大时,通常会对其进行更详细的描述,例如Motorola 68k 被描述为 16/32 位芯片。

其他人认为是指令总线宽度(黄色)也与表中匹配。但是,在当今的流水线世界中,我认为与通用寄存器的大小相比,与大多数应用程序相比,这不是一个重要的衡量标准。


原答案

不同的人可能意味着不同的事情,因为正如你所说,有几种衡量标准。因此,例如,谈论内存寻址的人可能与谈论整数算术的人不同。不过,我会尝试定义我认为的共识。

我的看法是,对于 CPU,它意味着“用于标准操作的典型寄存器的大小”或“数据总线的大小”(两者通常是等价的)。

我用以下逻辑证明这一点。 Z80 具有 8 位累加器和 8 位数据总线,同时具有 16 位内存寻址寄存器(IX、IY、SP、PC)和 16 位内存地址总线。 Z80被称为8位微处理器。这意味着人们通常必须指主要整数算术大小或数据总线大小,而不是内存寻址大小。

这不是指令的大小,因为 Z80(再次)有 1,2 和 3 字节指令,当然多字节是在多次读取中读取的。另一方面,8086 是一个 16 位微处理器,可以读取 8 位或 16 位指令。所以我不得不不同意说它是指令大小的答案。

对于操作系统,我将其定义为“编译代码以在该大小的 CPU 上运行”,因此 32 位操作系统的代码编译为在 32 位 CPU 上运行(根据上述定义)。

【讨论】:

您能否详细说明,“语言马虎”是什么意思? @JMSA 我相信 Nick 指出了一个事实,即 16 位、32 位和 64 位这些术语是模棱两可的。根据您所描述的内容,它们的含义会略有不同。 模糊不清的不是术语,而是实际的处理器设计。各种宽度都是单独优化的,因此只是松散相关。 C 语言的兴起“鼓励”了数据和地址宽度相同,但并非总是如此。实际的总线宽度通常与两者完全不同。 CPU 的位数在 Wikipedia 上有相当准确的描述,没有你描述的那么草率...... 感谢 cmets,希望现在措辞更好。【参考方案2】:

CPU“是”多少位,表示它的指令字长。 在 32 位 CPU 上,此类指令的字长为 32 位,这意味着这是 CPU 可以作为指令或数据处理的宽度,通常会导致总线具有该宽度。 出于类似的原因,寄存器的大小与 CPU 的字长相同,但您通常有更大的寄存器用于不同的目的。

以PDP-8 计算机为例。这是一台 12 位计算机。每条指令长 12 位。为了处理相同宽度的数据,累加器也是 12 位的。 但是使 12 位计算机成为 12 位机器的原因在于它的指令字长。它的前面板上有 12 个开关,可以通过指令对它进行编程。

这是打破 8/16/32 位焦点的一个很好的例子。

位计数通常也是地址总线的大小。因此它通常会告诉最大可寻址内存。

Wikipedia 对此有很好的解释:

在计算机体系结构中,32 位整数、内存地址或其他数据单元是最多 32 位(4 个八位字节)宽的那些。此外,32 位 CPU 和 ALU 架构是基于该大小的寄存器、地址总线或数据总线的架构。 32 位也是一个术语,用于指代以 32 位处理器为标准的一代计算机。

现在让我们谈谈操作系统。

对于 OS-es,这与 CPU 的实际“比特性”关系不大,它通常反映操作码的组装方式(CPU 的字长)以及寄存器的寻址方式(你可以' t 在 16 位寄存器中加载 32 位值)以及如何寻址内存。将其视为已完成的编译程序。它存储为二进制指令,因此必须适合 CPU 的字长。在任务方面,它必须能够寻址整个内存,否则它无法进行适当的内存管理。

但归根结底,程序是 32 位还是 64 位(操作系统在这里本质上是一个程序),它的二进制指令是如何存储的,以及寄存器和内存是如何寻址的。总而言之,这适用于所有类型的程序,而不仅仅是操作系统。这就是为什么你有为 32 位或 64 位编译的程序。

【讨论】:

指令字长部分是内部的,有时一条指令可能比 CPU 连接到程序存储器的总线长(在 von-Neumann 设计中,程序存储器和程序存储器只有一个地址空间)带有堆栈的工作内存等),现在,尤其是在使用流水线时,该指令可能比您的总线更长。在内部,该操作码具有一定的宽度。大多数 CPU 使用微码来解码该操作码,该微码可以处理指令可以具有的一定宽度。也就是指令字宽。 我不是在谈论微码指令。 CPU指令由微码解码。现在这条 CPU 指令有一个(最大)长度。该长度由 CPU 的硬件设计及其微码定义。 “我一直认为“位”指的是总线宽度。” 反例:第一批 mac 是 m68000s(绝对是 32 位芯片),但运行在 16bin 主总线上.执行全宽获取或存储需要两个周期,但这对程序员来说是不可见的(被缓存架构抽象出来),除了持续的内存访问速度。 @Marting:是的,但请记住,操作码可以比总线的宽度长!很可能,操作码+数据需要多个循环来读取然后解码。 @polemon 对不起,如果我的速度非常慢,但我仍然不明白......afaik Pentium 4 是一个 32 位处理器,但肯定有超过 4 个字节的操作码。或者你的意思是内部的最大操作码大小,即在它被解码之后?如果是这样,那么最大解码大小对程序员来说真的很重要吗?【参考方案3】:

差异归结为传递给通用寄存器以进行操作的指令集的位宽。 16 位可以操作 2 个字节,64 位可以操作 8 个字节的指令。您通常可以通过在每个时钟周期执行更密集的指令来增加处理器的吞吐量。

【讨论】:

觉得这需要一个简短的解释,而不是 7 个冗长、不准确的解释。【参考方案4】:

这些定义是营销术语,而不是精确的技术术语。

在模糊的技术术语中,它们与架构上可见的宽度比任何实际的实现寄存器或总线宽度更相关。例如,68008 被归类为 32 位 CPU,但在硅片中有 16 位寄存器,只有 8 位数据总线和 20 多个地址位。

【讨论】:

6502 被归类为 8 位处理器,但具有 16 位地址寄存器、16 位地址总线以及 8、16 和 24 位指令。 MIPS 架构可以选择 64 位数据和 32 位地址或两者都使用 64 位,但早期的实现只有 32 位总线。等等。营销人员通常更喜欢尽可能多的数量,除非针对的是极低成本的嵌入式市场。【参考方案5】:

http://en.wikipedia.org/wiki/64-bit#64-bit_data_models 数据模型意味着语言的位数。

“OS is x-bit”短语通常表示操作系统是为 x-bit cpu 模式编写的,即 64 位 Windows 在 x86-64 上使用长模式,其中寄存器为 64 位,地址空间为64 位大,并且与 32 位模式有其他明显区别,其中寄存器通常是 32 位宽,地址空间是 32 位大。在 x86 上,32 位和 64 位模式之间的主要区别在于存在 32 位分段以实现历史兼容性。

通常在编写操作系统时考虑到 CPU 位数,x86-64 是数十年来向后兼容的一个显着示例 - 您可以拥有从 16 位实模式程序到 32 位保护模式程序再到 64 位的所有内容 -位长模式程序。

此外,还有不同的虚拟化方式,因此您的程序可能像在 32 位模式下一样运行,但实际上它完全由非 x86 内核执行。

【讨论】:

补充一点,许多架构只有一位,因此在谈论这些架构上的位时,只有语言数据模型才有意义。其他架构,如 ARM,本身是 32 位的,但有额外的模式,即所谓的 Thumb/Thumb2,它通过将一些指令编码为 16 位而不是 32 位来增加指令密度。它们仍然被认为是 32 位 CPU 和操作系统它们运行通常是 32 位。【参考方案6】:

当我们在计算机科学中谈论 2^n 位架构时,我们基本上是在谈论内存寄存器、地址总线大小或数据总线大小。 2^n 位架构术语背后的基本概念是表示这里的 2^n 位数据可以被进程用来寻址/传输大小为 2^n 的数据。

【讨论】:

架构不限于 2^n。 18、24、36位架构在微型机时代被广泛使用。【参考方案7】:

据我所知,从技术上讲,它是整数路径的宽度。我听说过具有 32 位寻址的 16 位芯片。然而,实际上,它是地址宽度。 sizeof(void*) 在 16 位芯片上是 16 位,在 32 位上是 32 位,在 64 位上是 64 位。

这会导致问题,因为 C 和 C++ 允许在 void* 和整数类型之间进行转换,并且如果整数类型足够大(与指针大小相同)是安全的。这会导致各种不安全的东西

void* p = something;
int i = (int)p;

这会在 64 位代码(适用于 32 位)上严重崩溃和烧毁,因为 void* 现在是 int 的两倍。

在大多数语言中,您必须努力关注您正在处理的系统的宽度。

【讨论】:

“这将在 64 位代码上严重崩溃和烧毁(仅适用于 16 位),因为 void* 现在是 int 的两倍。”这适用于 64 位 Windows,但不适用于 sizeof(int) == 8 的 x64-Linux。 应该忽略糟糕的代码可能实际工作的特殊情况,而不是发布。此外,将 16 位固定为 32 位。

以上是关于什么是 16、32 和 64 位架构?的主要内容,如果未能解决你的问题,请参考以下文章

32位和64位架构

X86和X86_64

操作系统 32bit 和 64bit 有啥区别

ubuntu16 64位 编译64位程序和32位程序

32位机器可以访问多少内存?

构建 pyinstaller 可执行文件时,我可以控制架构(32 位与 64 位)吗?