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

30

在微处理器和/或操作系统中,16位、32位和64位体系结构是什么意思?

对于微处理器而言,它是否表示通用寄存器的最大大小,或者整数的大小,或者地址线的数量,或者数据总线线数等内容?

当我们说"DOS是一个16位操作系统"、"Windows是一个32位操作系统"等时,这意味着什么?

7个回答

18

以下是我的原始答案,如果您想了解评论,请参阅。

新答案

正如您所说,有各种各样的措施。幸运的是,对于许多CPU,许多措施都是相同的,因此不会产生混淆。让我们看一些数据(抱歉,我无法在markdown中找到好的表格方式)。 Table data

正如您所看到的,许多列都是很好的候选项。然而,我认为通用寄存器的大小(绿色)是最常见且易于理解的答案。

当处理器在不同寄存器的大小上差异很大时,通常会进行更详细的描述,例如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上运行的代码(根据上述定义)。


请问您能详细说明一下,“语言不严谨”是什么意思吗? - user366312
@JMSA 我相信Nick指的是16位、32位和64位这些术语是含糊不清的。它们的意义会因所描述的内容而略有不同。 - JBirch
术语并不含糊,而是实际处理器设计的问题。各种宽度都是分别进行优化的,因此只有松散的关联。C语言的兴起“鼓励”数据和地址宽度相同,但并非总是如此。实际总线宽度通常与两者完全不同。 - hotpaw2
CPU的位数在维基百科上有非常准确的描述,它并不像你所描述的那样松散。 - polemon
感谢您的评论,希望现在措辞更好了。 - Nick Fortescue
请注意,指令大小和指令字长度并不相同。指令字的大小也不能保证与数据字长度相同(尤其是在嵌入式领域中存在一些哈佛架构)。 - dmckee --- ex-moderator kitten

7
CPU“是”多少位,意味着它的指令字长度是多少位。在32位CPU上,这种指令的字长为32位,这意味着CPU可以处理作为指令或数据的宽度,通常会导致具有该宽度的总线线路。 出于类似的原因,寄存器具有CPU字长的大小,但您经常使用较大的寄存器来实现不同的目的。
PDP-8计算机为例。这是一台12位计算机。每个指令都有12位长。为了处理相同宽度的数据,累加器也是12位。 但使12位计算机成为12位机器的是其指令字长度。它在前面板上有十二个开关,可以逐条编程。
这是一个打破8/16/32位专注的好例子。
位数通常也是地址总线的大小。因此,它通常告诉最大可寻址内存。
Wikipedia上有一个很好的解释。
在计算机架构中,32位整数、内存地址或其他数据单元的宽度最多为32位(4个八位字节)。同时,32位CPU和ALU架构基于该大小的寄存器、地址总线或数据总线。32位也是赋予一代计算机的术语,在这一代计算机中,32位处理器是常态。
现在让我们来谈谈操作系统。
在操作系统中,这与CPU的实际“位数”关系较小,通常反映了如何组装操作码(用于CPU的字长)以及如何寻址寄存器(无法将32位值加载到16位寄存器中)以及如何寻址内存。把它看作已完成的编译程序。它以二进制指令的形式存储,并且必须适合CPU的字长。就任务而言,它必须能够寻址整个内存,否则它无法进行正确的内存管理。
但归根结底,一个程序是32位还是64位(操作系统本质上也是一个程序),取决于它的二进制指令如何存储以及寄存器和内存如何寻址。总的来说,这适用于所有类型的程序,而不仅仅是操作系统。这就是为什么你会有针对32位或64位编译的程序。

1
指令字长部分是内部的,有时一条指令可能比CPU连接到程序存储器的总线长(在冯·诺依曼设计中,程序存储器和带堆栈的工作存储器只有一个地址空间);现在,特别是在使用流水线技术时,该指令可能会比您的总线线路长。在内部,该操作码具有一定的宽度。大多数CPU使用微代码来解码该操作码,这种微代码可以处理指令的一定宽度。这就是指令字宽度。 - polemon
我不是在谈论微码指令。CPU指令由微码解码。现在,这个CPU指令有一个(最大)长度。这个长度由CPU的硬件设计和它的微码定义。 - polemon
我一直以为“位”指的是总线宽度。举个反例:第一台Mac使用的是m68000芯片(绝对是32位芯片),但是运行在16位主总线上。执行完整宽度的获取或存储需要两个周期,但程序员看不到这一点(被缓存架构抽象出来),除了持续的内存访问速度之外。 - dmckee --- ex-moderator kitten
@Marting:是的,但要记住,操作码可能比总线宽度更长!很可能需要多个周期才能读取和解码操作码+数据。 - polemon
@polemon 抱歉如果我太慢了,但我仍然不明白...据我所知,Pentium 4是一种32位处理器,但肯定有比4个字节更长的操作码。或者你是指只有内部的最大操作码大小,即在解码后?如果是这样,那么这个最大解码大小对程序员真的很重要吗? - Martin
@Martin 确实,操作码交给微代码的长度可以比架构号更长。但是该操作码随后会被分成微代码处理的块。如果您愿意,这个块长度就是架构表示的长度。 - polemon

2

区别在于通用寄存器接收的指令集位宽不同。16位可以同时操作2个字节,64位可以一次性操作8个字节的指令。通过每个时钟周期执行更密集的指令,可以经常提高处理器的吞吐量。


感觉需要一个简短的解释,而不是七个冗长、不准确的解释。 - htmldrum

1

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

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


6502被归类为8位处理器,但具有16位地址寄存器、16位地址总线和8、16和24位指令。MIPS架构提供了64位数据和32位地址或同时使用64位,但早期实现只有32位总线。等等。在营销中,通常偏向于选择最大的数字,除非针对极低成本嵌入式市场。 - hotpaw2

1

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

“操作系统是x位”的短语通常意味着该操作系统是为x位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位的。 - berkus

0
据我所知,从技术上讲,这是整数通路的宽度。我听说过有32位寻址的16位芯片。然而,在现实中,它是地址宽度。在16位芯片上,sizeof(void*)为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,但不适用于x64-Linux,在那里sizeof(int)== 8。 - kusma
应该忽略那些糟糕的代码在特殊情况下可能会起作用的情况,而不是发布它们。另外,将16位固定为32位。 - Puppy

0

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


1
架构不仅限于2^n。在小型计算机时代,18、24和36位架构被广泛使用。 - dmckee --- ex-moderator kitten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接