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

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;
}
....

时间: 2025-01-28 00:46:58

Linux系统执行程序时内存管理的情景的相关文章

Linux系统基本的内存管理知识讲解

  内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量.Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大.核心把当前不用的内存块存到硬盘,腾出内存给其他目的.当原来的内容又要使用时,再读回内存. 一.内存使用情况监测 (1)实时监控内存使用情况 在命令行使用"Fr

Linux内核中的内存管理浅谈

 [十月往昔]--Linux内核中的内存管理浅谈 为什么要叫做"十月往昔"呢?是为了纪念我的原博客. 不知道为什么,突然想来一个新的开始--而那个博客存活至今刚好十个月,也有十个月里的文档. 十月往昔,总有一些觉得珍贵的,所以搬迁到这里来. 而这篇文章是在09.04.20-09.04.21里写的. Jason Lee   ------------–cut-line   1.基本框架(此处主要谈页式内存管理) 4G是一个比较敏感的字眼,早些日子,大多数机器(或者说操作系统)支持的内存上限

Linux系统手工释放内存缓存的方法教程

在Linux操作系统中,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,比如:1)当内存被缓存占用掉,导致系统使用SWAP空间并最终影响了系统性能:2)有些环境上部署了监控软件用于检测内存使用率的,那么当内存使用率达到一定上限(例如:80%)时,就会报警.因此在这些场景中,就需要执行释放内存(清理缓存)的操作了. Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换).Buffer Cache(针对磁盘块的读写)和Pa

Linux 系统逻辑盘卷管理LVM 详细介绍

转 Linux 系统逻辑盘卷管理LVM 详细介绍一.前言每个Linux 使用者在安装Linux 时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值.因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统.清除硬盘.重新对硬盘分区,然后恢复数据到新分区.虽然现在有很多动态调整磁盘的工具可以使用,例如Partation Magic 等等,但是它并不能完全解决问题,因为某

Linux系统中的进程管理简介

在Linux系统里,当前正在运行的程序实例称为进程.比如,当你启动Apache的时候,系统会为它分配一个进程ID.然后就可以用这个ID监视和控制这个程序. 进程监视和控制是任何Linux系统管理员的核心任务.一个管理员可以终止("kill").重启一个进程,甚至可以为它指定一个不同的优先级.标准的Linux命令"ps"和"top"通常用于查看当前的进程列表.下面我来说明如何用这些命令和其它命令来管理Linux系统中的进程. 用ps监视进程 一个监

Linux系统中的进程管理工具SystemD介绍

  SystemD是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布.Lennart是redhat员工,但SystemD不是redhat项目.其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序. SystemD这一名字源于Unix中的一个惯例:在Unix中常以"d"作

Linux内核剖析 之 内存管理

1. 内存管理区     为什么分成不同的内存管理区?     ISA总线的DMA处理器有严格的限制:只能对物理内存前16M寻址.     内核线性地址空间只有1G,CPU不能直接访问所有的物理内存.     ZONE_DMA                  小于16M内存页框     ZONE_NORMAL          16M~896M内存页框     ZONE_HIGHMEM        大于896M内存页框     ZONE_DMA和ZONE_NORMAL区域包含的页框,通过线性

Linux管理员手册(4)--内存管理_unix linux

本章说明Linux的内存管理特征,即虚拟内存和磁盘缓存.描述系统管理员应该考虑的东西.工作和目的. 什么是虚拟内存? Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大.核心把当前不用的内存块存到硬盘,腾出内存给其他目的.当原来的内容又要使用时,再读回内存.这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上.当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢.用做虚拟内存的这部分硬盘叫 对换空间. Linux可以使用文件系统中的普通

浅析Linux系统帐户的管理和审计

1.登录帐户管理 在Linux下登录用户帐户的管理是通过utmp和wtmp这两个工具来实现的.wtmp还记录系统重启和系统状态变化的有关信息.所有与utmp和wtmp相关的数据都分别被保存在/var/run/utmp和/var/log/wtmp这两个文件中.这两个文件均归属于root用户所有并且访问权限被设置为644,这些文件中的数据是加密过的.可以用dump-utmp这个工具将原始的数据转换为ASCII的数据,便于系统管理员分析用户的登录以及系统重启和系统状态变化的有关信息. 登录帐户管理的相