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