mm_struct简要解析

http://blog.chinaunix.net/uid-20729583-id-1884615.html

struct mm_struct {
    /*
        指向线性区对象的链表头
    */
    struct vm_area_struct    *mmap;
    /*
        指向线性区对象的红-黑树
    */    
    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);
    /*
        释放线性区时调用的方法
    */
    void (*unmap_area)(struct mm_struct *mm,unsigned long addr);
    /*
        标识第一个分配的匿名线性区或者是文件内存映射的线性地址
    */
    unsigned long mmap_base;
    /*
        
    */
    unsigned long task_size;
    
    unsigned long cache_hole_size;
    /*
        内核从这个地址开始搜索进程地址空间中线性地址的空闲区间
    */
    unsigned long free_area_cache;
    /*
        指向页全局目录
    */
    pgd_t *pgd;
    /*
        存放共享mm_struct数据结构的轻量级进程的个数
    */
    atomic_t mm_users;
    /*
        内存描述符的主使用计数器,每次mm_count递减时,内核都要检查它是否变为0,如
        果是,就要解除这个内存描述符,因为不再有用户使用它
    */
    atomic_t mm_count;
    /*
        线性区的个数
    */
    int map_count;
    /*
            
    */
    struct rw_semaphore mmap_sem;
    /*
        线性区的自旋锁和页表的自旋锁
    */
    spinlock_t page_table_lock;
    /*
        存放链表相邻元素的地址,第一个元素是init_mm的mm_list字段
    */
    struct list_head mmlist;
    
    mm_counter_t _file_rss;
    mm_counter_t _anon_rss;
    /*
        进程所拥有的最大页框数    
    */
    unsigned long hiwater_rss;
    /*
        进程线性区中的最大页数
    */
    unsigned long hiwater_vm;
    /*
        进程地址空间的大小,"锁住"而不能换出的页的个数,共享文件内存映射中的页数,
        可执行内存映射中的页数    
    */
    unsigned long total_vm,locked_vm,shared_vm,exec_vm;
    /*
        用户态堆栈中的页数,在保留区中的页数或者是在特殊线性区中的页数,线性区默认
        的访问标志,this进程的页表数        
    */
    unsigned long stack_vm,reserved_vm,def_flags,nr_ptes;
    /*
        可执行代码开始地址,结束地址,已初始化数据的开始地址,结束地址
    */
    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;
    /*
        开始执行ELF程序时会使用到saved_auxv参数        
    */
    unsigned long saved_auxv[AT_VECTOR_SIZE];
    /*
        用于懒惰TLB交换的位掩码
    */
    cpumask_t    cpu_vm_mask;
    /*
        指向有关特定体系结构信息的表
    */
    mm_context_t context;
    /*
        
    */
    unsigned int faultstamp;
    /*
        
    */
    unsigned int token_priority;
    /*
        
    */
    unsigned int last_interval;
    /*
        线性区默认的访问标志(访问设置相关位的时候,必须使用原子操作来解决)
    */
    unsigned long flags;
    /*
        正在把进程地址空间的内容卸载到转储文件中的轻量级进程的数量
    */
    int core_waiters;
    /*
        指向创建内存转储文件时的补充原语
    */
    struct completion *core_startup_done,core_done;
    /*
        用于异步I/O上下文链表的锁    
    */
    rwlock_t ioctx_list_lock;
    /*
        异步I/O上下文链表
    */
    struct kioctx *ioctx_list;
};

转载于:https://www.cnblogs.com/feng9exe/p/6883707.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mm_struct是Linux内核中用于管理进程地址空间的数据结构,它定义在<linux/mm_types.h>头文件中。 该结构体的定义包括了进程的许多重要信息,如进程的内存映射表,虚拟地址空间的大小,以及进程的用户态和内核态栈等。它还包含了指向进程地址空间的pgd指针,以及指向内存管理器的指针,用于在内存不足时分配和回收进程的物理内存。 mm_struct结构体的定义如下: ``` struct mm_struct { struct vm_area_struct *mmap; /* 进程的内存映射表 */ struct rb_root mm_rb; /* 虚拟地址区间红黑树 */ struct vm_area_struct *mmap_cache; /* 最近使用的内存映射 */ unsigned long task_size; /* 进程虚拟地址空间的大小 */ unsigned long start_code, end_code; /* 可执行代码段的开始和结束地址 */ unsigned long start_data, end_data; /* 数据段的开始和结束地址 */ unsigned long start_brk, brk; /* 进程堆的开始和结束地址 */ unsigned long start_stack; /* 用户态栈的开始地址 */ unsigned long arg_start, arg_end; /* 进程参数的开始和结束地址 */ unsigned long env_start, env_end; /* 进程环境变量的开始和结束地址 */ unsigned long saved_auxv[AT_VECTOR_SIZE]; /* 辅助向量 */ pgd_t *pgd; /* 进程的页表指针 */ atomic_t mm_users; /* 进程共享该地址空间的用户数 */ atomic_t mm_count; /* 进程共享该地址空间的引用计数 */ int map_count; /* 进程内存映射表中的区间数 */ spinlock_t page_table_lock; /* 页表锁 */ struct rw_semaphore mmap_sem; /* 内存映射表锁 */ struct list_head mmlist; /* 进程地址空间的链表 */ unsigned long hiwater_rss; /* 进程使用的最大物理内存 */ unsigned long hiwater_vm; /* 进程使用的最大虚拟内存 */ unsigned long total_vm; /* 进程使用的总虚拟内存 */ unsigned long locked_vm; /* 进程使用的锁定虚拟内存 */ unsigned long pinned_vm; /* 进程使用的固定虚拟内存 */ unsigned long data_vm; /* 进程使用的数据段虚拟内存 */ unsigned long exec_vm; /* 进程使用的可执行代码段虚拟内存 */ unsigned long stack_vm; /* 进程使用的用户态栈虚拟内存 */ unsigned long def_flags; /* 进程缺省的内存映射标志 */ unsigned long nr_ptes; /* 进程使用的页表条目数 */ unsigned long nr_pmds; /* 进程使用的页中页条目数 */ unsigned long nr_puds; /* 进程使用的页上页条目数 */ unsigned long nr_p4ds; /* 进程使用的页上页上页条目数 */ struct task_struct *owner; /* 拥有该地址空间的进程 */ struct file *exe_file; /* 执行文件的文件指针 */ }; ``` 在进程创建时,Linux内核会为该进程分配一个新的mm_struct结构体,并初始化其中的各个字段。当进程调用fork()函数创建子进程时,子进程会共享父进程的mm_struct结构体,使得子进程和父进程共享同一个虚拟地址空间。在进程结束时,Linux内核会回收该进程的mm_struct结构体及其相关资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值