Linux内存描述符mm_struct实例详解
发布时间 - 2026-01-11 03:08:24 点击率:次Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起。(所依据的代码是2.6.32.60)

无论是内核线程还是用户进程,对于内核来说,无非都是task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为'内存描述符‘(memory descriptor)的数据结构mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息。
mm_struct定义在include/linux/mm_types.h中,其中的域抽象了进程的地址空间,如下图所示:
struct mm_struct {
struct vm_area_struct * mmap; //指向虚拟区间(VMA)的链表
struct rb_root mm_rb; //指向线性区对象红黑树的根
struct vm_area_struct * mmap_cache; //指向最近找到的虚拟区间
unsigned long(*get_unmapped_area) (struct file *filp,
unsigned long addr, unsigned long len,
unsigned long pgoff, unsigned long flags);//在进程地址空间中搜索有效线性地址区
unsigned long(*get_unmapped_exec_area) (struct file *filp,
unsigned long addr, unsigned long len,
unsigned long pgoff, unsigned long flags);
void(*unmap_area) (struct mm_struct *mm, unsigned long addr);//释放线性地址区间时调用的方法
unsigned long mmap_base; /* base of mmap area */
unsigned long task_size; /* size of task vm space */
unsigned long cached_hole_size;
unsigned long free_area_cache; //内核从这个地址开始搜索进程地址空间中线性地址的空闲区域
pgd_t * pgd; //指向页全局目录
atomic_t mm_users; //次使用计数器,使用这块空间的个数
atomic_t mm_count; //主使用计数器
int map_count; //线性的个数
struct rw_semaphore mmap_sem; //线性区的读/写信号量
spinlock_t page_table_lock; //线性区的自旋锁和页表的自旋锁
struct list_head mmlist; //指向内存描述符链表中的相邻元素
/* Special counters, in some configurations protected by the
* page_table_lock, in other configurations by being atomic.
*/
mm_counter_t _file_rss; //mm_counter_t代表的类型实际是typedef atomic_long_t
mm_counter_t _anon_rss;
mm_counter_t _swap_usage;
unsigned long hiwater_rss; //进程所拥有的最大页框数
unsigned long hiwater_vm; //进程线性区中最大页数
unsigned long total_vm, locked_vm, shared_vm, exec_vm;
//total_vm 进程地址空间的大小(页数)
//locked_vm 锁住而不能换出的页的个数
//shared_vm 共享文件内存映射中的页数
unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
//stack_vm 用户堆栈中的页数
//reserved_vm 在保留区中的页数或者在特殊线性区中的页数
//def_flags 线性区默认的访问标志
//nr_ptes 进程的页表数
unsigned long start_code, end_code, start_data, end_data;
//start_code 可执行代码的起始地址
//end_code 可执行代码的最后地址
//start_data已初始化数据的起始地址
// end_data已初始化数据的最后地址
unsigned long start_brk, brk, start_stack;
//start_stack堆的起始位置
//brk堆的当前的最后地址
//用户堆栈的起始地址
unsigned long arg_start, arg_end, env_start, env_end;
//arg_start 命令行参数的起始地址
//arg_end命令行参数的起始地址
//env_start环境变量的起始地址
//env_end环境变量的最后地址
unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */
struct linux_binfmt *binfmt;
cpumask_t cpu_vm_mask; //用于惰性TLB交换的位掩码
/* Architecture-specific MM context */
mm_context_t context; //指向有关特定结构体系信息的表
unsigned int faultstamp;
unsigned int token_priority;
unsigned int last_interval;
unsigned long flags; /* Must use atomic bitops to access the bits */
struct core_state *core_state; /* coredumping support */
#ifdef CONFIG_AIO
spinlock_t ioctx_lock; //用于保护异步I/O上下文链表的锁
struct hlist_head ioctx_list;//异步I/O上下文
#endif
#ifdef CONFIG_MM_OWNER
struct task_struct *owner;
#endif
#ifdef CONFIG_PROC_FS
unsigned long num_exe_file_vmas;
#endif
#ifdef CONFIG_MMU_NOTIFIER
struct mmu_notifier_mm *mmu_notifier_mm;
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
pgtable_t pmd_huge_pte; /* protected by page_table_lock */
#endif
#ifdef __GENKSYMS__
unsigned long rh_reserved[2];
#else
//有多少任务分享这个mm OOM_DISABLE
union {
unsigned long rh_reserved_aux;
atomic_t oom_disable_count;
};
/* base of lib map area (ASCII armour) */
unsigned long shlib_base;
#endif
};
总结
以上所述是小编给大家介绍的Linux内存描述符mm_struct实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# Linux内存描述符
# linux
# mm_struct
# Linux下用Valgrind做检查(防止内存泄露)
# jmeter在linux系统下运行及本地内存调优的方法详解
# linux swap交换内存扩容的方法
# Python3监控windows
# linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
# Linux内核私闯进程地址空间并修改进程内存的方法
# 如何利用Bash脚本监控Linux的内存使用情况
# Linux系统查看CPU、机器型号、内存等信息
# Linux中大内存页Oracle数据库优化的方法
# 详解Linux内核内存管理架构
# Linux系统下利用C程序输出某进程的内存占用信息
# 解决Linux下php-fpm进程过多导致内存耗尽问题
# python监控linux内存并写入mongodb(推荐)
# Linux共享内存实现机制的详解
# Linux 下如何检查内存使用率
# 区中
# 数据结构
# 链表
# 被称为
# 小编
# 命令行
# 可执行
# 都是
# 信号量
# 在此
# 有多少
# 给大家
# 因为它
# 所示
# 这块
# 这篇文章
# 涉及到
# 所述
# 给我留言
# 感谢大家
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何获取PHP WAP自助建站系统源码?
如何在香港免费服务器上快速搭建网站?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
BootStrap整体框架之基础布局组件
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
5种Android数据存储方式汇总
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
大同网页,大同瑞慈医院官网?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何实现多对多模型关联?(Eloquent教程)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
高防服务器:AI智能防御DDoS攻击与数据安全保障
深圳网站制作的公司有哪些,dido官方网站?
网站制作壁纸教程视频,电脑壁纸网站?
JavaScript Ajax实现异步通信
如何在建站之星绑定自定义域名?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在云主机上快速搭建网站?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Swift中循环语句中的转移语句 break 和 continue
清除minerd进程的简单方法
历史网站制作软件,华为如何找回被删除的网站?
晋江文学城电脑版官网 晋江文学城网页版直接进入
Laravel如何实现用户注册和登录?(Auth脚手架指南)
微信小程序 require机制详解及实例代码
魔毅自助建站系统:模板定制与SEO优化一键生成指南
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
免费视频制作网站,更新又快又好的免费电影网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
实例解析angularjs的filter过滤器
如何用好域名打造高点击率的自主建站?
详解MySQL数据库的安装与密码配置
如何快速打造个性化非模板自助建站?
智能起名网站制作软件有哪些,制作logo的软件?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
javascript读取文本节点方法小结
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何创建自定义Facades?(详细步骤)
轻松掌握MySQL函数中的last_insert_id()
如何在云虚拟主机上快速搭建个人网站?

