Linux之内存描述符mm_struct
Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起。(所依据的代码是2.6.32.60)
1 struct mm_struct { 2 struct vm_area_struct * mmap; //指向虚拟区间(VMA)的链表 3 struct rb_root mm_rb; //指向线性区对象红黑树的根 4 struct vm_area_struct * mmap_cache; //指向最近找到的虚拟区间 5 unsigned long(*get_unmapped_area) (struct file *filp, 6 unsigned long addr, unsigned long len, 7 unsigned long pgoff, unsigned long flags);//在进程地址空间中搜索有效线性地址区 8 unsigned long(*get_unmapped_exec_area) (struct file *filp, 9 unsigned long addr, unsigned long len, 10 unsigned long pgoff, unsigned long flags); 11 void(*unmap_area) (struct mm_struct *mm, unsigned long addr);//释放线性地址区间时调用的方法 12 unsigned long mmap_base; /* base of mmap area */ 13 unsigned long task_size; /* size of task vm space */ 14 15 unsigned long cached_hole_size; 16 unsigned long free_area_cache; //内核从这个地址开始搜索进程地址空间中线性地址的空闲区域 17 pgd_t * pgd; //指向页全局目录 18 atomic_t mm_users; //次使用计数器,使用这块空间的个数 19 atomic_t mm_count; //主使用计数器 20 int map_count; //线性的个数 21 struct rw_semaphore mmap_sem; //线性区的读/写信号量 22 spinlock_t page_table_lock; //线性区的自旋锁和页表的自旋锁 23 24 struct list_head mmlist; //指向内存描述符链表中的相邻元素 25 26 /* Special counters, in some configurations protected by the 27 * page_table_lock, in other configurations by being atomic. 28 */ 29 mm_counter_t _file_rss; //mm_counter_t代表的类型实际是typedef atomic_long_t 30 mm_counter_t _anon_rss; 31 mm_counter_t _swap_usage; 32 33 unsigned long hiwater_rss; //进程所拥有的最大页框数 34 unsigned long hiwater_vm; //进程线性区中最大页数 35 36 unsigned long total_vm, locked_vm, shared_vm, exec_vm; 37 //total_vm 进程地址空间的大小(页数) 38 //locked_vm 锁住而不能换出的页的个数 39 //shared_vm 共享文件内存映射中的页数 40 41 unsigned long stack_vm, reserved_vm, def_flags, nr_ptes; 42 //stack_vm 用户堆栈中的页数 43 //reserved_vm 在保留区中的页数或者在特殊线性区中的页数 44 //def_flags 线性区默认的访问标志 45 //nr_ptes 进程的页表数 46 47 unsigned long start_code, end_code, start_data, end_data; 48 //start_code 可执行代码的起始地址 49 //end_code 可执行代码的最后地址 50 //start_data已初始化数据的起始地址 51 // end_data已初始化数据的最后地址 52 53 unsigned long start_brk, brk, start_stack; 54 //start_stack堆的起始位置 55 //brk堆的当前的最后地址 56 //用户堆栈的起始地址 57 58 unsigned long arg_start, arg_end, env_start, env_end; 59 //arg_start 命令行参数的起始地址 60 //arg_end命令行参数的起始地址 61 //env_start环境变量的起始地址 62 //env_end环境变量的最后地址 63 64 unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ 65 66 struct linux_binfmt *binfmt; 67 68 cpumask_t cpu_vm_mask; //用于惰性TLB交换的位掩码 69 /* Architecture-specific MM context */ 70 mm_context_t context; //指向有关特定结构体系信息的表 71 72 73 unsigned int faultstamp; 74 unsigned int token_priority; 75 unsigned int last_interval; 76 77 unsigned long flags; /* Must use atomic bitops to access the bits */ 78 79 struct core_state *core_state; /* coredumping support */ 80 #ifdef CONFIG_AIO 81 spinlock_t ioctx_lock; //用于保护异步I/O上下文链表的锁 82 struct hlist_head ioctx_list;//异步I/O上下文 83 #endif 84 #ifdef CONFIG_MM_OWNER 85 struct task_struct *owner; 86 #endif 87 88 #ifdef CONFIG_PROC_FS 89 unsigned long num_exe_file_vmas; 90 #endif 91 #ifdef CONFIG_MMU_NOTIFIER 92 struct mmu_notifier_mm *mmu_notifier_mm; 93 #endif 94 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 95 pgtable_t pmd_huge_pte; /* protected by page_table_lock */ 96 #endif 97 #ifdef __GENKSYMS__ 98 unsigned long rh_reserved[2]; 99 #else 100 //有多少任务分享这个mm OOM_DISABLE 101 union { 102 unsigned long rh_reserved_aux; 103 atomic_t oom_disable_count; 104 }; 105 106 /* base of lib map area (ASCII armour) */ 107 unsigned long shlib_base; 108 #endif 109 };
Reference:
http://www.cnblogs.com/Rofael/archive/2013/04/13/3019153.html
http://blog.csdn.net/persistence_s/article/details/70179419
转载于:https://www.cnblogs.com/linhaostudy/p/7484587.html
Linux之内存描述符mm_struct相关推荐
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )
文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )
文章目录 一.用户虚拟地址空间组成 二.内存描述符 mm_struct 结构体源码 一.用户虚拟地址空间组成 " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ ...
- 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...
- mm_struct(内存描述符)
文章目录 一.引出概念 二.Linux下数据大致是这样管理 三.mm_struct 一.Linux下查看mm_struct 二.mm_struct是什么? 三.mm_struct 四.vm_area_ ...
- linux 文件指针,Linux中文件描述符fd与文件指针FILE*互相转换实例解析
本文研究的主要是Linux中文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下. 1.文件描述符fd的定义:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进 ...
- 深入理解Linux/Unix文件描述符和epoll
Linux/Unix 文件描述符(File Describer)的本质 Linux/Unix(以下简称Linux)系统中,每个进程都有一个专用的数组,数组的元素是一个结构体,称为文件描述符File D ...
- Linux下文件描述符
Linux下文件描述符 标签: linuxfilelinux内核apacheunixsocket 2012-08-17 15:45 5798人阅读 评论(0) 收藏 举报 分类: 调优和安全(5) 版 ...
- linux下文件描述符的介绍
linux下文件描述符的介绍 (2012-10-02 16:01:56) 转载▼ 标签: 描述符 调用 返回 进程 限制 it 分类:linux 当某个程序打开文件时,操作系统返回相应的文件描述符,程 ...
- linux用户文件描述符2表示,Linux下文件描述符
Linux下文件描述符 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1,依此类推.Unix操作系 统通常给每个进程能打开的文件数量强加一个 ...
最新文章
- Python 中的进程、线程、协程、同步、异步、回调(一)
- solr安装-tomcat+solrCloud构建稳健solr集群
- 第九周项目实践3 利用二叉树遍历思想解决问题
- python数据组织存在维度吗_用Python将统计数据不存在的记录按维度对应指标补齐...
- ASP.NET Core 2.0 配置NLog日志组件
- 给js文件加一些参数
- BZOJ 2458 最小三角形(分治)
- 手动编译php,手动编译安装php7的方式
- 【并查集】银河英雄传说 (luogu 1196/ssl 1225)
- coverity代码检测工具介绍_微服务测试之静态代码扫描
- JavaEE实战班第二天
- 编程道场_编码道场教给我有关敏捷的知识
- hdu(杭电oj)输入输出练习题目总结
- JavaScript笔记2———js的数据类型
- python bytes_Python bytes()
- 数据量太大,节省内存的几种方式
- TreeSet,海康威视java校招面试题
- shareSDK 微信分享闪退问题
- GitLab分支合并时,选择use ours是指分支而不是主分支
- 交换机 POE 学习
热门文章
- 回归(regression)与分类(classification)的区别
- 八数码 poj 1077 广搜 A* IDA*
- 设计模式在C语言中的应用--读nginx源码
- 数据库经典书籍--SQL必知必会
- C#之windows桌面软件第一课:倒时器软件
- eclipse如何导出WAR包
- 以指针的形式和以下标的形式访问指针?以指针的形式和以下标的形式访问数组?
- ES6的 super 关键字
- 解决LNMP环境下客户端远程连接不上mysql的问题(已经排除防火墙/selinux问题)...
- nodeJS之crypto加密