内存地址什么时候分配?

Jam*_*mes 5 memory operating-system memory-management virtual-memory

考虑以下 CPU 指令,该指令获取地址 16777386(十进制)处的内存并将其存储在寄存器 1 中:

Move &0x010000AA, R1

传统上,程序在编译时被翻译为汇编(机器代码)。(让我们忽略更复杂的现代系统,例如抖动)。

但是,如果这个地址分配是在编译时静态完成的,操作系统如何确保两个进程不使用相同的内存?(例如,如果您同时运行相同的编译程序两次)。

问题:

程序如何以及何时分配其内存地址?

虚拟内存:

我了解大多数(如果不是全部)现代系统在硬件中使用内存管理单元来允许使用虚拟内存。地址空间的前几个八位字节用于引用哪个页面。如果每个进程使用不同的页面,这将允许内存保护。但是,如果这就是执行内存保护的方式,那么最初的问题仍然存在,只是这次如何分配页号?

编辑

中央处理器:

一种可能性是 CPU 可以通过强制操作系统在执行基于内存的指令之前分配进程 ID 来处理内存保护。然而,这只是猜测,需要 CPU 架构的硬件支持,我不确定 RISC ISA 的设计目的是什么。

zch*_*zch 1

使用虚拟内存,每个进程都有单独的地址空间,因此一个进程中的 0x010000AA 将引用与另一进程中不同的值。

地址空间是通过内核控制的页表来实现的,处理器使用该页表将虚拟页地址转换为物理页地址。让两个进程使用相同的地址页号不是问题,因为这些进程具有单独的页表并且映射的物理内存可以不同。

通常可执行代码和全局变量将被静态映射,堆栈将被映射到随机地址(某些漏洞利用这种方式更困难),动态分配例程将使用系统调用来映射更多页面。