Linux,将在第一次读取或第一次写入时归零页面错误?

我的问题是Linux特定的,需要了解内核虚拟内存,mmap,页面错误。 我有C程序与大静态数组,将进入BSS部分(内存,初始化为零)。 程序启动时,这个内存不是物理分配的,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页面(全零页面)。 当应用程序访问此页面时,将生成页面错误并分配物理页面。

问题是:这样的页面错误会在第一次读取访问时生成,还是首先从bss部分写入访问页面?

Linux为这个内存分配一个零页(整个区域一个零页),然后基本上在页面上执行COW(copy on write)行为,因为你正在改变内容。 所以你不会得到读取错误(除非页面被换出或者它的小页面错误,这意味着页面在内存中但是没有被映射)。

所以只有写入错误会导致一个错误,导致在零页面上分配一个新页面。