memory - 什么时候分配内存地址?

标签 memory memory-management operating-system virtual-memory

考虑以下 CPU 指令,它获取地址 16777386(十进制)处的内存并将其存储在寄存器 1 中:
Move &0x010000AA, R1
传统上,程序在编译时被翻译成汇编(机器代码)。 (让我们忽略更复杂的现代系统,如抖动)。

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

问题:

程序如何以及何时获得分配的内存地址?

虚拟内存:

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

编辑 :

CPU:

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

最佳答案

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

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

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

关于memory - 什么时候分配内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109102/

相关文章:

javascript - 是否有任何网络浏览器垃圾收集删除的 dom 元素? (相对于 Javascript 对象)

java - 如何在 Java 中监控计算机的 CPU、内存和磁盘使用情况?

c - 我是否了解此 malloc/free 组合的内存问题?

windows - 锁定执行文件 : Windows does, Linux 没有。为什么?

c - 使用 Malloc 通过 GMP 处理大量数据

c - printf 是如何工作的?

c++ - 分配大于 32 位的堆内存允许

c++ - 删除 visual studio 标题中的 void 指针

android - 如何从我的 Android 版本中删除导航栏?

caching - 根据以下数据计算平均内存访问时间?