关于指针,地址总线的一些思考。

来源:互联网 发布:mac safari打不开页面 编辑:程序博客网 时间:2024/05/12 12:06

记得以前看到有人说一个进程最大只有4G。这个问题是一个看百度知道上面一个人说的。但是不知道是怎么来的。前些天又看到一个人问void *指针是多大。我告诉他所有C语言指针都是4个字节。群里马上有人反驳,然后就查了一下。发现还真不是。于是问题就产生了,为什么C语言的指针在大部分情况下是4个字节?


首先,2^32等于4G。所以32应当是个突破口。然后我想了想,好象在哪看过,地址总线决定了所有设备的位置。即操作系统通过地址总线,将所有设备看成内存地址来访问。那么对于一个4字节的指针,那么就可以访问全部4G的内容了。到这里我想起,似乎XP最大只支持3.5G的内存空间。貌似很不科学啊?为什么不是完整的4G呢?前面的解释似乎就已经说明了,因为不只是内存,所有的外设也全部都是当作内存地址来寻址的啊。这一点我相信有单片机编程经验的人都了解吧。要是想通过总线来访问设备,必须先得找到设备地址,然后才能在总线上传数据。而且大设备可能还有自己专门的地址空间。刚才还特意搜了一下,有人说是为了支持虚拟存储,但学过操作系统的人就明白,操作系统的虚拟存储系统是通过磁盘来扩充的,与这个根本无关。甚至这个论断的逻辑也有问题,如果按虚拟存储来看,那么内存应该比实际的大才对。


网上还有人说是因为系统是32位的。其实这个答案不够准确,我借同学64位的in7来测试指针的长度也是4个字节。当时我就很怀疑他的电脑是不是64位的系统。。但是在网上查了一下才发现是编译的问题。应该说是由于翻译出来的汇编指令是32位的才对。这些天学了点汇编,可以算是猜想吧,具体的还没有测试。汇编是按位来的,分为16位 32位 64位。于是只要是你生成32位汇编那么你的寻址范围就固定的是4G的大小。64位的系统向下支持32位的汇编指令,于是编译器如果不自己设定的话,那么就自动产生32位的程序了。那么也就说明指针为什么是4个字节的原因了。


昨天找操作系统的老师问为什么进程最大只支持到4G的呢,一开始她还没有弄明白我的意思。所以说还可以支持到8G。。用数据结构来访问。。不过倒是启发了我一下。为什么不能通过标识符将内存地址划分出来呢?每个区域用字各自的指针,那么这样就可以支持更大的内存空间了,想买大内存条的也可以随便买了。不过我很快就打消了这个想法,因为想想组成原理里面的总线结构就明白了。如果增加地址空间,那么只能用多级的总线结构了,必定会导致访存的速度进一步的降低。寻址也变得更加的麻烦,相对来说内存是增大了,但是速度也慢了。根据局部性原理来看的话,可能效果提升并不明显。这样一看就太不划算了。增加了设计的复杂度,还增加了成本,降低了使用效果。


计算机专业的东西联系还真是强啊。看来学好低层知识才能以不变应万变啊!

原创粉丝点击