系统如何定义进程获得的虚拟内存部分?

时间:2013-12-31 07:27:46

标签: windows memory memory-management virtual-memory

如果有32位系统(假设为Windows),则虚拟地址空间为4GB。因此CPu可以生成此范围之间的任何地址。那么一个过程也不能解决这个范围内的任何地方吗? 据说每个进程都有自己的私有虚拟地址空间。那么系统如何促进呢?

换句话说,CPU生成一个32位地址,并将其转换为物理地址。现在,CPU如何知道特定进程只需要处理虚拟地址空间的特定部分(其专用虚拟地址空间)。

假设一个进程从其私有虚拟地址空间中寻址一个地址,会发生什么?

2 个答案:

答案 0 :(得分:4)

程序必须在Windows上调用VirtualAlloc()来告诉操作系统它想要使用一块虚拟内存。通常由于从堆中分配内存或加载DLL而间接调用。

操作系统反过来设置页面映射表,CPU用它将程序中使用的虚拟地址转换为物理RAM地址作为其地址总线引脚上的输出。每当CPU读取或写入数据或在虚拟存储器地址执行代码时,就会发生三种不寻常的事情之一:

  • 如果页面映射表中没有条目,则CPU会引发一般保护故障陷阱。操作系统验证地址无效并终止程序
  • 如果页面未映射到RAM,则CPU会引发页面错误陷阱。操作系统找到未使用的RAM页面,必要时交换使用过的页面。并确保内容有效,必要时从文件或页面文件加载内容。并更新表条目,使其现在具有RAM页面的物理地址。执行恢复正常
  • CPU验证是否允许访问该页面。对标记为只读的页面的写入或页面中标记为无执行的指令的执行会生成一般保护故障陷阱。操作系统终止程序。

每个进程都有自己的一组页面映射表,确保一个进程无法访问另一个进程使用的RAM页面。除非特别请求共享,否则从可执行文件和内存映射文件加载的代码页面通用。上下文切换加载CR2寄存器,该CPU寄存器包含页面映射表的地址。

因此,没有一个进程可以处理其私有虚拟地址空间之外的内存的情况,缺少匹配的分页表条目可确保终止程序。

答案 1 :(得分:0)

整个4 GB地址空间可用于进程(尽管通常上半部分是为内核数据保留的),并且MMU将其部分映射到物理内存。该进程不能“超出”其地址空间(允许使用它的所有4 GB),但如果它的某些部分尚未映射到物理内存,则会引发硬件异常。

由于操作系统在任务切换时更改了MMU的设置,因此地址空间被称为私有地址,因此每个进程都会看到不同的独立内存布局(尽管部分地址空间可以与其他进程共享)。