浅谈虚拟地址空间
浅谈虚拟地址空间
1.由来
为什么会出现虚拟地址空间呢?
对于现在常用的编译软件都在32位的平台下,在之前有16位的平台(8060系统)。
对于16位的平台,它是实模式。进程的地址就是实际的物理地址,如下图所示:
在物理内存当中,每一个程序的地址是连续的,假如我们的A程序中,地址加了偏移走到了另外的一个程序中了,那么我们是不是在A程序中,就改掉了B程序中的数据。在之前的木马病毒,就是如此的工作原理。
除此之外还有如下的几种问题:
1.地址空间不隔离(如上)。
2.内存使用效率低。
3.程序运行的地址不确定。
怎样解决这些问题呢,我们就可以加一个中间层。“计算机科学领域的任何问题都可以通过一个间接的中间层来解决”应用于“程序员的自我修养”这本书,那么我们的这个中间层就是虚拟地址空间。
2.分布
那么我们的虚拟地址空间有多大呢?
虚拟地址空间是受计算机硬件操作平台决定的,也就是CPU的位数决定的。就比如说32位的,那么它的虚拟地址空间地址就是0~2^32-1,也就是4G的虚拟空间大小;64位,那么它的虚拟地址空间地址就是0~2^64-1,也就是17179869184G的虚拟空间大小。在这里我们可以说一下,对于c语言,在32位下指针4个字节,在64位下指针8个字节。
对于32位下,有4G的虚拟地址空间是怎样去分配的呢?
在windows下,内核和用户空间是2:2;
在linux下,内核和用户空间是1:3;
3.思考
这3G的空间“原则上”是可以给进程使用的,但是遗憾的是,有一部分我们要用在其他 的地方。
在window上只有2G的空间,更加的不够用,我们可以根据下面的办法改成3G。
现在的好多程序是大于3G,我们的虚拟地址空间不够是怎样的呢。我们参考“程序员自我修养”这本书。