引入
PCB中有 内存指针, 其描述了当前进程中有哪些内存,但是指向并非是内存条上的内存,而是一个虚拟内存
虚拟地址空间
虚拟地址空间是程序中所获取到的内存地址,并非是真实的物理内存的地址,而是经过了 一层抽象,虚拟出来的地址,我们所学过的C语言指针指向的就是虚拟的内存地址.
虚拟地址空间主要就是为了避免进程之间相互产生影响
但是内存也是真是存在的东西
内存(实物)
(图片来源于网络)
· 内存(物理上是个内存条)可以存很多数据
· 内存可以想象成一个直行大走廊,走廊很长,并且走廊遍布小房间,每个房间的规格(大小)是1Byte, 每个房间的编号,也就是内存条的地址
·内存的随机访问
内存有个很特殊的特性-----随机访问
访问内存上的任意地址的数据,数据都极快,时间上都差不多.正是这个特点,造就了数组取下标操作是O(1)
为什么指针不能指向实际内存的位置
接下来我们回到虚拟地址空间,那为什么指针不能指向实际内存的位置呢?
我们举个例子:
有两个进程分别在内存上使用0x1000-0x1FFF和0x8000-0x8FFF的地址范围, 比如现在在操作进程一,在修改进程一的代码,但是如果当进程一的代码出现bug,指针跳出进程一的地址范围,进入进程的地址范围,就会改掉进程二的代码,从而导致进程二崩溃.
所以需要针对进程使用的内存空间进行"隔离",从而引入了虚拟地址空间
虚拟地址空间原理
代码里不在直接使用真实的物理地址,而是使用虚拟的地址,由操作系统和专门的硬件设备(MMU)负责进行虚拟地址到物理地址的转换
一旦进程访问越界了,指针地址成了0x3000,操作系统内核(MMU)发现当前这里的地址超出进程1的范围了,此时就直接会向进程反馈一个错误(具体来说就是发送一个"SIGN SEGEMENT FAULT"信号,引起进程崩溃), 那么哪个进程出bug,哪个进程崩溃,其他进程不受影响