原帖 /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 位地址线的。
1
levelworm 2023-04-18 05:12:09 +08:00 via Android
说到这个,想到七八十年代一堆 mini computer 群魔乱舞的年代,那时候的位长似乎也比较混乱。
|
2
verrickt 2023-04-18 08:12:09 +08:00 via Android
依稀记得教材里把总线在功能上分成了三类:数据总线、地址总线、控制总线,这三类总线均有独立的字长。
数据总线的字长与 lz 所讨论的 cpu 位长一致,是寄存器、ALU 一次能处理数据的长度。 地址总线的字长主要由存储器的物理性质决定,但也不得不做出一些妥协,无法与数据总线的位宽对其。例如现代 AMD64 指令集的 CPU ,地址总线的字长为 48 位。其不使用 64 位字长的原因在于减小页表的空间开销。此外,也可以使用特殊的寻址模式来进一步扩展可寻址范围,例如 lz 所提的 PAE ( physical address extension ) 控制总线的字长在书中没有单独讨论,欢迎了解的 v 友补充 |
3
hitmanx 2023-04-18 08:25:57 +08:00
经典的 8086 我记得就是,20 位的地址空间(1M),但是 16 位的数据总线。寻址的解决办法是用段+偏移。
|
5
duke807 2023-04-18 08:49:38 +08:00 via Android
我在那个帖子说的是主要指令集操作的位数来算的
不过一般看一个指针所占空间也是没问题的 |
6
yolee599 2023-04-18 09:07:51 +08:00 via Android
我记得 8051 内核( 8 位)是支持 16 位长度地址的,只有一个 16 位寄存器,其他都是 8 位,使用间接寻址的方式访问
|
7
lingxi27 2023-04-18 13:48:51 +08:00
赞
|