一个32位处理器和1GB内存可以获得多少个内存地址?


12

一个32位处理器和1GB内存可以获得多少个内存地址,而一个64位处理器可以得到多少个内存地址?

我认为是这样的:

1GB的RAM除以32位还是除以4?获得多少个内存地址?

但是我不确定。这就是为什么我问。

我在维基百科上说,1个内存地址是32位宽或4个八位位组(1个八位字节= 8位),而64位处理器是1个内存地址或1个整数是64位宽或8个八位位组。但是也不知道我是否正确理解了。


几乎所有现代系统都是按字节寻址的,这意味着32位可以寻址约4 GB(如果安装了那么多的RAM)。从历史上看,存在字寻址方案,其中“字”是12位,15位,16位,17位,24位,32位,36位或48位,并且可能还有其他一些位,另外还有寻址4位或6位的十进制机器。单元。但也要记住,大多数现代系统都使用虚拟内存,这意味着处理器可以处理比已安装的内存更多的内存。
Daniel R Hicks

@DanielRHicks虚拟内存不会影响可以寻址多少RAM。
Jamie Hanrahan

@JamieHanrahan-为了使虚拟内存工作,必须有某种跨越虚拟地址范围(单个进程)的寻址机制。这可以通过软件仿真来完成,但是效率很低,因此在大多数系统中,处理器的寻址范围要足够大以合并进程的最大地址空间。
Daniel R Hicks

@DanielRHicks当然可以,但这不会影响可以寻址多少RAM。RAM是物理内存,而不是虚拟内存。虚拟地址不是RAM地址,虚拟内存不是RAM。
Jamie Hanrahan

@JamieHanrahan-你没有任何意义。如果您无法在虚拟地址空间中寻址RAM页面,则该RAM将无用。(我非常了解虚拟内存的工作原理,自1972
Daniel R Hicks,

Answers:


38

简短答案:可用地址的数量等于以下较小者:

  • 内存大小(以字节为单位)
  • 可以保存在CPU机器字中的最大无符号整数

以上内容的详细答案和解释:

内存由字节(B)组成。每个字节由8位(b)组成。

1 B = 8 b

1 GB的RAM实际上是1 GiB(千兆字节,不是千兆字节)。区别在于:

1 GB  = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B

无论CPU机器字有多大,内存的每个字节都有其自己的地址。例如。Intel 8086 CPU是16位的,它按字节寻址内存,现代的32位和64位CPU也是。这就是第一个限制的原因-您的地址不能超过内存字节。

内存地址只是CPU从内存开头跳到要查找的字节数。

  • 要访问第一个字节,必须跳过0个字节,因此第一个字节的地址为0。
  • 要访问第二个字节,它必须跳过1个字节,因此其地址为1。
  • (依此类推...)
  • 要访问最后一个字节,CPU会跳过1073741823字节,因此其地址为1073741823。

现在,您必须知道32位的实际含义。如前所述,它是一个机器字的大小。

机器字是CPU用于保存数字(在RAM,高速缓存或内部寄存器中)的内存量。32位CPU使用32位(4字节)保存数字。内存地址也是数字,因此在32位CPU上,内存地址由32位组成。

现在考虑一下:如果有一位,则可以在其上保存两个值:0或1。再增加一位,则有四个值:0、1、2、3。在三个位上,可以保存八个值:0,1,2 ... 6,7,7.这实际上是一个二进制系统,它的工作方式如下:

Decimal Binary
0       0000
1       0001
2       0010
3       0011
4       0100
5       0101
6       0110
7       0111
8       1000
9       1001
10      1010
11      1011
12      1100
13      1101
14      1110
15      1111

它的工作原理与通常的加法完全相同,但最大位数为1,而不是9。十进制为0 0000,则将其加1并得到0001,再加一次,则得到0010。这里发生的情况就像是十进制09加一个:将9更改为0,然后递增下一位。

从上面的示例中,您可以看到始终有一个最大值,可以保留位数不变的数字-因为当所有位数均为1并尝试将值增加1时,所有位数都会变为0,从而破坏数。这称为整数溢出,会给用户和开发人员造成许多不愉快的问题。

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • 1位的最大值是1
  • 2位-3,
  • 3位-7
  • 4位-15

可能的最大数目始终为2 ^ N-1,其中N为位数。如前所述,内存地址是一个数字,并且也有一个最大值。因此,机器字的大小也限制了可用内存地址的数量-有时您的CPU无法处理足够大的数字以寻址更多的内存。

因此,在32位上,您可以保留0到2 ^ 32-1之间的数字,即4 294 967295。它比1 GB RAM中的最大地址还多,因此在特定情况下,RAM的数量将成为限制因素。

理论上,32位CPU的RAM限制为4 GB(2 ^ 32),而对于64位CPU,则为16 EB(艾字节,1 EB = 2 ^ 30 GB)。换句话说,64位CPU可以访问整个Internet ... 200倍;)(由WolframAlpha估计)。

但是,在实际的操作系统中,32位CPU可以寻址大约3 GiB的RAM。那是因为操作系统的内部体系结构-一些地址保留用于其他目的。您可以在Wikipedia上了解有关此所谓的3 GB障碍的更多信息。您可以使用“ 物理地址扩展”取消此限制。


说到内存寻址,我应该提到的东西很少:虚拟内存分段分页

虚拟内存

正如@Daniel R Hicks在另一个答案中指出的那样,操作系统使用虚拟内存。这意味着应用程序实际上不是在实际的内存地址上运行,而是由OS提供的地址。

此技术允许操作系统将某些数据从RAM移到所谓的Pagefile(Windows)或Swap(* NIX)中。HDD比RAM慢几个数量级,但是对于很少访问的数据来说,这并不是一个严重的问题,它使OS为应用程序提供的RAM比实际安装的更多。

分页

到目前为止,我们所说的是平面寻址方案。

分页是一种替代性的寻址方案,它允许寻址更多的内存,这通常是在平面模型中使用一个机器字即可实现的。

想象一下,一本书充满了四个字母的单词。假设每页上有1024个数字。要寻址数字,您必须知道两件事:

  • 打印该单词的页数。
  • 该页面上的哪个单词是您要查找的单词。

现在,这正是现代x86 CPU处理内存的方式。它分为4 KiB页(每页1024个机器字),并且这些页都有数字。(实际上,页面也可以是4 MiB或2 PA具有PAE)。当您要寻址存储单元时,需要该页中的页码和地址。请注意,每个存储单元仅由一对数字引用,分段不会如此。

分割

好吧,这与分页非常相似。仅举一个例子,它用于Intel 8086。地址组现在称为内存段,而不是页面。不同之处在于,细分可以重叠,而且确实重叠很多。例如,在8086上,大多数存储单元可从4096个不同的段中获得。


一个例子:

假设我们有8个字节的内存,除第4个字节等于255外,其他所有字节均为零。

平面内存模型的插图:

 _____
|  0  |
|  0  |
|  0  |
| 255 |
|  0  |
|  0  |
|  0  |
|  0  |
 -----

具有4字节页面的页面内存的插图

 PAGE0
 _____
|  0  |
|  0  |
|  0  |  PAGE1
| 255 |  _____
 -----  |  0  |
        |  0  |
        |  0  |
        |  0  |
         -----

4字节段移位1的分段存储器的示意图

 SEG 0
 _____   SEG 1
|  0  |  _____   SEG 2
|  0  | |  0  |  _____   SEG 3
|  0  | |  0  | |  0  |  _____   SEG 4
| 255 | | 255 | | 255 | | 255 |  _____   SEG 5
 -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 6
         -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 7
                 -----  |  0  | |  0  | |  0  | |  0  |  _____
                         -----  |  0  | |  0  | |  0  | |  0  |
                                 -----   -----   -----   -----

如您所见,可以通过四种方式寻址第4个字节:(从0开始寻址)

  • 段0,偏移3
  • 第1段,偏移2
  • 第2段,偏移1
  • 段3,偏移量0

它总是相同的存储单元。

在实际的实现中,段的偏移量超过1个字节(对于8086,它为16个字节)。

分段的不好之处在于它很复杂(但是我想您已经知道了;)好是,您可以使用一些聪明的技术来创建模块化程序。

例如,您可以将某个模块加载到一个段中,然后假装该段小于其实际大小(恰好可以容纳该模块),然后选择与该伪较小段不重叠的第一个段并加载下一个模块, 等等。基本上,您通过这种方式获得的页面是可变大小的页面。


1
操作系统可以为用户进程提供完整的4GiB虚拟地址空间(对于x86,可能减去一个页面-4KiB),但是由于必须更改地址空间,因此它会使系统调用变得更加昂贵。使用PAE和类似的机制,尽管地址仍限制为32位,但是可以增加系统可寻址的物理内存量。
保罗·克莱顿

这不是我要搜索的内容,但是无论如何它都是很好的信息!感谢您对最高 二进制和十进制表比较的位数(1 =最大值,如二进制9中的最大值)。确实是考虑这一点的好方法。我学到新东西。:) 谢谢!
johan smohan 2013年

这个Gibi和Giga太令人困惑了...因为在某些站点上我读到内存是用Gibi测量的,而在另一些站点上它是在Giga中测量的。
johan smohan 2013年

维基百科上有一篇关于二进制前缀的文章,包括一些历史背景。大多数与硬件相关的数字都使用十进制前缀,最著名的例外可能是RAM,甚至可能是色标-例如。具有1600万色的LCD具有三个8位色通道(2 ^ 24)。直接回答您的问题:在这种情况下,可用地址数等于内存字节数,因为RAM是按字节寻址的。32位CPU最多可以处理2 ^ 32 B,64位1-2 ^ 64。
gronostaj

谢谢!我需要这用于学校考试。:)我认为我现在了解最多。唯一令我困扰的是,如果它是32位处理器而不是32byte,为什么要2 ^ 32 B?
johan smohan 2013年

3

除上述内容外,请注意,还使用了虚拟寻址以及多个地址空间。因此,即使您只有1GB的RAM,程序在概念上也可以使用多达4GB的虚拟内存(尽管大多数操作系统会将其限制为小于此值)。从概念上讲,您可以拥有(几乎)无限数量的4GB地址空间。

RAM的大小不会(最大程度上)限制程序的最大大小或可以运行的程序数量,而是会限制性能。当实际内存变为“过量使用”,并且系统在RAM与磁盘之间来回“交换”内存的“页面”时,系统开始“崩溃”,性能急剧下降。


2

1GB的RAM将占用1024 * 1024 * 1024字节或1,073,741,824字节。

32位处理器始终具有4 * 1024 * 1024 * 1024字节,或4,294,967,296字节的地址空间 。1 GB的RAM出现在此空间中。在Intel处理器上,一些中断向量需要在地址0处出现,因此物理RAM从地址0开始并上升。

其他内容也会出现在该地址空间中,例如BIOS和选件ROM(在前1Mbyte中为高384Kbyte),I / O设备(如APIC)和视频RAM。我还不完全了解的系统管理模式“ SMRAM”还会发生一些奇怪的事情。

从内核的角度来看,这是物理地址空间。MMU可以以任何方式将所有这些重新排列到用户空间进程。


我在维基百科上说,1个内存地址是32位宽或4个八位位组(1个八位字节= 8位),而64位处理器是1个内存地址或1个整数是64位宽或8个八位位组。您对4 * 1024 * 1024 * 1024字节的地址空间是正确的,但是我正在搜索内存地址空间,我认为这是1GB / 32bits,但是我仍然不知道我是否正确。:) 谢谢您的回答!
johan smohan 2013年

Np。英特尔CPU有两个地址空间:“内存”和“ I / O”。RAM以外的其他内容将出现在“内存”空间中。I / O设备或ROM等其他内容可能位于RAM所不占用的位置。通常,只有I / O设备出现在I / O地址空间中。
LawrenceC

@johansmohan您的电话号码和劳伦斯的答案都不正确。处理器的“位宽”与它可以使用的RAM地址的宽度之间没有固定的关系。仅32位的x86处理器可以寻址64 GB的RAM。x64处理器的起始地址为40位物理地址空间,而现在为52位。至于虚拟地址空间,也可以有所不同。在x64上,尽管虚拟地址确实需要存储64位,但是对于256 TiB的VAS,仅实现了48位,而不是您期望的64位的16 EiB。
Jamie Hanrahan

