`
bigfirebird
  • 浏览: 128782 次
  • 性别: 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
分享到:
评论

相关推荐

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    - 中断机制允许CPU在执行程序时能够响应外部事件。 - **3.2 中断向量表IDT的初始化** - IDT(Interrupt Descriptor Table)用于描述每一个中断向量的属性。 - 初始化IDT是系统启动时的一项重要任务。 - **3.3 ...

    linux内核源代码情景分析 pdf版 高清

    再者,内存管理部分讲解了Linux内核如何有效地分配和回收内存,包括物理内存的分配、虚拟地址空间的映射、页表的管理和交换机制。这些内容对于优化系统性能和解决内存泄漏问题至关重要。 然后,设备驱动章节则深入...

    Linux内核情景分析

    这包括进程管理、内存管理、文件系统、设备驱动、网络协议栈等。进程管理是内核中的核心功能之一,它负责创建、调度和销毁进程,保证多任务的并发执行。内存管理则关乎如何分配和释放物理及虚拟内存,确保高效且安全...

    Windows内核情景分析上.rar

    《Windows内核情景分析》是深入理解Windows操作系统内核的重要参考资料,主要涵盖了Windows操作系统的核心机制、系统调用、进程管理、线程调度、内存管理、设备驱动等方面的知识。本资料集将围绕这些主题进行详细...

    Windows内核情景分析-采用开源代码ReactOS(下册)高清pdf版

    内存管理是操作系统内核的核心功能之一,它涉及到物理内存和虚拟内存的分配、内存页的映射、分页机制、内存共享和保护等多个方面。通过对ReactOS源代码的剖析,作者向读者展示了Windows内核在内存管理方面所采用的...

    linux内核情景分析

    3. **内存管理**:内核的内存管理涉及到页表、内存分配与释放、内存分页等机制。C语言提供了底层数据结构和算法实现这些功能,如slab分配器用于优化内存分配。 4. **设备驱动**:设备驱动程序是操作系统与硬件交互...

    《Windows 内核情景分析 上》.(毛德操).[PDF]&ckook;.pdf

    1. **内核模式与用户模式**:Windows操作系统采用了一种称为“保护模式”的内存管理方式,将执行环境分为内核模式和用户模式。内核模式具有最高权限,能够访问所有系统资源,而用户模式则受到限制,防止程序错误导致...

    《Windows 内核情景分析 下》.(毛德操).[PDF]&ckook;.pdf

    2. **内存管理**:Windows内核采用了分页式虚拟内存管理,书中详细介绍了分页机制、页面交换、内存分配与释放、内存保护等技术,帮助读者理解如何有效地管理和优化应用程序的内存使用。 3. **I/O管理**:Windows...

    《Windows 内核情景分析 上》(毛德操)

    1. **Windows 内核结构**:Windows内核由几个关键组件构成,如执行体(Executive)、调度器、内存管理器、设备驱动模型等。书中可能会详细解释这些组件的功能和相互关系。 2. **进程与线程管理**:进程是资源分配的...

    Android程序研发源码Android 源代码定时情景模式切换.zip

    IntentService是Android的一种单线程服务,适合执行后台的单个任务,完成任务后自动停止,避免了内存泄漏的问题。 2. **广播接收器(BroadcastReceiver)**:在IntentService中,我们可以创建一个BroadcastReceiver...

    Linux内核情景分析(上下全集高清版)

    这本书分为上下两部分,全面覆盖了Linux内核的各个方面,包括进程管理、内存管理、文件系统、网络协议栈、设备驱动等多个核心模块。以下是对这些知识点的详细阐述: 1. **进程管理**:Linux内核中的进程管理是操作...

    Linux内核源代码情景分析(上)(下)

    3. **内存管理**:深入解析内存分配策略,如页表机制、物理内存分配、虚拟内存管理,以及如何实现高效的数据结构和缓存优化。 4. **文件系统**:阐述VFS(虚拟文件系统)的概念,分析具体的文件系统实现,如ext4、...

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

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

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

    10. **系统调用**:系统调用是用户态程序与内核通信的桥梁,提供了诸如文件操作、进程控制、内存管理等服务。书中会展示如何通过系统调用接口与内核进行交互。 综上所述,《Windows内核情景分析——采用开源代码...

    LINUX内核源代码情景分析

    Linux内核源代码包含了处理硬件资源管理、进程调度、内存管理、文件系统、网络协议栈等多个关键模块。源代码的情景分析,就是将这些复杂的模块与实际应用场景相结合,帮助读者更直观地理解代码背后的逻辑。 首先,...

    LINUX内核源代码情景分析 中文版

    它包括了进程管理、内存管理、设备驱动、文件系统、网络协议栈等多个关键模块。通过阅读《LINUX内核源代码情景分析》,我们可以深入理解这些模块的工作原理。 在进程管理方面,内核负责调度和控制进程的执行,包括...

    Linux内核源代码情景分析

    内核初始化包括设置CPU模式、初始化内存管理单元(MMU)、建立内存管理结构如页表和物理内存区域管理(PFN)数据库,以及初始化各种核心子系统,如进程调度、内存管理、设备驱动和文件系统。 3. 进程管理:Linux内核的...

Global site tag (gtag.js) - Google Analytics