Linux中代码段和数据段的加载(2)

write_access就是0,所以filemap_nopage中返回的就是old_page。 old_page是page_cache中的页,他一定会mapping到elf_inode->address_mapping。似乎这样接下去推会得到一个相反的结论。

请注意: 

entry = mk_pte(new_page, vma->vm_page_prot);  /*这里是PAGE_COPY,_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED */

当我们对这样的页进行写操作的时候,mmu当然会触发page_fault.

if (write_access) {

if (!pte_write(entry))

return do_wp_page(mm, vma, address, pte, entry);

entry = pte_mkdirty(entry);

}

当一个vma是可写的,而vma中对应的pte又是不可写的,这就触发了copy_on_write机制:do_wp_page会进行相应的copy_on_write处理过程。

所以,不存在是否第一份不能被换出的情况。如果对数据段都是只读的操作,那么你可以把数据段的页想象成一个软链接。一旦有了写操作,那么数据段就变成了一份本地的page。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22241.html