为什么32位机器最大只能用到4GB内存

在此之前先来了解一些计算机存储单位之间的关系以及计算机系统结构和PC硬件方面的一些知识。

一、计算机存储单位之间的关系

位 bit (Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。

字节 byte:8个二进制位为一个字节(B),即1B = 8bit,最常用的单位。

计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是:

1KB (Kilobyte?) ? ? ??=2^12B?=1024B

1MB (Megabyte?) ??=2^12KB?=1024KB

1GB (Gigabyte?)?=2^12MB?=1024MB

1TB (Trillionbyte)?=2^12GB?=1024GB

1PB(Petabyte )?=2^12TB?=1024TB

1EB(Exabyte )?=2^12PB?=1024PB

1ZB (Zettabyte?)?=2^12EB?=?1024 EB

1YB (Yottabyte?)?=?2^12ZB?=1024 ZB

1BB (Brontobyte )?=?2^12YB?=1024 YB

?

二、计算机系统总线结构和主板的构成

说起总线大家肯定不陌生,而且大家平时肯定跟它打过交道,我们在用U盘拷贝数据的时候先要把U盘通过USB接口与电脑相连才能拷贝。USB接口实际上就是一种总线,一般称这种总线为USB总线(也叫做通用串行总线)。在很久之前是没有USB总线的,那个时候每个外设各自采用自己的接口标准,举个最简单的例子:鼠标生产厂商采用鼠标特有的接口,键盘生产厂商用键盘特有的接口,这样一来的话,PC机上就必须提供很多接口,这样一来增加了硬件设计难度和成本,直到后来USB接口的出现,它统一了很多外设接口的标准,不仅使得用户可以很方便地连接一些外设,更增强了PC的可扩展性。所以现在大家看到的鼠标、键盘、U盘、打印机等等这些外设都可以直接通过USB接口直接插到电脑上的。

在计算机系统中总线是非常重要的一个概念,正是因为有了总线,所有的组成部件才能一起正常协同分工合作。在很久以前的PC机中,采用的是三总线结构,即:数据总线、地址总线、控制总线。它们分别用来传输不同类型的数据,数据总线用来传输数据,地址总线用来传输地址,控制总线用来传输一些控制信号。下面这幅图很清楚地展示了三总线结构:

随着时代的发展,这种简单的总线结构逐渐被淘汰。下面这幅图是现代计算采用的结构:

事实上这也是现代主板所采用的结构,当然可能部分地方有略微不同(大体结构是差不多的),仔细观察过主板构成的朋友可能对上面一幅图很熟悉。在主板上主要有两大主要部分:北桥(North Bridge也称Host Bridge)和南桥(South Bridge)。北桥主要负责CPU和内存、显卡这些部件的数据传送,而南桥主要负责I/O设备、外部存储设备以及BIOS之间的通信。现在有些主板已经没有北桥了,因为芯片厂商已经把北桥所负责的功能直接集成到CPU中了(不过暂且我们以上副图的模型来讨论)。

在上副图中,我没有画出
数据总线和地址总线等,因为在某些总线标准中它们被集成到一起了,比如在PCI总线中,地址总线和数据总线总是分时复用的(也就是说假如PCI总线有32位数据总线,这32位总线在某个时刻可以充当数据总线的作用,在下一时刻可以充当地址总线的作用)。有的总线同时提供了数据总线和地址总线。

下面来说一下几个主要总线和南北桥的作用:

FSB总线:即前端总线(Front Side Bus),CPU和北桥之间的桥梁,CPU和北桥传递的所有数据必须经过FSB总线,可以这么说FSB总线的频率直接影响到CPU访问内存的速度。

北桥:北桥是CPU和内存、显卡等部件进行数据交换的唯一桥梁,也就是说CPU想和其他任何部分通信必须经过北桥。北桥芯片中通常集成的还有内存控制器等,用来控制与内存的通信。现在的主板上已经看不到北桥了,它的功能已经被集成到CPU当中了。

PCI总线:PCI总线是一种高性能局部总线,其不受CPU限制,构成了CPU和外设之间的高速通道。比如现在的显卡一般都是用的PCI插槽,PCI总线传输速度快,能够很好地让显卡和CPU进行数据交换。

南桥:主要负责I/O设备之间的通信,CPU要想访问外设必须经过南桥芯片。

在了解了这些基础东西之后,下面来讲解一下为何32位系统最大只支持4GB内存。

三、来由

在使用计算机时,其最大支持的内存是由 ?操作系统

硬件
两方面决定的。

先说一下硬件方面的因素,在上面已经提到了地址总线,在计算机中 CPU的地址总线数目
决定了CPU 的
寻址
范围,这种由地址总线对应的地址称作为物理地址。假如CPU有32根地址总线(一般情况下32位的CPU的地址总线是32位,也有部分32位的CPU地址总线是36位的,比如用做服务器的CPU),那么提供的可寻址物理地址范围
为 232=4GB(在这里要注意一点,我们平常所说的32位CPU和64位CPU指的是CPU一次能够处理的数据宽度,即位宽,不是地址总线的数目)。自从64位CPU出现之后,一次便能够处理64位的数据了,其地址总线一般采用的是36位或者40位(即CPU能够寻址的物理地址空间为64GB或者1T)。在CPU访问其它任何部件的时候,都需要一个地址,就像一个快递员送快递,没有地址他是不知道往哪里送达的,举个例子,CPU想从显存单元读取数据,必须知道要读取的显存单元的实际物理地址才能实现读取操作,同样地,从内存条上的内存单元读取数据也需要知道内存单元的物理地址。换句话说,CPU访问任何存储单元必须知道其物理地址。

用户在使用计算机时能够访问的最大内存不单是由CPU地址总线的位数决定的,还需要考虑操作系统的实现。实际上用户在使用计算机时,进程所访问到的地址是逻辑地址,并不是真实的物理地址,这个逻辑地址是操作系统提供的,CPU在执行指令时需要先将指令的逻辑地址变换为物理地址才能对相应的存储单元进行数据的读取或者写入(注意逻辑地址和物理地址是一一对应的)。

对于32位的windows操作系统,其逻辑地址编码采用的地址位数是32位的,那么操作系统所提供的逻辑地址寻址范围是4GB,而在intel x86架构下,采用的是内存映射技术(Memory-Mapped I/O, MMIO),也就说将4GB逻辑地址中一部分要划分出来与BIOS ROM、CPU寄存器、I/O设备这些部件的物理地址进行映射,那么逻辑地址中能够与内存条的物理地址进行映射的空间肯定没有4GB了,看下面这幅图就明白了:

所以当我们装了32位的windows操作系统,即使我们买了4GB的内存条,实际上能被操作系统访问到的肯定小于4GB,一般情况是3.2GB左右。假如说地址总线位数没有32位,比如说是20位,那么CPU能够寻址到1MB的物理地址空间,此时操作系统即使能支持4GB的逻辑地址空间并且假设内存条是4GB的,能够被用户访问到的空间不会大于1MB(当然此处不考虑虚拟内存技术),所以用户能够访问到的最大内存空间是由硬件和操作系统两者共同决定的,两者都有制约关系。

对于64位的操作系统,其逻辑地址编码采用的地址位数是40位,能够最大支持1T的逻辑地址空间。考虑一种情况,假如CPU是64位的,地址总线位数是40位,操作系统也是64位的,逻辑地址编码采用的地址位数也是40位,内存条大小是64GB,那么是不是内存条的64GB全部都能被利用了呢?答案是不一定,因为这里面还要考虑一个因素就是内存控制器,内存控制器位于北桥之内(现在基本都是放在CPU里面了),内存控制器的实际连接内存的地址线决定了可以支持的内存容量,也就是说内存控制器与内存槽实际连接的地址线如果没有40位的话,是无法完全利用64GB的内存条的存储空间的。当然对于内存控制器这个问题几乎可以不用考虑,因为现在大多数的内存控制器至少都采用的是40位地址总线。

原文地址:https://www.cnblogs.com/Chary/p/9319767.html

时间: 2024-10-24 22:09:30

为什么32位机器最大只能用到4GB内存的相关文章

4GB的内存条在32位系统中只能显示为3GB左右的原因(转)

原帖地址:http://bbs.51cto.com/viewthread.php?tid=875012&extra=&page=1 1. 4GB的内存条在32位系统中只能显示为3GB左右的原因 第一个原因只会“吃掉”您一小部分的内存 众所周知,电脑中二进制中的换算关系是 1GB=1024MB,实际生产时,硬件厂商厂商的换算单位是1GB=1000MB,当电脑厂商告诉您,您电脑中的内存是1GB的时候,其实您的内存是1000MB,系统识别时,用1000处以1024,也就显示您的内存是0.976G

让32位linux/Centos系统支持4G以上内存

让32位的Centos系统支持4G以上内存,刚开始的时候有人说用64位的系统不都解决了吗?其实32位系统和64位系统各有各的用处.下面使用Centos-5.5-32位演示 一.系统环境: VMware虚拟机 系统:Centos-5.5  32位 内存:4G 32位系统没有破除限制,系统只能识别都3G的内存 # free -m # uname -a  //原始内核 Linux localhost 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i

32 位机器下关于堆栈工作机制的简单分析

周松  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这篇博客是对<Linux 内核分析>这门课程的作业. 这是 C 语言代码: int g(int x) { return x + 3; } int f(int x) { return g(x); } int main(void) { return f(8) + 1; } 去除链接信息后的 32 位 AT&T 格式

32位arm的写存操作,没有内存对齐的赋值

用32位arm7芯片lpc2129和keil编译器,在项目开发中遇到的问题如下: 定义字节数组 : BYTE array[10] = {0}; 然后把地址&array[1]强制转换并赋值: *(UINT16 *)(&array[1]) = 0xaabb; 然后读取数组里的内容,发现被赋值的元素是array[0]和array[1],读出的内容是: array[0]的内容是0xbb, array[1]的内容是0xaa,array[2]-array[9]都是0. 甚是不解.难道被赋值的不应该是a

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g

InnoDB Spin rounds per wait在&gt;32位机器上可能为负

今天发现一个系统innodb的spin rounds per wait为负,感觉很奇怪,原来是个bug: For example (output from PS but we have no patches here), ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 19811539060 OS WAIT ARRAY INFO: signal count 8333711487 Mutex spin w

Win7系统32位和64位有什么区别?

32位与64位系统的区别与联系,已经是一个老生常谈的问题了,下面我深入的给同学们介绍下Win7系统32位和64位的区别与联系,大家不太懂的地方可以问度娘.另外还有一部分朋友会问XP或者Win8系统32位与64位的区别,其实跟Win7都是一样的. Win7系统32位和64位的区别 对于目前来说,绝大多数软件以32位开发为主,当然也开始有越来越多应用采用64位设计,对于一般用户而言,不管是32位还是64位系统,其实使用上差别基本感受不到,因此一般我们无需纠结于到底是选择32位还是64位Win7系统.

Win7系统32位和64位的区别

Win7系统32位和64位的区别已经是一个老话题了,可是还是有很多朋友不明白.这两者到底有什么区别呢?下面本文与大家通俗的介绍下Win7系统32位和64位的区别,其他一些深入的理论讲述,大家可以看看文章结尾的扩展链接.值得一提的是,另外还有一部分朋友会问XP或者Win8系统32位与64位的区别,其实跟Win7都是一样的.Win7系统32位和64位的区别     对于目前来说,绝大多数软件以32位开发为主,当然也开始有越来越多应用采用64位设计,对于一般用户而言,不管是32位还是64位系统,其实使

查看linux机器是32位还是64位的方法

file /sbin/init 或者 file /bin/ls/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 如果显示 64-bit 则为64位: file /sbin/init/sbin/init: ELF 32-bit LSB executable, Intel 80386