#include <stdio.h>
// 浅析内存地址如何编码
int main()
{
/*
内存地址编码:
假设现在有一块内存条,具体多大未知,设为xGB大小,CPU要读取其中的1小块数据。
读取的设计原理是这样的:
把这xGB大小的内存条当成一幢楼房。把要读取其中的1小块数据当作房间(称其为最小内存单元),这个最小内存单元规定为1字节。
至于为什么最小内存单元不规定为1bit是因为实在不方便也没必要。就像你去超市买大米,能说我买10粒大米吗?虽然粒确实是大米的最小单位。 都说我买10斤大米,这个斤就认为是买大米的最小单位了。
|-----------------------
|[1字节][1字节]...[1字节]|
|[1字节][1字节]...[1字节]|
|[1字节][1字节]...[1字节]|
|[1字节][1字节]...[1字节]| ->xGB大小的内存条(大楼)
|[1字节][1字节]...[1字节]|
|.... |
|[1字节][1字节]...[1字节]|
|----------------------|
现在我们要给这些1字节的房间编个门牌号码了,这样有利于CPU的读取啊。(若是没有门牌号的话就得从一层循环到顶层来查找了,这谁受得了啊)
[1字节] [1字节] [1字节] [1字节] ... [1字节] [1字节] [1字节] ... [1字节] [1字节] ... [1字节]
0 1 2 3 ... e f 10 ... ff2d ff2e ... ???? -> 这里我们用16进制来代表房间的门牌号码
现在又出现一个问题了,这个门牌号码的个数能是无限大的吗?
xGB大小的内存总共可以有多少个房间呢?我们算一下。
xGB = x*1024MB = x*1024*1024KB = x*1024*1024*1024B
我们的门牌号码个数能够大于或等于这个x*1024*1024*1024数吗?也就是说能为所有的房间都安排一个门牌号码吗?
答案是:不好说啊
说这个之前先得了解【32位操作系统与64位操作系统】的概念。
32位操作系统:指计算机系统中处理器和操作系统使用的32位数据单元,它们能处理32位宽度的数据。
由于地址总线宽度为32位,最大内存寻址能力为4GB(2的32次方),即只能访问或使用不超过4GB的内存。
我们解读一下上面的话【地址总线宽度为32位,最大内存寻址能力为4GB】
【地址总线宽度为32位】为什么【最大内存寻址能力为4GB】呢?
我们看一下32位二进制的变化:
最小值: 00000000 00000000 00000000 00000000
最大值: 11111111 11111111 11111111 11111111 -> 4294967295(转换为10进制)
也就是说【地址总线宽度为32位】代表可以有4294967296个门牌号码啊!
(因为我们是从0开始算的,因此最大值还得加1,即 4294967295+1=4294967296(即2的32次方))
请注意这个4294967296是门牌号码的个数,不是bit啊,一个门牌号码是1字节大小,因此4294967296的单位是B。我们换算一下啊
4294967296B = 4194304KB = 4096MB = 4GB
因此我们就知道了【地址总线宽度为32位,最大内存寻址能力为4GB】的由来了。
现在开始给房间编写门牌号码了
门牌号0: 00000000 00000000 00000000 00000000 -> 0x00000000
门牌号1: 00000000 00000000 00000000 00000001 -> 0x00000001
...
11111111 11111111 11111111 11111110 -> 0xfffffffe -> 4294967294(转换为10进制)
门牌号n: 11111111 11111111 11111111 11111111 -> 0xffffffff -> 4294967295(转换为10进制)
门牌号码分配完毕。
也就是说一句话,你物理内存可以无限大,但我却只能给4294967296个房间发放门牌号码,即我32位操作系统每个CPU指令只支持4GB大小的内存,
多了我也不认,还是去找64位操作系统吧。
64位操作系统:略略
*/
int value = 233;
printf("%p\n", &value);
return 0;
}
浅析内存地址如何编码
于 2023-11-29 15:28:11 首次发布