Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 什么时候分配内存地址?_Memory_Memory Management_Operating System_Virtual Memory - Fatal编程技术网

Memory 什么时候分配内存地址?

Memory 什么时候分配内存地址?,memory,memory-management,operating-system,virtual-memory,Memory,Memory Management,Operating System,Virtual Memory,考虑以下CPU指令,该指令占用地址16777386(十进制)处的内存并将其存储在寄存器1中: Move&0x010000AA,R1 传统上,程序在编译时被翻译成汇编(机器代码)。(让我们忽略更复杂的现代系统,如jitting) 但是,如果这个地址分配是在编译时静态完成的,操作系统如何确保两个进程不使用相同的内存?(例如,如果同时运行同一编译程序两次) 问题: 程序是如何以及何时分配内存地址的 虚拟内存: 我知道大多数(如果不是全部的话)现代系统在硬件中使用内存管理单元来允许使用虚拟内存。地址空间

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

Move&0x010000AA,R1

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

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

问题:

程序是如何以及何时分配内存地址的

虚拟内存:

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

编辑

CPU:


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

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

地址空间是由处理器用来将虚拟页地址转换为物理页地址的内核控制的。使用相同地址页码的两个进程不是问题,因为这些进程具有单独的页表,映射的物理内存可能不同

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

(忽略Unix fork)进程内存的初始状态由可执行加载程序设置。链接器定义初始内存状态,加载程序创建它。这种状态通常包括内存到静态数据、可执行代码、可写数据和堆栈

在大多数系统中,进程可以通过添加页面(也可能删除页面)来修改地址空间

[忽略系统地址]在虚拟(逻辑)内存系统中,每个进程的地址空间从零开始(通常第一页未映射)。地址空间被分成若干页。操作系统将逻辑页映射(并重新映射)到物理页


一个进程中的地址0x010000AA是每个进程中不同的物理内存地址。

我的理解是,页面查找使用硬件来减少查找的时间成本(是的,内核会接管页面错误,但这应该是例外情况)。那么MMU是否跟踪正在运行的进程?它如何知道一次将0x010000AA映射到物理地址X,但稍后将0x010000AA映射到物理地址Y?@James,处理器需要一个指向页表的寄存器(例如x86中的CR3)。在@zch的注释上展开,每个进程都有自己的页表,因此在上下文切换上,内核使用其所交换进程的页表基址更改CR3寄存器。