如果有32位系统(假设为Windows),则虚拟地址空间为4GB。因此CPu可以生成此范围之间的任何地址。那么一个过程也不能解决这个范围内的任何地方吗? 据说每个进程都有自己的私有虚拟地址空间。那么系统如何促进呢?
换句话说,CPU生成一个32位地址,并将其转换为物理地址。现在,CPU如何知道特定进程只需要处理虚拟地址空间的特定部分(其专用虚拟地址空间)。
假设一个进程从其私有虚拟地址空间中寻址一个地址,会发生什么?
答案 0 :(得分:4)
程序必须在Windows上调用VirtualAlloc()
来告诉操作系统它想要使用一块虚拟内存。通常由于从堆中分配内存或加载DLL而间接调用。
操作系统反过来设置页面映射表,CPU用它将程序中使用的虚拟地址转换为物理RAM地址作为其地址总线引脚上的输出。每当CPU读取或写入数据或在虚拟存储器地址执行代码时,就会发生三种不寻常的事情之一:
每个进程都有自己的一组页面映射表,确保一个进程无法访问另一个进程使用的RAM页面。除非特别请求共享,否则从可执行文件和内存映射文件加载的代码页面通用。上下文切换加载CR2寄存器,该CPU寄存器包含页面映射表的地址。
因此,没有一个进程可以处理其私有虚拟地址空间之外的内存的情况,缺少匹配的分页表条目可确保终止程序。
答案 1 :(得分:0)
整个4 GB地址空间可用于进程(尽管通常上半部分是为内核数据保留的),并且MMU将其部分映射到物理内存。该进程不能“超出”其地址空间(允许使用它的所有4 GB),但如果它的某些部分尚未映射到物理内存,则会引发硬件异常。
由于操作系统在任务切换时更改了MMU的设置,因此地址空间被称为私有地址,因此每个进程都会看到不同的独立内存布局(尽管部分地址空间可以与其他进程共享)。