【问题标题】:Linux, will zeroed page pagefault on first read or on first write?Linux,第一次读取或第一次写入时会归零页面页面错误吗?
【发布时间】:2012-08-24 19:19:45
【问题描述】:

我的问题是特定于 Linux 的,需要了解内核、虚拟内存、mmap、页面错误。我有带有大型静态数组的 C 程序,它将进入 bss 部分(内存,初始化为零)。程序启动时,这块内存没有物理分配,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页(全零页)。当应用程序访问该页面时,会产生pagefault并分配物理页面。

问题是:在第一次读取访问或第一次从 bss 部分对页面进行写入访问时会生成这样的页面错误吗?

【问题讨论】:

    标签: linux linux-kernel virtual-memory page-fault


    【解决方案1】:

    Linux 为该内存分配一个零页(整个区域一个零页),然后本质上会在该页上执行 COW(写入时复制)行为,因为您正在更改内容。所以你不会遇到读取错误(除非页面被换出或者它是次要的页面错误,这意味着页面在内存中但没有映射)。

    所以只有写错误才会导致在零页上分配新页的错误。

    【讨论】:

    • 耶稣,感谢您的快速回答。有什么方法可以在零页上禁用此 COW? mmaps 有 MAP_POPULATE,但静态数组 (.bss) 是什么
    • @osgx 哦,好吧,我明白你的意思,只需迭代数组并再次向其写入零,它会导致写入错误(写入错误不在乎你在写什么,它只会 COW page),这样你的所有页面都将在内存中并映射到单独的物理页面。
    • @osgx 以上正是 map populate 在 mmap 上所做的,它只是迭代区域以强制对页面的任何访问都不会导致小错误。
    • mlock 会做一些额外的动作:它会禁用分页。
    • 是的,我不建议使用 mlock,除非您使用的是实时应用程序,其中可能被换出的内存区域可能会导致错过截止日期。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多