迅维网

查看: 5140|回复: 20
打印 上一主题 下一主题

32位cpu 内存空间4GB 是怎么算的?为什么单位从b变成了B?

[复制链接]
跳转到指定楼层
1#
发表于 2017-11-18 11:14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: LAN 来自 LAN

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
我知道2的32次方 这个数字是4乘以2的30次方 是4G然而什么叫做4GB的内存空间? 4G 个byte ? 1byte=8位(bit)4G个8位的空间 和2的32次方是怎么联系起来的呢不懂cpu啊

2#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
处理器最小寻址粒度一般是byte,字节
32位处理器一般理论寻址空间2^32Bytes
2^32=2^10(K)*2^10(M)*2^10(G)*4

就酱

回复 支持 反对

使用道具 举报

3#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
因为寻址的单位是字节,地址每个数表示一个字节,也就是2^32 个字节

回复 支持 反对

使用道具 举报

4#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
32位cpu可以最多找到内存中2^32(4G)个坑,一个坑放了1B(8bit)的数据,4G个坑x每坑1B=4GB
内存不是一个萝卜一个坑,而是八个萝卜一个坑,cpu(<del>cup</del>)总是一口气从坑中拔出或者放进去8个萝卜

回复 支持 反对

使用道具 举报

5#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
我决定先mark,等今天下午等飞机的时候仔细回答一发
————————————————————————————
其实我们说一个CPU是16位,32位,是指处理器中“算术逻辑单元(ALU)”的宽度,他代表的是CPU一次能并行处理的数据位数。也叫字长。而系统总线中的数据线部分,也就是数据总线,通常与ALU具有相同的宽度。

CPU其实寻址的方式主要有两种:线性寻址和段式寻址,我们详细说下。
线性寻址其实就是将整个内存看成一个连续的字节序列,这种方法可以简单看成物理内存和线性地址的一一映射,或是利用某种技术产生虚拟地址,并将其转化为物理地址(这里注意,其实页式寻址就是一个典型的例子)
段式寻址呢有点不太一样,段式寻址是把内存看成一些不同的段,CPU要制定一块内存地址的的话就需要有两个寄存器,一个用来保存短地址(一般是为了根据段号查询到段地址),另一个用来保存偏移,这样的话,同样大小的寄存器就能获得更大的寻址范围
针对第二种寻址方式,我说一个我最常见的内存地址0xdeadbeef(笑),这个地址其实就是一个典型的32位内存地址,其实这个内存地址由三部分构成:

目录(31-22)-》页表(21-12)-》偏移(11-0)
这时候虚拟地址的0-11位就是一个页的偏移量,最前面的一个地址,12-21的位置,这个位置就指定了一个表的索引(当然也可能是多个,这个就取决于页表的结构了)。当在指令中使用线性地址的时候,CPU吧线性地址送到MMU(储存管理装置),MMU的任务就是运行页表进行映射已得到相应的物理地址,MMU通过储存在特殊寄存器中的物理地址来识别当前正在使用的页表结构来达到这个目的。操作系统利用这功能让用户产生错觉,让大家以为每个处理器都对应着一个线性地址空间。
系统为每个处理器的页表分配储存空间,当处理器之间切换的时候,系统会将当前处理器的页表地址保存到一个特殊的寄存器中。
对于CPU而言,想要正确的工作,就需要从虚拟地址转换到物理内存地址。CPU提供了一个缓冲器用于储存最近虚拟地址到物理地址的映射关系,也就是快表(TLB),TLB的原理就是保存最近转换过的记录,如果以后有要的直接过来那就行了,不用再生成一遍。
举个例子:其实在我们循环访问一个我们通过缓存数组的物理地址而不是每次读取元素然后通过内存管理单元来映射。
操作系统其实让大家认为了每一个进程都有一个私有的虚拟地址空间,所以相同的虚拟地址在不同进程中会有不同的翻译结果。但是从机器层面来看,这种虚拟地址是不存在的。如果每次处理器转换都能够保存TLB相关的信息,CPU就不会出现读取错误地址的问题。所以CPU架构都提供了一种刷新TLB缓存或特定入口的方法。
但是这么干的话问题又来了,刷新TLB这东西会影响性能,举个例子,如果两个进程交叉遍历两个长数组,每次两个进程进行上下文切换的时候,其他进程试图访问数组元素时候都要页表进行一次MMU遍历,这样的话对性能肯定会影响。从MMU的角度来看,操作系统存取内存都是通过本身的页表,用户在用户态和内核态切换的时候会引发TLB的刷新,而且内核态还会经常访问用户态,这就蛋疼了,这样的话总是刷新TLB就总是会引发性能问题。
操作系统实现了一个组合态内存空间,每一个进程空间顶部都保存有一份内核页表的备份,这些也表转换将在快表中标记为全局而且不能够被改变,通过只允许有权限的代码才能对其访问来达到保护权限的目的,每次进程调用内核代码的时候都不需要去刷新TLB进而保护性能。

但是内存的32位线性地址其实是可变的,正如你每一次调试的时候,入口点的内存地址都不一样,这个涉及到了系统内存保护机制-ASLR,这个机制等有时间在讲。。

