Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
Windows 什么导致页面错误?_Windows_X86_Paging_X86 64 - Fatal编程技术网

Windows 什么导致页面错误?

Windows 什么导致页面错误?,windows,x86,paging,x86-64,Windows,X86,Paging,X86 64,: 页面错误是当程序访问映射到虚拟地址空间但未加载到物理内存中的页面时,硬件引发的软件陷阱。(强调矿山) 好吧,这是有道理的 但如果是这样的话,为什么每次刷新process Hacker中的流程信息时,我都会看到大约15个页面错误 或者换句话说,为什么内存会被调出?(我不知道它是用户内存还是内核内存。)我有没有页面文件,RAM的使用率大约为1.2GB,在完全重新启动后为4GB。没有任何资源短缺;为什么会有任何内容被调出?当进程之间共享内存时,您会看到软页面错误。基本上,如果两个进程之间共享一个

:

页面错误是当程序访问映射到虚拟地址空间但未加载到物理内存中的页面时,硬件引发的软件陷阱。(强调矿山)

好吧,这是有道理的

但如果是这样的话,为什么每次刷新process Hacker中的流程信息时,我都会看到大约15个页面错误

或者换句话说,为什么内存会被调出?(我不知道它是用户内存还是内核内存。)我有没有页面文件,RAM的使用率大约为1.2GB,在完全重新启动后为4GB。没有任何资源短缺;为什么会有任何内容被调出?

当进程之间共享内存时,您会看到软页面错误。基本上,如果两个进程之间共享一个内存映射文件,当第二个进程加载内存映射文件时,会生成软页面错误-内存已经在物理RAM中,但是操作系统需要修复内存管理器的表,以便进程中的虚拟内存地址指向正确的物理页


特别是对于Process Hacker之类的东西,它可能会向每个正在运行的进程中注入代码(以便收集信息)IPC可能会大量使用共享内存。

操作系统使用分页对应该放在物理内存中的项目进行分组,并在物理内存和共享内存之间移动它们。大多数情况下,放在单个页面中的数据项是相互关联的。 当页面中的数据项长时间不使用时,操作系统会将其移动到虚拟内存以释放物理内存中的一些空间。然后,当需要虚拟内存中的页面时,操作系统会将其从虚拟内存(硬盘)移动到物理内存。这是页面错误

记住,不同的操作系统在分页算法上是不同的

“映射到虚拟地址空间但未加载到物理内存中的页面”并不意味着它以前在物理内存中。假设你映射了一个文件?它仍然在磁盘上,还没有在内存中

假设您映射了一个日志文件并一直附加到它。每当您超过提交内存的末尾时,就会出现页面错误,操作系统将为您提供新的空页面并调整文件长度


它也可能是程序捕获和处理的访问冲突


也可能是程序使用的内存段比TLB(页表的缓存)中的内存段多。当页面是连续的时,它们都可以由单个页面表条目处理。但是,如果内存在物理地址空间中被分割,则需要许多页表条目,它们可能不适合TLB。发生TLB未命中时,将调用OS页面错误处理程序,并在进程的页面表中查找映射

在某些方面,这是一种变化:页面已经在物理RAM中,操作系统确实需要将这些映射加载到TLB中,但不是因为IPC

Brian指出,x86(以及所有Win32系统)在处理此问题时不会出现页面错误



页错误的另一个原因是触发用于堆栈增长和写时复制的保护页,但通常在没有绑定的情况下不会发生。我不能100%确定这些是否会显示为访问冲突,因为它们在进入MMU陷阱时将被标记为访问冲突,但可能由操作系统页面错误处理程序处理,而不是转换为用户模式(SEH)访问冲突。

任何时候读取mmap的部分,都会生成页面错误,其中包括加载DLL时。因此,加载DLL实际上并不会将所有DLL读入内存,它只会在执行代码时导致DLL出错。

资源分配是保持主存储可用性和尽可能避免需要转到辅助存储之间的微妙平衡。如果进程试图分配内存,但无法分配,则通常是异常,有时是致命异常


基本上,在没有可用资源的情况下,您无法将所有内容都保存在RAM中,因为当程序启动或请求更多内容时,它将崩溃。

一个缓慢但稳定的页面错误源是操作系统探测不常访问的页面。在这种情况下,操作系统会将一些页面标记为不存在,但将它们保留在内存中。如果应用程序访问该页面,则会出现#PF陷阱,操作系统只需将页面标记为再次出现,无需进一步ado。如果“很长一段时间”过去了,并且一个页面从未出现错误,那么操作系统就知道该页面是一个很好的候选页面,可以在需要时进行交换。即使在没有资源压力的情况下,这种机制也可以主动运行。

(我是Process Hacker的作者。)

首先:

页面错误是软件的陷阱 当一个程序运行时由硬件引发 访问在中映射的页面 虚拟地址空间,但未加载 在物理内存中

正如同一篇文章后面解释的那样,这并不完全正确(轻微的页面错误)。存在软页面错误,内核需要做的就是向进程的工作集添加一个页面。以下是Windows Internals手册中的一个表(我排除了导致访问冲突的表):

  • 故障原因-结果
  • 访问不驻留在内存中但位于页面文件或映射文件中磁盘上的页面-分配物理页面,并从磁盘读取所需页面并将其读入相关工作集
  • 访问备用或修改列表中的页面-将页面转换到相关进程、会话或系统工作集
  • 访问需求零页面-将零填充页面添加到相关工作集
  • 在写入页上写入副本-使进程成为页面的私有(或会话私有)副本,并替换orig