不同操作系统及CPU字长、寻址能力、指针宽度的理解

不同操作系统及CPU字长、寻址能力、指针宽度的理解

字长

64位CPU和32位CPU中64和32的含义:
64和32指的是CPU中的寄存器(通用)的字长,字长就是一个字的位数。这里说的字的含义是:处理器进行数据处理时,一次存取,加工,和传送的数据长度。

现在CPU大多是64位的,但大多都以32位字长运行,都没能展示它的字长的优越性,因为它必须与64位软件(如64位的操作系统等)相辅相成,也就是说,字长受软件系统的制约,例如,在32位软件系统中64位字长的CPU只能当32位用。

在计算机词典中:
(1)位(Bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。
(2)字节(Byte):一个字节由8个位组成。它表示作为一个完整处理单位的8个二进制数码。
(3)字(Word):16个位为一个字,它代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算单位。
(4)双字(Dword):通常称16位是一个字,32位是一个双字,64位是两个双字。
(5) 四字 Qword: 两个双字称为一个四字

系统中的一个字的大小与CPU寄存器的大小有关同时也受软件系统限制,通常来说16位,32位与64位CPU中的字不一样:
16位系统:一个字 = 2Byte
32位系统:一个字 = 4Byte
64位系统:一个字 = 8Byte

字长由微处理器(CPU)对外数据通路的数据总线条数决定。

CPU位宽

CPU位宽指的是CPU位宽指的是数据总线位宽,即一个时钟周期内CPU能处理的二进制位数,和寄存器位宽相对应。

数据总线传输的数据或指令的位数要与字长一致。否则,如果数据总线宽度大于字长则一条数据或指令要分多次传输,则分开传输的几组数据也就没有意义了;如果数据总线宽度小于字长,则CPU的利用率要降低,对资源是种浪费。

另外,如果字长为n位,一般称CPU是n位的。所以说数据总线的宽度与字长及CPU的位数是一致的。

CPU的寻址能力

CPU的寻址能力与它的地址总线位宽有关,64位CPU出现之后,其地址总线位宽一般采用的是36位或者40位,它们寻址的物理地址空间为64GB或者1T。16位CPU的地址总线位宽可以是20位,32位CPU的地址总线可以是36位,64位CPU的地址总线位宽可以是40位。这个可以从下面这篇文章的配图可以看出。
linux进程的内存布局
注意该篇中64位Linux进程布局图有误,具体可以参考以下
官方文档
在这里插入图片描述
在这里插入图片描述
这里CPU的寻址位数是由地址总线的位数决定,32位CPU的寻址位数不一定是32位,因为32位CPU中32的意义为字长。

有关寻址范围计算解释,对于32位寻址的CPU,其地址值为32位的二进制数,所以可以表示的最大地址为2的32次方(即4G,最大内存空间为4GB,这里G表示数量、GB表示容量)。同时我们不难看出,一个指针的值就是一个32位的二进制数,32位对应4字节(Byte)。所以,指针的大小实际上是由CPU的寻址位数决定,而不是字长。

再来分析一下如下的情况:

  • 32位处理器上32位操作系统的32位编译器,指针大小4字节。
  • 32位处理器上32位操作系统的16位编译器,指针大小2字节。
  • 32位处理器上16位操作系统的16位编译器,指针大小2字节。
  • 16位处理器上16位操作系统的16位编译器,指针大小2字节。

这从结果看起来指针的大小和编译器有关??实际不是这样的,有这样的结果是因为以上几种情况,处理器当前运行模式的寻址位数是不一样的,如下:

  • Intel 32位处理器32位运行模式,逻辑寻址位数32,指针也就是32位,即4个字节。
  • Intel 32位处理器16位虚拟机运行模式,逻辑寻址位数16,指针也就是16位,即2个字节

编译器的作用是根据目标硬件(即CPU)的特性将源程序编译为可在该硬件上运行的目标文件。如果一个编译器支持某32位的CPU,那么它就可以将源程序编译为可以在该CPU上运行的目标文件。该源程序中指针大小也会被编译器根据该CPU的寻址位数(如32位)编译选择为4字节。

综上可得:指针大小是由当前CPU运行模式的寻址位数决定!

指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

操作系统32bit、64bit

操作系统有32/64位之分,但同时CPU也有32/64位之分;32位CPU只能安装32位系统,64位CPU可以安装32位操作系统,也可以安装64位操作系统;

指针大小

C++指针指向进程内的一个逻辑内存地址,然后由操作系统管理着从逻辑地址到物理地址的映射。我们在使用计算机时,指针操纵的其实是逻辑地址,32位操作系统的逻辑地址寻址范围只有2^32=4GB。

一般来说,在64位系统下,指针长度为8,32位系统下,指针长度位4;但是有的编译器为了不同的操作系统之间相互兼容,内部对指针进行了包装,使得不管在64位还是32位系统下,指针都是4个字节长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只嵌入式爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值