微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux中代码段和数据段的加载

Linux中代码段和数据段的加载

时间:09-12 来源:互联网 点击:

e) {

struct page *new_page = page_cache_alloc();

if (new_page) {

copy_user_highpage(new_page, old_page, address);

flush_page_to_ram(new_page);

} else

new_page = NOPAGE_OOM;

page_cache_release(page);

return new_page;

}

由此可见: 数据段的页只是一份用户态本地的拷贝,它没有任何mapping,他可以被换出到swap中。它和bss、堆区、栈区的页没有任何本质上的区别。

假设现在的操作是读:

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。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top