对于微处理器和/或操作系统,16 位、32 位和 64 位架构意味着什么?
在微处理器的情况下,这是否意味着 s 的最大大小General Purpose Register
或 s 的大小Integer
或数量Address-line
或 s 的数量Data Bus line
或什么?
DOS is a 16-bit OS
我们所说的“ ”、“ ”等是什么意思Windows in a 32-bit OS
?
对于微处理器和/或操作系统,16 位、32 位和 64 位架构意味着什么?
在微处理器的情况下,这是否意味着 s 的最大大小General Purpose Register
或 s 的大小Integer
或数量Address-line
或 s 的数量Data Bus line
或什么?
DOS is a 16-bit OS
我们所说的“ ”、“ ”等是什么意思Windows in a 32-bit OS
?
如果您想了解评论,我的原始答案如下。
正如你所说,有多种措施。幸运的是,对于许多 CPU,许多措施都是相同的,因此不会造成混淆。让我们看一些数据(对不起图片上传,我看不到在markdown中做表格的好方法)。
如您所见,许多列都是很好的候选者。但是,我认为通用寄存器(绿色)的大小是最常见的答案。
当一个处理器的不同寄存器大小差异很大时,通常会对其进行更详细的描述,例如将摩托罗拉 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 上运行(根据上述定义)。
CPU“是”多少位,意味着它的指令字长是多少。在 32 位 CPU 上,此类指令的字长为 32 位,这意味着这是 CPU 可以作为指令或数据处理的宽度,通常会导致总线具有该宽度。出于类似的原因,寄存器的大小与 CPU 的字长相同,但您通常有更大的寄存器用于不同的目的。
以PDP-8计算机为例。这是一台 12 位计算机。每条指令长 12 位。为了处理相同宽度的数据,累加器也是 12 位的。但是使 12 位计算机成为 12 位机器的原因在于它的指令字长。它的前面板上有十二个开关,可以通过指令对它进行编程。
这是打破 8/16/32 位焦点的一个很好的例子。
位计数通常也是地址总线的大小。因此,它通常会告诉最大可寻址内存。
维基百科对此有很好的解释:
在计算机体系结构中,32 位整数、内存地址或其他数据单元是最多 32 位(4 个八位字节)宽的那些。此外,32 位 CPU 和 ALU 架构是基于该大小的寄存器、地址总线或数据总线的架构。32 位也是以 32 位处理器为标准的一代计算机的术语。
现在让我们谈谈操作系统。
使用 OS-es,这与 CPU 的实际“bitty-ness”关系不大,它通常反映了操作码的组装方式(CPU 的字长)以及寄存器的寻址方式(你不能加载16 位寄存器中的 32 位值)以及如何寻址内存。将其视为已完成的编译程序。它存储为二进制指令,因此必须适合 CPU 的字长。在任务方面,它必须能够寻址整个内存,否则它无法进行适当的内存管理。
但归根结底,一个程序是 32 位还是 64 位(这里的操作系统本质上是一个程序),它的二进制指令是如何存储的,以及寄存器和内存是如何寻址的。总而言之,这适用于所有类型的程序,而不仅仅是操作系统。这就是为什么您要为 32 位或 64 位编译程序的原因。
差异归结为传递给通用寄存器以进行操作的指令集的位宽。16 位可以操作 2 个字节,64 位可以操作 8 个字节的指令。您通常可以通过在每个时钟周期执行更密集的指令来增加处理器的吞吐量。
这些定义是营销术语,而不是精确的技术术语。
在模糊的技术术语中,它们与架构上可见的宽度比任何实际的实现寄存器或总线宽度更相关。例如,68008 被归类为 32 位 CPU,但在硅片中有 16 位寄存器,只有 8 位数据总线和 20 多个地址位。
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 内核执行。
据我所知,从技术上讲,它是整数路径的宽度。我听说过具有 32 位寻址的 16 位芯片。然而,实际上,它是地址宽度。sizeof(void*) 在 16 位芯片上是 16 位,在 32 位上是 32 位,在 64 位上是 64 位。
这会导致问题,因为 C 和 C++ 允许在 void* 和整数类型之间进行转换,并且如果整数类型足够大(与指针大小相同)是安全的。这会导致各种不安全的东西
void* p = something;
int i = (int)p;
这将在 64 位代码(适用于 32 位)上发生可怕的崩溃和烧毁,因为 void* 现在是 int 的两倍。
在大多数语言中,您必须努力关注您正在处理的系统的宽度。
当我们在计算机科学中谈论 2^n 位架构时,我们基本上是在谈论内存寄存器、地址总线大小或数据总线大小。2^n 位架构术语背后的基本概念是表示这里的 2^n 位数据可以被进程用来寻址/传输大小为 2^n 的数据。