(以下答案假定为“现代”台式机,服务器或高端嵌入式平台(例如智能手机以及越来越多的小型系统)。对于x86系统,modern表示386及更高版本。以下答案还假定为“现代”操作系统,例如几乎所有的Unix或95以后的Windows。)
这不是在OS中发生,而是在处理器中发生,特别是在MMU(内存管理单元)中。MMU支持虚拟寻址,构成指针的位不直接指示内存中位的物理位置。
在典型的MMU中,当指针被取消引用时,MMU将这些位分解为两组:高位组成页号,低位组成页内的地址。大多数台式机和服务器计算机使用4kB页面。MMU在称为TLB的表中查找虚拟页码(这就是您所说的“进程内存映射”)。TLB指示与该虚拟页面相对应的物理页面的编号。然后,MMU从内存中的物理页面获取数据。
如果TLB不包含该特定虚拟页码的条目,则MMU通知处理器发生了无效的访问;否则,MMU会通知处理器。这通常称为异常。
请注意,到目前为止,我还没有提到操作系统。这是因为所有这些操作都独立于操作系统。操作系统之所以起作用,是因为它以两种方式配置事物:
操作系统负责切换任务。当您怀疑这样做时,它将保存当前的TLB,并用保存的TLB替换下一个计划任务。这样,每个进程都有一个TLB,因此0x123456
进程X中的地址可能不指向RAM中与进程Y中相同地址的相同实际位置,或者可能只是无效。如果一个进程试图在其地址空间之外取消对指针的引用,则它不会到达另一个进程的空间,而是到达无处。
操作系统决定引发异常时发生的情况。它可以终止进行无效内存访问的过程(分段错误,常规保护错误等)。这也是实现交换的方式:异常处理程序可能会决定从交换空间中获取一些数据,相应地更新TLB并再次执行访问。
请注意,MMU提供安全性,因为进程无法更改其自己的TLB。仅操作系统内核可以更改TLB。TLB更改权限的工作方式超出了此答案的范围。