文章目录

  • 一、用户虚拟地址空间组成
  • 二、内存描述符 mm_struct 结构体源码

一、用户虚拟地址空间组成


" 用户虚拟地址空间 " 包括以下区域 :

① 代码段

② 数据段

③ 未初始化数据段

④ 动态库 代码段 , 数据段 , 未初始化数据段 ;

堆内存 : 通过 malloc brk vmalloc 等函数 申请的 动态分配 的内存 ;

栈内存 : 存放 局部变量 和 函数调用栈 ;

内存映射区 : 将 文件 通过 mmap 函数 映射到 " 虚拟地址空间 " 的 " 内存映射区 " ;

环境变量与参数 : 在 栈底 存放着程序运行的 环境变量 与 参数配置 信息 ;

二、内存描述符 mm_struct 结构体源码


在 Linux 内核中 , 使用 " 内存描述符 " mm_struct 结构体 代表 " 用户虚拟地址内存空间 " ,

mm_struct 结构体 在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置 ;

mm_struct 结构体源码如下 :

struct mm_struct {struct vm_area_struct *mmap;       /* list of VMAs */struct rb_root mm_rb;u32 vmacache_seqnum;                   /* per-thread vmacache */
#ifdef CONFIG_MMUunsigned long (*get_unmapped_area) (struct file *filp,unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags);
#endifunsigned long mmap_base;      /* base of mmap area */unsigned long mmap_legacy_base;         /* base of mmap area in bottom-up allocations */
#ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES/* Base adresses for compatible mmap() */unsigned long mmap_compat_base;unsigned long mmap_compat_legacy_base;
#endifunsigned long task_size;      /* size of task vm space */unsigned long highest_vm_end;        /* highest vma end address */pgd_t * pgd;/*** @mm_users: The number of users including userspace.** Use mmget()/mmget_not_zero()/mmput() to modify. When this drops* to 0 (i.e. when the task exits and there are no other temporary* reference holders), we also release a reference on @mm_count* (which may then free the &struct mm_struct if @mm_count also* drops to 0).*/atomic_t mm_users;/*** @mm_count: The number of references to &struct mm_struct* (@mm_users count as 1).** Use mmgrab()/mmdrop() to modify. When this drops to 0, the* &struct mm_struct is freed.*/atomic_t mm_count;atomic_long_t nr_ptes;           /* PTE page table pages */
#if CONFIG_PGTABLE_LEVELS > 2atomic_long_t nr_pmds;          /* PMD page table pages */
#endifint map_count;                /* number of VMAs */spinlock_t page_table_lock;     /* Protects page tables and some counters */struct rw_semaphore mmap_sem;struct list_head mmlist;       /* List of maybe swapped mm's. These are globally strung* together off init_mm.mmlist, and are protected* by mmlist_lock*/unsigned long hiwater_rss;   /* High-watermark of RSS usage */unsigned long hiwater_vm;  /* High-water virtual memory usage */unsigned long total_vm;        /* Total pages mapped */unsigned long locked_vm;    /* Pages that have PG_mlocked set */unsigned long pinned_vm;    /* Refcount permanently increased */unsigned long data_vm;      /* VM_WRITE & ~VM_SHARED & ~VM_STACK */unsigned long exec_vm;       /* VM_EXEC & ~VM_WRITE & ~VM_STACK */unsigned long stack_vm;        /* VM_STACK */unsigned long def_flags;unsigned long start_code, end_code, start_data, end_data;unsigned long start_brk, brk, start_stack;unsigned long arg_start, arg_end, env_start, env_end;unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv *//** Special counters, in some configurations protected by the* page_table_lock, in other configurations by being atomic.*/struct mm_rss_stat rss_stat;struct linux_binfmt *binfmt;cpumask_var_t cpu_vm_mask_var;/* Architecture-specific MM context */mm_context_t context;unsigned long flags; /* Must use atomic bitops to access the bits */struct core_state *core_state; /* coredumping support */
#ifdef CONFIG_AIOspinlock_t         ioctx_lock;struct kioctx_table __rcu    *ioctx_table;
#endif
#ifdef CONFIG_MEMCG/** "owner" points to a task that is regarded as the canonical* user/owner of this mm. All of the following must be true in* order for it to be changed:** current == mm->owner* current->mm != mm* new_owner->mm == mm* new_owner->alloc_lock is held*/struct task_struct __rcu *owner;
#endifstruct user_namespace *user_ns;/* store ref to file /proc/<pid>/exe symlink points to */struct file __rcu *exe_file;
#ifdef CONFIG_MMU_NOTIFIERstruct mmu_notifier_mm *mmu_notifier_mm;
#endif
#if defined(CONFIG_TRANSPARENT_HUGEPAGE) && !USE_SPLIT_PMD_PTLOCKSpgtable_t pmd_huge_pte; /* protected by page_table_lock */
#endif
#ifdef CONFIG_CPUMASK_OFFSTACKstruct cpumask cpumask_allocation;
#endif
#ifdef CONFIG_NUMA_BALANCING/** numa_next_scan is the next time that the PTEs will be marked* pte_numa. NUMA hinting faults will gather statistics and migrate* pages to new nodes if necessary.*/unsigned long numa_next_scan;/* Restart point for scanning and setting pte_numa */unsigned long numa_scan_offset;/* numa_scan_seq prevents two threads setting pte_numa */int numa_scan_seq;
#endif
#if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION)/** An operation with batched TLB flushing is going on. Anything that* can move process memory needs to flush the TLB when moving a* PROT_NONE or PROT_NUMA mapped page.*/bool tlb_flush_pending;
#endifstruct uprobes_state uprobes_state;
#ifdef CONFIG_HUGETLB_PAGEatomic_long_t hugetlb_usage;
#endifstruct work_struct async_put_work;
};

