纠正《请教大家一个计算机组成原理的问题》一贴中关于位长的误区

2023-04-18 05:06:39 +08:00
 billccn

原帖 /t/933184

里面好多人说计算机的位长是指地址线的长度,这个是有问题的,但又和原帖题主的问题有区别,就另开一贴。

纵观计算机的历史和原理,所谓的 CPU 的位长都是指 ALU 能一次性处理的数据的长度,一般也是普通寄存器的长度。

而计算机内存地址超过位长是很平常的。比如因特尔第一代 CPU 4004 是一个 4 位机,显然一个只能访问 2^4=16 个不同地址的 CPU 是没有商用的意义的,所以它实际上支持 12 位地址。8 位机时代通常支持 16 位地址( 64KB ),16 位机通常支持 18-24 位地址。其中有些指令集有超长地址寄存器,需要特殊指令才能操作;有些地址与位长等长,但采用 bank 选择访问不同的物理内存区域;还有两者混合式的。

32 位因为足够绝大多数应用使用,而且 32 位机几乎都有虚拟地址能力,导致初期没有扩大指令集内可见的地址空间的需求,所以 32 位是第一代长时间(逻辑)地址和位长等长的。当然地址线的扩展从未停止,奔腾 2 就已经有 36 位了。到了 32 位后期,各种指令集层面的扩展也层出不穷,比如 PAE ,只不过这时候主流程序都是用高级语言编写的,访问这些扩展都需要特殊的汇编指令,实际使用它们的不多。

64 位出现之后倒是反其道而行之,早期 64 位 CPU 只有 40 位地址总线,现在民用 CPU 也很少有 64 位地址线的。

2088 次点击
所在节点    程序员
7 条回复
levelworm
2023-04-18 05:12:09 +08:00
说到这个,想到七八十年代一堆 mini computer 群魔乱舞的年代,那时候的位长似乎也比较混乱。
verrickt
2023-04-18 08:12:09 +08:00
依稀记得教材里把总线在功能上分成了三类:数据总线、地址总线、控制总线,这三类总线均有独立的字长。
数据总线的字长与 lz 所讨论的 cpu 位长一致,是寄存器、ALU 一次能处理数据的长度。
地址总线的字长主要由存储器的物理性质决定,但也不得不做出一些妥协,无法与数据总线的位宽对其。例如现代 AMD64 指令集的 CPU ,地址总线的字长为 48 位。其不使用 64 位字长的原因在于减小页表的空间开销。此外,也可以使用特殊的寻址模式来进一步扩展可寻址范围,例如 lz 所提的 PAE ( physical address extension )
控制总线的字长在书中没有单独讨论,欢迎了解的 v 友补充
hitmanx
2023-04-18 08:25:57 +08:00
经典的 8086 我记得就是,20 位的地址空间(1M),但是 16 位的数据总线。寻址的解决办法是用段+偏移。
levelworm
2023-04-18 08:32:46 +08:00
@hitmanx 我记得好像是用 segment register ,还挺有意思的。
duke807
2023-04-18 08:49:38 +08:00
我在那个帖子说的是主要指令集操作的位数来算的

不过一般看一个指针所占空间也是没问题的
yolee599
2023-04-18 09:07:51 +08:00
我记得 8051 内核( 8 位)是支持 16 位长度地址的,只有一个 16 位寄存器,其他都是 8 位,使用间接寻址的方式访问
lingxi27
2023-04-18 13:48:51 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX