考虑以下CPU指令这需要存储器地址16777386(十进制),并将其存储在寄存器1:在编译时何时分配内存地址?
Move &0x010000AA, R1
传统节目被转换到组件(机器代码)。 (让我们忽略更复杂的现代系统,如jitting)。
但是,如果此地址分配在编译时静态完成,那么操作系统如何确保两个进程不使用相同的内存? (例如,如果你同时运行两次相同的编译程序)。
问:
如何,以及何时,并计划得到分配的内存地址?
虚拟内存:
我了解大部分(如果不是全部)现代系统使用存储器管理单元在硬件上允许使用的虚拟内存。地址空间的前几个八位字节用于引用哪个页面。如果每个进程使用不同的页面,这将允许内存保护。但是,如果这是如何执行内存保护的,那么原始问题仍然存在,只是这次是如何分配页码的?
EDIT:
CPU:
一种可能性是CPU可以通过执行一个进程ID由OS执行基于存储器中的指令前分配处理存储器保护。但是,这只是推测,并且需要CPU架构在硬件方面的支持,这是我不确定RISC ISA会设计的。
其我的理解是,页面查找使用硬件以减少查找的时间成本(是内核接管页面错误,但应该是例外情况)。 MMU跟踪哪个进程正在运行?它如何知道一次将0x010000AA映射到物理地址X,但稍后将0x010000AA映射到物理地址Y? – James 2014-11-24 16:58:52
@詹姆斯,处理器需要一个指向页表的寄存器(例如,x86 http://en.wikipedia.org/wiki/Control_register#CR3中的CR3)。 – zch 2014-11-24 17:16:14