`
bigfirebird
  • 浏览: 125057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

执行程序时内存管理的情景

阅读更多
do_execve
->open_exec->dentry_open
.... 
f->f_dentry = dentry;
....
f->f_op = fops_get(inode->i_fop);
....
设置f->f_dentry和f->f_op,我们考察执行ext2的情景,因此f_op将是ext2_file_operations

->search_binary_handler->load_elf_binary->elf_map->do_mmap->do_mmap_pgoff
....
vma->vm_file = file;
get_file(file);                          
error = file->f_op->mmap(file, vma);
....
设置vm_file,执行f_op->mmap,在ext2_file_operations中的mmap是generic_file_mmap, 在generic_file_mmap中主要是设置vma->vm_ops = ops,绝大多数情况下ops是file_private_mmap
static struct vm_operations_struct file_private_mmap = {
nopage:                filemap_nopage,
};

执行do_mmap时,如果是代码段,一般只允许读和执行,如果是数据段,一般允许读和写,但是vma->vm_page_prot中只设置有可读和可执行位(没有深入研究)

sys_execve做完映射后就退出了.当调度到该进程时并执行代码时,立即产生page fault,依次do_page_fault->handle_mm_fault->handle_pte_fault->do_no_page
...
new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, (vma->vm_flags & VM_SHARED)?0:write_access);
...

从前面知道,此处将调用filemap_nopage(基本所有这类的情景都执行这个函数)
filemap_nopage->page_cache_read
.....
page = page_cache_alloc();
if (!page)
return -ENOMEM;

if (!add_to_page_cache_unique(page, mapping, offset, hash)) {
int error = mapping->a_ops->readpage(file, page);
page_cache_release(page);
return error;
}
....
此处分配一空闲页,然后读入该页,由于是ext2,应此此处的a_ops是
struct address_space_operations ext2_aops = {
readpage: ext2_readpage,
writepage: ext2_writepage,
sync_page: block_sync_page,
prepare_write: ext2_prepare_write,
commit_write: generic_commit_write,
bmap: ext2_bmap
};
因此将调用ext2_readpage读入。返回do_no_page,根据vma->vm_page_prot设置该页只允许读和执行,一路返回.现在代码可执行了.

如果代码要写数据段,同样将发生以上情景。现在数据段也在内存中了。但是由于要写该数据页,而页只允许读,因此再次发生page fault,依次do_page_fault->handle_mm_fault->handle_pte_fault,由于此时页已经在内 存中,将执行do_wp_page,也就是COW,并设置该页允许写,并释放原页.这样就保证了原页(该页也是该文件读写缓冲)没有被更改.

如果可用物理页发生短缺并且kswapd执行swap_out时选中该进程,进而执行try_to_swap_out,
...
if (PageSwapCache(page)) {
entry.val = page->index;
if (pte_dirty(pte))
set_page_dirty(page);
set_swap_pte:
swap_duplicate(entry);
set_pte(page_table, swp_entry_to_pte(entry));
drop_pte:
UnlockPage(page);
mm->rss--;
deactivate_page(page);
page_cache_release(page);
out_failed:
return 0;
}

flush_cache_page(vma, address);
if (!pte_dirty(pte))
goto drop_pte;
/*代码段将goto drop_pte,以后发生page fault时再执行前面的情景*/

if (page->mapping) {
set_page_dirty(page);
goto drop_pte;
}

/*数据段将执行下面的swap out操作,这样修改过的数据页将被换到交换分区*/
entry = get_swap_page();
if (!entry.val)
goto out_unlock_restore; /* No swap space left */

/* Add it to the swap cache and mark it dirty */
add_to_swap_cache(page, entry);
set_page_dirty(page);
goto set_swap_pte;
......


转自linux.chinaunix.net/bbs/viewthread.php
分享到:
评论

相关推荐

    《Android系统源代码情景分析》

    2.2 开发C可执行程序验证Android硬件驱动程序 2.3 开发Android硬件抽象层模块 2.3.1 硬件抽象层模块编写规范 2.3.2 编写硬件抽象层模块接口 2.3.3 硬件抽象层模块的加载过程 2.3.4 处理硬件设备访问权限...

    Android系统源代码情景分析-罗升阳-源码

    2.2 开发C可执行程序验证Android硬件驱动程序 2.3 开发Android硬件抽象层模块 2.3.1 硬件抽象层模块编写规范 2.3.2 编写硬件抽象层模块接口 2.3.3 硬件抽象层模块的加载过程 2.3.4 处理硬件设备访问权限问题 ...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    5.5 Windows的可执行程序映像 300 5.6 Windows的进程创建和映像装入 305 5.7 Windows DLL的装入和连接 329 5.8 Windows的APC机制 358 5.9 Windows线程的调度和切换 381 5.9.1 x86系统结构与线程切换 382 5.9.2...

    Android系统源代码情景分析光盘

    2.2 开发C可执行程序验证Android硬件驱动程序............................................... 24 2.3 开发Android硬件抽象层模块................................. 26 2.3.1 硬件抽象层模块编写规范.............

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    Android程序设计基础

    CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Android基础教程》的源代码 对应的书籍资料见: ... 我还记得第一次使用Android时的情景:当时感觉它就像是一座超大型迷宫。有了这本书,入门就不会那么...

    UNIX 高级教程系统技术内幕

    2.8.4 执行一个新程序 2.8.5 进程终止 2.8.6 等待进程终止 2.8.7 僵尸(Zombie)进程 2.9 小结 2.10 练习 2.11 参考文献 第3 章 线程和轻量级进程(41) 3.1 简介 3.1.1 动机 3.1.2 多线程和多处理器 3.1.3 并发和并行 ...

    Reversing:逆向工程揭密

    可执行程序转储工具 133 4.8 结论 138 第2部分 应用逆向 第5章 未公开的技术 141 5.1 逆向和互操作性 142 5.2 基本原则 142 5.3 定位未公开的API函数 143 我们要找什么? 144 5.4 案例研究:NTDLL.DLL中的 5.4 ...

    c#学习笔记.txt

    volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代...

Global site tag (gtag.js) - Google Analytics