【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 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  3. 【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )

    文章目录 一.free_area 空闲区域结构体源码分析 二.分配标志位 三.GFP_ZONE_TABLE 标志位区域类型映射表 四.分配标志位对应的内存区域类型 一.free_area 空闲区域结构 ...

  4. 【Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )

    文章目录 一.内存区域 zone 简介 二.zone 结构体源码分析 1.watermark 成员 2.lowmem_reserve 成员 3.zone_pgdat 成员 4.pageset 成员 5 ...

  5. 【Linux 内核 内存管理】Linux 内核堆内存管理 ③ ( CPU 计数器瓶颈 | per-CPU 计数器 | Linux 内核 percpu_counter 结构体源码 )

    文章目录 一.CPU 计数器瓶颈 二.per-CPU 计数器及 percpu_counter 结构体源码 一.CPU 计数器瓶颈 如果 操作系统 中有 多个 CPU , 假设只有一个 CPU 计数器工 ...

  6. 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

    文章目录 一.虚拟地址空间布局架构 二.用户虚拟地址空间划分 一.虚拟地址空间布局架构 在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 6 ...

  7. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

    转自:http://blog.csdn.net/gatieme/article/details/51383272 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  8. Linux进程描述符task_struct结构体简析

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个 ...

  9. Linux进程描述符task_struct结构体

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.进程的两个基本元素是程序和代码相关的数据集,进程是一种动态描述,但是并不代表所有的进程都在运行.每个 ...

最新文章

  1. sigterm信号_Golang之信号处理(Signal)
  2. Docker存储空间不够,如何Docker修改存储位置以进行扩容
  3. Java面向对象——基础2 封装、继承、多态
  4. jquery validate表单校验
  5. 《我们不一样团队》项目需求分析改进
  6. HighCharts:图表默认的英文日期改为中文显示
  7. Unix编程艺术-翻译-开篇
  8. 豪赌激光电视,海信算是赢了吗?
  9. 【Matlab图像隐写】DCT数字水印嵌入与提取【含GUI源码 943期】
  10. h5调用手机相册摄像头以及文件夹
  11. 向gitlab推送push时报nullSha1: contains entries pointing to null sha1
  12. IoT黑板报:美允许4G技术与WiFi共享5G频段
  13. UINavigation导航栏和UITabbar布局和样式
  14. python怎么处理中英文符号网名_英文带符号的网名_英文网名带符号加中文
  15. 马来西亚”李佳琦“,TikTok一个月涨粉180万
  16. 手把手教程Atlas安装与使用
  17. 穷举法解锁华为手机bootloader
  18. 两台群晖服务器如何同步文件,两台群晖之间Moments异地同步方法探索
  19. 谷粒商城P72根据接口文档编写获取分类的属性分组
  20. 什么是设计模式 ?与其中几项设计模式

热门文章

  1. CSS的单位及css3的calc()及line-height百分比
  2. ***S 2012 交互式报表 -- 钻取式报表
  3. 公钥,私钥,SSL(讲的很生动)
  4. jquery隐藏或者显示一个元素
  5. 软件能力[置顶] 程序员如何成为设计师,软件公司如何成为苹果?
  6. 为了熟悉再一次的配置Postfix
  7. 字节流的 创建 写入文字 复制文件
  8. nginx 卸载后重新安装/etc/nginx配置文件没了,cannot open /etc/nginx/nginx.conf (No such file or directory)...
  9. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
  10. react-native 原生組件封裝與原生模塊和js的交互