关于指针,地址总线的一些思考。
来源:互联网 发布: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。。用数据结构来访问。。不过倒是启发了我一下。为什么不能通过标识符将内存地址划分出来呢?每个区域用字各自的指针,那么这样就可以支持更大的内存空间了,想买大内存条的也可以随便买了。不过我很快就打消了这个想法,因为想想组成原理里面的总线结构就明白了。如果增加地址空间,那么只能用多级的总线结构了,必定会导致访存的速度进一步的降低。寻址也变得更加的麻烦,相对来说内存是增大了,但是速度也慢了。根据局部性原理来看的话,可能效果提升并不明显。这样一看就太不划算了。增加了设计的复杂度,还增加了成本,降低了使用效果。
计算机专业的东西联系还真是强啊。看来学好低层知识才能以不变应万变啊!
- 关于指针,地址总线的一些思考。
- 关于C语言的指针传递地址的一些思考
- 关于指针和数组的一些思考
- 关于指针初始化的一些思考
- 地址的一些思考
- 关于企业内部系统访问地址的一些思考
- 关于指针的思考
- 关于c++中一些指针问题的思考
- C++学习之关于指针的一些思考
- 关于二维数组地址与指针的一些注意点
- 关于空指针的思考
- 关于指针的一点思考
- 关于this指针的思考
- 关于I2C总线好的文章地址
- 关于 sizeof() 的一些思考
- 关于sizeof()的一些思考
- 关于useBean的一些思考
- 关于素质的一些思考
- 如何创建XML文件并获取其中某一节点值
- jquery插件(二):Infinite Scroll–无限分页
- Struts2 ----图片验证码
- Myeclise10.0:org.apache.jasper.JasperException
- undefined和null
- 关于指针,地址总线的一些思考。
- 将16进制颜色转换成RGB值
- jquery插件(三):Colorbox–内容播放插件
- 20131017下阶段工作计划
- leetcode Reverse Linked List II
- HDU2553-N皇后问题(DFS)
- [设计模式笔记]三. 行为型模式--19. Mediator模式(中介者)对象行为型模式(一)
- error C2664: “fopen”: 不能将参数 1 从“const char [ ]”转换为“const wchar_t
- rmmod出错(/lib/modules): No such file or directory