• 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;
    };

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/feng9exe/p/6883707.html
Copyright © 2020-2023  润新知