问题标签 [page-fault]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何避免由我的 C# .NET 应用程序生成的大量软页面错误?
我正在分析一个 C# .NET WinForms 应用程序,我注意到它会产生数百万个软页面错误并在工作期间不断增加......
我知道在 .NET 中,应用程序生成的页面错误数量通常很高,但数百万个页面错误似乎太多了......似乎应用程序触发了 GC 的竞争条件,这可能吗?
是否有一些已知的设计不良的代码会导致这种情况?如果不在代码中,是否有一些 .NET 框架的隐藏设置可以减少页面错误的数量?
可以避免越来越多的软页面错误的产生?
porting - newlib 函数的页面错误
我一直在将 newlib 移植到我非常小的内核中,但我很困惑:每当我包含一个引用系统调用的函数时,我的程序都会在执行时出现页面错误。如果我调用一个不引用系统调用的函数,比如rand()
,什么都不会出错。
注意:包含,我的意思是只要函数,例如printf()
or fopen()
,在程序内部的某个地方,即使它不是通过 调用的main()
。
这个问题我已经有一段时间了,不知道是什么原因造成的:
- 我已经多次重建 newlib
- 修改了我的 ELF 加载器以从节头而不是程序头加载代码
- 尝试单独构建 newlib/libgloss(失败)
GROUP
使用、gcc 和 ld通过 ld 脚本链接库(libc、libnosys)
我不太确定我应该包含哪些其他信息,但我很乐意包含我可以包含的信息。
编辑:为了验证,发生的页面错误不在失败函数的地址;他们在程序的其他地方。例如,当我调用fopen()
位于 0x08048170 的 时,我将在 0xA00A316C 处出现页面错误。
编辑2:加载ELF的相关代码:
编辑3:我注意到如果我调用系统调用,例如write()
,然后调用printf()
两次或更多次,我会得到一个未知的操作码中断。奇怪的。
paging - 缺页后重启指令
我正在用 C 语言开发一个操作系统,但我在分页上苦苦挣扎。我通过分配内存并输出处理物理和虚拟页面分配的低级内存分配输出来循环测试我的内核堆。
当 时PDE 0
,一切都适用于页面0-1023
,但一旦分配移动到PDE 1
,就会引发页面错误并设置当前标志,rw
如果我从不同的物理地址开始分配,有时也会引发标志。
我是否需要从中获取错误地址cr2
并将其映射回PDE
它所属的页面,然后设置或使用 3 的地址?之后我需要重新启动指令,但我该怎么做?有什么建议么?
memory-management - 为什么在写入时复制时没有 SIGSEGV 信号?
wikipedia 上的写时复制文章说,写时复制通常是通过授予对页面的只读访问权限来实现的,因此当一个页面被写入时,页面错误陷阱处理程序可以为其映射一个唯一的物理内存页面。所以我的问题是为什么当这种页面错误发生时用户级应用程序没有收到 SIGSEGV 信号?毕竟,关于 SIGSEGV 的维基百科文章说 SIGSEGV 是当进程进行无效内存引用或分段错误时发送给进程的信号。所以在这种情况下,即写时复制的情况下,为什么没有 SIGSEGV 被发送到进程。
linux-kernel - 测量Linux上程序发生的页错误数
我正在 Linux 调度程序上做一个项目,试图最大限度地减少页面错误的数量。
我已经完成了算法实现,我需要测量效果。我想知道Linux是否提供工具来记录整个执行过程中发生的页面错误的数量?
基本上,我想要类似的东西
有这样的工具吗?在决定自己写一个之前,我想确定一下,这将是很多工作......
linux - Linux内核中的主要页面错误处理程序
我想知道主要的页面错误处理程序在哪里。
我写了一个算法来最小化内核中的页面错误。所以每当发生页面错误时,我都需要记录一些东西。我目前在 arch/x86/mm/fault_32.c 的 do_page_fault(...) 记录了一个页面错误
但是,似乎次要和主要页面错误都会转到 do_page_fault(...) ......并且次要页面错误一直在发生并弄乱了算法。
我想我只想在发生重大 page_fault 时记录东西。那么,内核黑客们,请你告诉我我应该把我的代码放在哪里?哪个文件和哪个功能。
顺便说一句,我正在破解内核 2.6.24
非常感谢!阿尔弗雷德
mips - 虚拟内存、LRU 和页面错误 - 作业
我一直在研究以下程序,感觉它缺少一些信息,或者 a) 和 b) 有点诡计:
该循环作为程序的一部分在使用 4KB 页的虚拟内存系统上执行。假设在需要时使用LRU替换算法在内存中选择要替换的页面。标记为“开始”的指令从页面边界开始,循环体包含 4601 对移位指令(sll 和 srl)。
a) 如果内存包含 8 个 4KB 帧,在循环执行期间会发生多少页错误?
b) 如果内存包含 9 个 4KB 帧,在循环执行期间会发生多少页错误?
a) 和 b) 不是 5 个页面错误吗?每次循环有4602条指令,MIPS指令为4B,页面大小为4KB。4KB/4B = 每页 1024 条指令,所以第一次通过循环:
指令 0 - 1023 帧 0 页面错误是
指令 1024 - 2047 帧 1 页面错误 是
指令 2048 - 3071 帧 2 页面错误是
指令 3072 - 4096 帧 3 页面错误是
指令 4096 - 4602 帧 4 页面错误是
因此,当我们在第二次交互中返回循环时,页面还没有被 LRU 策略替换,所以我们可以再次引用它们。为什么 32 次循环迭代的帧数是 8 帧还是 9 帧?
driver - WorkItem (IoQueueWorkItem) 给 BSOD 错误“PAGE_FAULT_IN_NONPAGED_AREA”
我正在使用 Windows 7 64 位。WorkItem(IoQueueWorkItem)给蓝屏错误“PAGE_FAULT_IN_NONPAGED_AREA”我也在释放分配的内存......不知道出了什么问题:(
这是我的驱动程序代码:
这是我的测试代码:
此代码使我的笔记本电脑崩溃......我不知道我错在哪里......我也在释放内存。如果我评论它,没有 IoQueueWorkItem 就可以了。
////////////////编辑1
解决了!这是因为这里的 DeviceObject,work->pio = IoAllocateWorkItem(pDeviceObject);
这pDeviceObject
不是我的驱动程序实例......因此它失败了!
c - 如何禁用mmap()的写时复制和按需填充零
我正在使用 mmap() 实现 cp(file copy) 命令。为此,我将源文件映射为 MAP_PRIVATE(我只想读取)模式,并将目标文件映射为 MAP_SHARED 模式(因为我必须写回目标文件的更改内容)。
在执行此操作时,我观察到由于两个原因而发生的许多次要页面错误导致性能下降。1) 为源文件调用 mmap(MAP_PRIVATE) 时按需填零。2) 为目标文件调用 mmap(MAP_SHARED) 时写入时复制。
有什么方法可以禁用 Zero-fill-on-demand 和 Copy-on-write 吗?
谢谢, 哈里什
linux - Linux,第一次读取或第一次写入时会归零页面页面错误吗?
我的问题是 Linux 特定的,需要了解内核、虚拟内存、mmap、页面错误。我有带有大型静态数组的 C 程序,它将进入 bss 部分(内存,初始化为零)。程序启动时,这块内存没有物理分配,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页(全零页)。当应用程序访问这个页面时,会产生pagefault并分配物理页面。
问题是:在第一次读取访问或从 bss 部分对页面的第一次写入访问时会生成这样的页面错误吗?