0

32位处理器最多可寻址2 ^ 32个单独的内存字节(约4GB),但是拥有1GB的内存将使1 * 1024 * 1024 * 1024可寻址的字节内存(尽管您可能仍具有2 ^ 32的虚拟地址空间) )。一个64位的CPU可以寻址2 ^ 64个单独的字节,但是我认为大多数系统只使用48位作为内存地址的上限。可寻址字节2 ^ 48。


您的意思是1024 * 1024 * 1024,而不是1 * 1024 * 1024,对吧?
johan smohan 2013年

一个32位处理器最多可以寻址2 ^ 32个八位位组或位?只是检查,因为我必须肯定知道。
johan smohan 2013年

@johan smohan正确,应该是1 * 1024 * 1024 * 1024
AcId

@johan smohan一个32位处理器最多可以寻址2 ^ 32个字节,其中一个字节为8位(一个八位字节的位)
AcId 2013年

0

接受的答案给出了很好的解释。但是我不认为这是答案。它不包含有关地址总线的任何内容。而其大小实际上是内存受限的主要原因。例如8080是8位处理器(其数据总线的大小是8位),但是它具有16位地址总线。它可以寻址2 ^ 16 =(2 ^ 6)*(2 ^ 10)= 64 * 1024字节= 64KB。

您可以在“技术历史记录”部分中找到更多信息(32位)


我同意。请注意,后来的16位PDP-11型号具有22位地址总线(因此可以寻址4 MB RAM),HP 1000MX(也是“ 16位”)最终达到16 MB RAM(24位地址);VAX是一个32位CPU,但具有30位物理地址空间,但一半保留给I / O空间,RAM限制为512 MB;“ 16位” 8086,1 MB;“ 16位” 80286,16 MB;当Pentium Pro引入PAE时,32位x86可以寻址高达64 GB的RAM(24位物理地址空间,尽管低三位实际上从未使它脱离CPU)。
Jamie Hanrahan

-2

我相信最基本的信息在这次对话中丢失了,所以这是我的答案:

说“这是一个32位处理器”意味着cpu一次可以理解和使用的指令大小或命令大小是32位。与64位处理器类似:它们最多可以处理64位指令。

可以将其想像成一台旧的机械计算器:您只有这么多的数字,因此根本无法输入更多的数字。

现在,CPU可以使用的地址也必须适合相同的空间,因此对于32位处理器,其使用的地址最多也只能是32位。因此,从这里我们可以简单地计算最大地址数(即,CPU可以使用的最大RAM数量):

2 ^ 32 = 4294967296(= 4 GB)

要么

2 ^ 64 = 18446744073709551616(=更多;)

或者,作为一个有趣的例子,我的旧Commodore 64具有16位CPU,因此它能够管理以下内存:

2 ^ 16 = 65536字节(= 64 KB)

这是基本逻辑,但是,如前所述,有很多方法可以解决此限制,例如虚拟地址空间,内存映射等。


2
32位和64位处理器之间的显着区别是地址范围(这对虚拟地址空间的影响比“真实”影响更大)。处理器使用了许多技巧,因此在许多情况下很难说出实际的数据路径宽度是多少。指令长度在很大程度上与处理器的“宽度”无关。
Daniel R Hicks,

这种解释是完全正确的。假设您说“处理器宽度”时并非表示芯片的实际尺寸(以厘米为单位),那么在这种情况下您可以说与芯片无关的大小是正确的,您会误以为物理内存寻址是内存映射技术/虚拟地址空间。此外,您所说的与内核实现更相关,您可能需要检查PAE linux内核。
2014年

2
指令的长度与现代系统中处理器的“宽度”完全没有关系。最相关的值是寄存器的宽度(尽管这可能是欺骗性的),处理器和内存之间的传输路径的宽度以及内存地址的位大小。但是这三个值可以很容易地彼此不同。
Daniel R Hicks

1
@DanielRHicks Daniel Hicks是正确的。CPU的“位宽”不一定与“指令大小或命令大小”有关。已经以这种方式构建了CPU,但是今天的商用处理器(x86 / x64)不在其中。
Jamie Hanrahan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.