回复 支持 反对

使用道具 举报

6#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
首先搞清楚计算机中的一个术语:字长计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”,也叫“字宽”。
(注意32位Windows 编程中WORD是16bit,这是为了兼容16位windows的遗留问题)
CPU字长是有CPU的数据总线的位宽决定的,CPU的结构中有数据总线,地址总线和控制总线。数据总线是CPU和内存中的数据交互的线路,而地址总线是控制CPU和哪一个地址单元交互的线路。
举一个点单的例子,你可以把CPU和内存简单的看成两个盒子通过数据总线和地址总线连接起来。
当CPU需要读/写内存地址0x00001000处的内容的时候,CPU会通过地址总线把这个地址值告诉内存,然后在下一个时钟周期去读/写内存的时候就已经是目标地址的内存单元了。
那么这个读/写操作能操作能处理多宽的数据呢,这就是数据总线的宽度所决定的。如果数据总线的宽度是8bit,那么这此操作最多也就能处理8个bit的数据,这个CPU叫是8位CPU如果数据总线的宽度是16bit,那么同理这次操作d最多处理16个bit的数据,这个CPU就是16位CPU如果数据总线宽宽度是32bit,那么这个CPU就是32e位CPU
所以我们平时所说的多少位CPU都是指的他的数据总线的宽度(更准确的说法是ALU的位宽),也是这个CPU的字长,通常也是其寄存器的最大位宽。
那寻址多大内存是有什么决定的呢,当然是地址总线的宽度。如果地址总线的宽度是8bit,那么这个CPU的寻址范围是0~256如果地址总线的宽度是16bit,那么这个CPU的寻址范围是0~2^16如果地址总线的宽度是32bit,那么这个CPU的寻址范围是0~2^32(4G)(以上所说寻址全部指的是物理地址按字节寻址)

回复 支持 反对

使用道具 举报

7#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
32位指的是寻址能力, 2^32=4*1024*1024*1024=4Gb(个地址)
所以寻址能力, 就相当于能存放能查找多少个房间号. (我没有学过CPU原理, 但是编码电路中也有类似的东西: 通过32条单独的电路通断配合电阻就能组合出2^32种电压来)
每个门牌号代表了一个小房间, 通过房间号才能找到那个房间, 才能到房间里拿东西方东西.
那个房间的容量是B
你看, 那个b和这个B所表示的意义根本是不同的.

回复 支持 反对

使用道具 举报

8#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
1、在微机里面,存储器以字节(8bit)为基本单位的。
2、   32位CPU指的是CPU一次能处理的信息最大位数,CPU寻址能力主要还是看地址线位数。
3、如果这个CPU的地址线数是32根,那么他能寻址的内存单元个数为2^32=4*2^10*2^10*2^10个内存单元数,1里面说了存储器的基本单位是字节,那就是2^32B=4GB。
我猜题主可能是纠结的是我们平常说的32处理器指的是处理器一次能处理信息的最大位数bit,突然就变成了4GB,变成了byte。
以上个人观点,如果有问题可以评论区指出。

回复 支持 反对

使用道具 举报

9#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
32位cpu寻址4GB本来就是错误的说法,具体参考我的知乎回答:32位的cpu只能寻址4GB的内存空间,那么硬盘,flash这些存储设备是如何寻址的的?cpu怎样读取其中某个地址的数据? … https://www.zhihu.com/question/20870045/answer/184607199?utm_source=com.android.mms&utm_medium=social



到底是b还是B也仅仅是设计硬件时的规定而已。到目前为止都是为了与以前的程序兼容,因为以前的程序要求可以单独访问一个字节,但没有要求单独访问一个比特,这时修改一个比特就要求read  modify write。如果我们的物理机只能寻址到双字32位。那么修改一个字节就要read modify write。或者所有的数比如说每个ascii码都用32位表示。这样很浪费。

单独寻址一个位则会完成总线带宽繁忙。因为你每次修改一个位和每次修改一个字节在修改同样数据量的情况下总线访问次数差了八倍。

所以寻址基本粒度是字节而不是比特或双字从厉害权衡上讲是一个不赖的选择。

回复 支持 反对

使用道具 举报

10#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
内存是按照字节(B)寻址。
2(32) B = 2(10) * 2(10) * 2(12) B
              = 1K * 1K * 4K B
              = 1M * 4K B
              = 4GB

回复 支持 反对

使用道具 举报

11#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
32位是数据宽度,也是地址宽度,意思是说是按字节寻址可以寻址4G的空间,又因为是以字节为单位,所以是4GB。

回复 支持 反对

使用道具 举报

12#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
一个地址一个BYTE

回复 支持 反对

使用道具 举报

