每个进程都有自己的mm_struct,使得每个进程都有自己独立的虚拟的地址空间
在每个进程的task_struct里都会有一个struct mm_struct*指向每个进程自己的mm_struct,mm_sruct是内存描述符,在每个mm_struct又都有一个pgd_t * 使其指向页表,然后通过页表实现从虚拟地址到物理地址的映射。

Linux虚拟地址用户空间分布

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_tmm_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_AIOspinlock_t              ioctx_lock;  //用于保护异步I/O上下文链表的锁struct hlist_head       ioctx_list;//异步I/O上下文
#endif
#ifdef CONFIG_MM_OWNERstruct task_struct *owner;
#endif#ifdef CONFIG_PROC_FSunsigned long num_exe_file_vmas;
#endif
#ifdef CONFIG_MMU_NOTIFIERstruct mmu_notifier_mm *mmu_notifier_mm;
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGEpgtable_t pmd_huge_pte; /* protected by page_table_lock */
#endif
#ifdef __GENKSYMS__unsigned long rh_reserved[2];
#else//有多少任务分享这个mm OOM_DISABLEunion {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相关推荐

  1. 【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_ ...

  2. linux按进程分配物理内存,linux下内存管理学习心得(一)

    最近在学习内存管理的时候,发现对linux下的所谓内存如何管理如何分配都不熟悉,通过最近的查阅资料可总结如下,如有不妥之处欢迎大家批评与指正. 总的的来说linux的内存管理其实主要难理解的是以下几个 ...

  3. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

    文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...

  4. Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)

    Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...

  5. Linux kernel内存管理之OOM相关参数

    一.OOM概念 OOM是Out Of Memory(内存溢出)的缩写,虽然linux kernel的内存管理有很多机制(从cache中回收.swap out等)可以满足用户空间的各种虚拟内存需求,但是 ...

  6. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  7. 全网独一无二值得收藏的,Linux的内存管理

    Linux的内存管理 Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理和进程虚拟内存.内核的内存管理是Linux内存管理的核心,所以我们先对内核的内存管理进行简介. 一. ...

  8. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  9. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏 ...

  10. 转:浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

最新文章

  1. Python的数据库操作(Sqlalchemy)
  2. Android知识点小结
  3. Linux-diff和diff3命令
  4. JVM调优总结 -Xms -Xmx -Xmn -Xss(转载)
  5. libevent源码学习-----event_base事件循环
  6. pymysql使用变化的变量,构造SQL语句
  7. 1.请求安全-- MD5的必要性以及实际应用场景
  8. 7-7Hadoop学习之常用Linux命令与集群配置
  9. 合成PDF文档,合并PDF文档
  10. Android 蓝牙 自动配对连接
  11. 获取某一天的开始时间
  12. SVN迁移IP变更地址修改relocate
  13. CSDN 博客添加无水印图片的方法
  14. core dump 1
  15. Anroidstudio安装
  16. 算法刷题【洛谷P1593】因子和(附等比数列求和公式推导)
  17. jsp页面显示源码实现
  18. TM4C123-TivaWare中函数名与函数指针在ROM中的映射
  19. ORA-39126: 在 KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS] 中 Worker 发生意外致命错误
  20. Java面向对象编程-枚举类

热门文章

  1. Service自动被销毁?
  2. 金蝶K3批量出库语句与执行方法
  3. 计算机科学导论课后感,关于《计算机科学导论》课程教学的思考
  4. 网络编程必读经典书籍
  5. 数字图像处理复习记录(一)图像平滑、图像锐化、间隔检测
  6. 基于单片机的智能排队叫号系统设计
  7. 大数据Hadoop(三十):Hadoop3.x的介绍
  8. jvm 调优 2020.09.07
  9. 欧姆龙cp1h指令讲解_欧姆龙cp1h常用指令学习(八)字符串处理指令
  10. 使用python爬取行政区划