一个内存概念问题
80386的地址总线宽度为32位 所以内存地址空间为2^32个内存单元 得出的结论是4gb
我有个疑问,内存地址空间大小的计算为 2^地址空间宽度*2^数据总线宽度 我这样理解对么? 内存
[解决办法]
地址空间就是2^地址总线数,后面的没用。4GB指的是在内存单元为1字节的情况下,使用32位的地址总线可以寻址4GB的内存。这里还有个可寻址的问题,可能在大多数CPU上,可寻址的最小单元都是字节,而地址总线就是用来标识这些可寻址的单元的。某些单片机上可以按位寻址,不说这个了,我也不怎么明白。一般汇编语言的教材都会讲这个。
给你举几个例子:
(下面这段并不是代码,使用代码的形式只是为了能够使用等宽字体,如果直接弄的话格式就乱了)
假设某个CPU只有两位地址总线,那么它的地址空间是4。
如果这个CPU能够寻址的最小单元是字节,那么它可以寻址的内存的大小是4 Byte,这样:
(假如内存里面全是二进制的1)
地址: 0 1 2 3
内容: 11111111 11111111 11111111 11111111
如果这个CPU能够寻址的最小单元是一个4位的单元,那么它可以寻址的内存大小是2 Byte,这样:
(假如内存里面全是二进制的1)
地址: 0 1 2 3
内容: 1111 1111 1111 1111
需要注意的是Byte这个单位在任何时候都表示8位。
另外CPU一次不是只能读取1个字节或者4位。以一般的台式机的CPU为例,
它至少可以一次读写1个字节,2个字节,4个字节或者8个字节(64位CPU),
其他的我就不知道了。举几个例子:
假设某个CPU只有两位地址总线,能够寻址的单元有1字节和2字节。
地址: 0 1 2 3
内容: 11111111 11111111 11111111 11111111
假如我要读取地址为1的那个字节的数据,我可以使用特定的指令来完成这个操作。
假如我要读取地址为2的两个字(就是2个字节)的数据,
我可以使用另外不同的指令来完成这个操作。
指令的格式你没要必要了解,除非你非常像了解这个或者你就是研究这个的。
如果用汇编语言里表示的话,两个操作可以分别用类似这种方法来实现:
mov al,[1]
mov ax,[2]
如果用C++语言来表示的话,是类似这样的:
char a;
word b;C++里其实没有这个类型,假设这个类型占两个字节的空间。
cout << a;
cout << b;
我举的这两个汇编语言和C++语言的例子相当操蛋,不是特别精确,你看看就行了,别往心里去。
最后,我不是专家,我的大部分编程知识都是自学的,错误和疏漏在所难免。请批判地接受我上面写的东西。
[解决办法]
地址空间,和Cpu 硬件实现方式有关。
有些Cpu 地址空间是分开的,这种称为哈佛结构。
有些是一体的,这种好像叫冯.诺曼结构。
intel 80X86 及兼容Cpu 地址空间 是一体的,而且单位是字节--8位。
有些CPU虽然和80X86一样是一体的,不过地址单元,是字,双字--16位或者32位。虽然386 以后Cpu 地址位宽不再是字节了--可以同时读写8,16 各字节等等---,由于每个字节还是对应一个地址单元,所以
还是 8位,作为一个地址单位计算。
80X86 至少386以后
低位地址线,不在是一根线,而是分成不同Bank (体),每个 Bank (体),可以单独选中读写。
如果是64Bit 带宽,那么就有8个体 每个体一根线要8根,如果单用地址线只要3根线。
由于这种原因,如果用地址线来估算,可用内存大小,那也就是地址线 N根2^N,Bank选择线8根(带宽??) 那就是 8×2^N
不过实际上很多Cpu 早期的Cpu 没有 32 根地址线
后来的有36根甚至更多。
由于采用虚拟内存模式,地址线不够也可以达到32位内存。
4G的限制,和Cpu 关系不大,和Bios,操作系统有关系。
主要是32Bits CPU 实际是段页式内存管理,而操作系统只利用flat 一种模式,分段管理没有使用或者隐性使用,用32 位表示地址空间---所以,所有Windows 程序的代码,都没有段什么事。
这样内存最大就是4G了,更多地址由于32位表达不了;
再多内存,这些多余的地址线,也是没有用的。
所以,只好使用64Bits 系统,才能使用4G以上内存。
PS:
32 位 Windows flat模式,实际对应16 位 Dos tiny 模式,都是不用分段的。