13#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
这个问题想来回答一下:
32位cpu内存4G空间这个问题,说简单也很简单,要说复杂一些也是可以的。
1、关于怎么算出来的,前面有人已经回答了。补充说明一下:
计算机处理的是二进制数据,每个 bit (也就是位)可以描述两个值01),可表达的最大值是1,字节(byte)是计算机处理的最小单元。
下面描述的最大值按无符号整型数来表达
那么:1 byte = 8 bits,最大可以表达的值是:2^8 - 1 =  255(也就是可以描述 0 到 255 共 256 个值)
然后,接下来几个常用的单位:
1K = 10 bits  (可表达的最大值是 2 ^ 10 - 1)
1M = 20 bits (可表达的最大值是 2 ^ 10 - 1)
1G = 30 bits (可表达的最大值是 2 ^ 30 - 1)
1T = 40 bits  (可表达的最大值是2 ^ 40 - 1)
那么,32 位(也就是 32 个 bits) ,1G 多出 2 个 bits,也就是 4 个 G(编号从 0 到 3 共 4 个 G)。
--------------------------------------------------------
以上是针对于32位怎么算
2、关于cpu内存空间这个问题(说说自已的看法,说错了请扶正)
从计算机体系来看是有域(或者说视角)概念的:CPU 域(cpu 视角)、DRAM 域(DRAM 视角、内存视角)、bus总线域(总线视角,例如:PCI 总线)。
下面从 CPU 视角看:
cpu内存空间”这个概念是不妥的,应该描述为“cpu 可寻址的空间”(也就是 CPU 地址空间)。注意区别物理地址空间(属于CPU 域外寻址空间),CPU 域外寻址空间可以是 DRAM 域,bus 域(总线域)。例如:物理地址空间(例如 DRAM 域的 8 G内物理内存,PCI 域的外设寻址等)
32 位 CPU 这个说法好象也不太严谨,特别是支持SMID(单指令多数据)指令后。以前说是基于 ALU 一次最大可以处理宽度也没多大毛病。但 SSE 系列指令能一次性处理 128, 256 位数据了。
所以,我偏向 cpu 可寻址的空间为 32 位注意不是 CPU 域外空间)这个概念来表达 32 位 cpu 。
CPU 内部是32 位的线性寻址,也就 CPU 的指令中最大只有 32 位地址:
举个例子:mov rax, [rsi]   这是条指令中 [rsi] 使用了 64 位寻址,可以说它是 64 位 CPU。而一个 32 位 CPU 它是不可能在指令中使用 64 位寻址(注意:是指令层)。
所以,总结 CPU 域内寻址空间代表就着它是 XX 位 CPU。
-------------------------------
接下来是 CPU 域外寻址空间,以 DRAM 域为代表(即内存,主存等),它是属于物理地址空间。
典型地 x86 CPU(32位)在启用 PAE 后,可以寻址到 36位, 40 位 或者更高的物理内存。也就是 32 位 CPU 可以寻址到超过 32 位的物理内存
CPU 域内地址通过 MMU 将线性地址通过页表转换物理地址(这个具体过程就不说了,通过 DRAM 控制器输到 DRAM 域,从而实现访问物理内存。
当然,也可以通过 host 桥输送到 PCI 域访问设备(例如读超过 4G 的光盘设备,如 blue-ray碟)

回复 支持 反对

使用道具 举报

14#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
2的32次方是4G没错,4G个寻址单位,这个单位理论上可以为任意大小,计算机一般都把这个单位设为8位,也就是一个Byte,所以内存最大就为4GB了~

回复 支持 反对

使用道具 举报

15#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
题主首先不要混淆了数据总线与地址总线,32位指的是地址总线,代表你能够寻址2的32次个内存单元,每一个单元1Byte,2的32次方总共是4GB。

回复 支持 反对

使用道具 举报

16#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
这么类比,宽度为32的地址线可以表示内存大厦里的2^32的房间,这代表的是门牌号有2^32个,但是这个大厦是学生公寓,每间房住8个人,所以最大可住人数是2^32*8,也就是最大内存容量

回复 支持 反对

使用道具 举报

17#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
牛b大发了

回复 支持 反对

使用道具 举报

18#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
简单说,寻址范围由地址线决定。2^32=4G,也就说寻址范围是4G。而一个地址一般都是最小取1byte数据,因为没有必要寻址到bit,所以最大内存就是4GB了,换句话说,不能只单独改变一个bit,只能读出一个byte,修改某个bit,再写回去。我也见过一些芯片一个地址对应的是2bytes数据,这样算下来,如果是4G寻址范围,那么实际最大空间是8G了。

回复 支持 反对

使用道具 举报

19#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
4G指的是字节数,就是你理解的那个byte。,字节是cpu处理的最小单元。
32位cpu就是指总线宽度32bit(就是32根线),一次可以传输32位二进制数,也就是4字节,所以32位系统里的字长是4字节。



我们把所有可用地址线拿来编写地址,每个字节分配一个地址,刚好是4G个字节。

而题主疑惑的是关于byte和bit的区别。形象的说,假如某图书馆某书架最多可以放一百本书(假设书只有一种,体积一致,页数一致)我们算的是这一百本书的数量而不是有几页书。编号的时候也是每本书编一个号,而不是每一页都编号。bit就相当于一页,byte就相当于有八页的书。我们分配地址也是以字节为单位编码而不是bit。

回复 支持 反对

使用道具 举报

20#
发表于 2017-11-18 11:14:21 | 只看该作者 来自: LAN 来自 LAN
因为你家PC机是用字节寻址的,就这样。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复