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

Windows 系统如何定义进程获得的虚拟内存部分?,windows,memory,memory-management,virtual-memory,Windows,Memory,Memory Management,Virtual Memory,如果有32位系统(假设为Windows),则虚拟地址空间为4GB。所以CPu可以生成这个范围内的任何地址。那么,一个进程不应该也能够处理这个范围内的任何地方吗? 据说每个进程都有自己的私有虚拟地址空间,那么系统是如何实现的呢 换句话说,CPU生成一个32位地址,并将其转换为物理地址。现在,CPU如何知道一个特定进程必须只寻址虚拟地址空间(其私有虚拟地址空间)的特定部分 假设一个进程在其私有虚拟地址空间之外寻址一个地址,会发生什么情况?整个4 GB地址空间可供进程使用(尽管通常上半部分是为内核数据

如果有32位系统(假设为Windows),则虚拟地址空间为4GB。所以CPu可以生成这个范围内的任何地址。那么,一个进程不应该也能够处理这个范围内的任何地方吗? 据说每个进程都有自己的私有虚拟地址空间,那么系统是如何实现的呢

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


假设一个进程在其私有虚拟地址空间之外寻址一个地址,会发生什么情况?

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


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

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


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

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

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

  • 如果页面映射表中没有条目,则CPU会引发一般保护故障陷阱。操作系统验证地址是否无效并终止程序
  • 如果页面尚未映射到RAM,则CPU会引发页面错误陷阱。操作系统会找到一个未使用的RAM页,必要时会调出一个已使用的页。并确保内容有效,必要时从文件或分页文件加载内容。并更新表条目,使其现在具有RAM页的物理地址。执行恢复正常
  • CPU验证是否允许访问该页。对标记为只读的页面的写入或对标记为不执行的页面中的指令的执行会生成一般保护故障陷阱。操作系统终止程序
每个进程都有自己的一组页面映射表,确保一个进程无法访问另一个进程使用的RAM页面。除非特别要求共享,否则从可执行文件和内存映射文件加载的代码页是通用的。上下文开关加载CR2寄存器,即包含页面映射表地址的CPU寄存器


因此,在任何情况下,进程都不能在其私有虚拟地址空间之外对内存进行寻址,缺少匹配的分页表条目将确保程序终止。

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

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

  • 如果页面映射表中没有条目,则CPU会引发一般保护故障陷阱。操作系统验证地址是否无效并终止程序
  • 如果页面尚未映射到RAM,则CPU会引发页面错误陷阱。操作系统会找到一个未使用的RAM页,必要时会调出一个已使用的页。并确保内容有效,必要时从文件或分页文件加载内容。并更新表条目,使其现在具有RAM页的物理地址。执行恢复正常
  • CPU验证是否允许访问该页。对标记为只读的页面的写入或对标记为不执行的页面中的指令的执行会生成一般保护故障陷阱。操作系统终止程序
每个进程都有自己的一组页面映射表,确保一个进程无法访问另一个进程使用的RAM页面。除非特别要求共享,否则从可执行文件和内存映射文件加载的代码页是通用的。上下文开关加载CR2寄存器,即包含页面映射表地址的CPU寄存器

因此,在任何情况下,进程都不能在其私有虚拟地址空间之外寻址内存,缺少匹配的分页表条目将确保终止程序。

什么类型的