欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux內(nèi)存描述符mm_struct實例詳解

 更新時間:2017年09月06日 17:07:33   投稿:mrr  
Linux對于內(nèi)存的管理涉及到非常多的方面,這篇文章首先從對進程虛擬地址空間的管理說起,具體實例代碼大家通過本文學(xué)習(xí)下吧

Linux對于內(nèi)存的管理涉及到非常多的方面,這篇文章首先從對進程虛擬地址空間的管理說起。(所依據(jù)的代碼是2.6.32.60)

無論是內(nèi)核線程還是用戶進程,對于內(nèi)核來說,無非都是task_struct這個數(shù)據(jù)結(jié)構(gòu)的一個實例而已,task_struct被稱為進程描述符(process descriptor),因為它記錄了這個進程所有的context。其中有一個被稱為'內(nèi)存描述符‘(memory descriptor)的數(shù)據(jù)結(jié)構(gòu)mm_struct,抽象并描述了Linux視角下管理進程地址空間的所有信息。

mm_struct定義在include/linux/mm_types.h中,其中的域抽象了進程的地址空間,如下圖所示:

struct mm_struct {
  struct vm_area_struct * mmap;  //指向虛擬區(qū)間(VMA)的鏈表
  struct rb_root mm_rb;      //指向線性區(qū)對象紅黑樹的根
  struct vm_area_struct * mmap_cache;   //指向最近找到的虛擬區(qū)間
  unsigned long(*get_unmapped_area) (struct file *filp,
  unsigned long addr, unsigned long len,
  unsigned long pgoff, unsigned long flags);//在進程地址空間中搜索有效線性地址區(qū)
  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);//釋放線性地址區(qū)間時調(diào)用的方法
  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;     //內(nèi)核從這個地址開始搜索進程地址空間中線性地址的空閑區(qū)域
  pgd_t * pgd;              //指向頁全局目錄
  atomic_t mm_users;           //次使用計數(shù)器,使用這塊空間的個數(shù)  
  atomic_t mm_count;           //主使用計數(shù)器
  int map_count;             //線性的個數(shù)
  struct rw_semaphore mmap_sem;      //線性區(qū)的讀/寫信號量
  spinlock_t page_table_lock;       //線性區(qū)的自旋鎖和頁表的自旋鎖
  struct list_head mmlist;       //指向內(nèi)存描述符鏈表中的相鄰元素
  /* 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_t
  mm_counter_t _anon_rss; 
  mm_counter_t _swap_usage;
  unsigned long hiwater_rss;  //進程所擁有的最大頁框數(shù)
  unsigned long hiwater_vm;   //進程線性區(qū)中最大頁數(shù)
  unsigned long total_vm, locked_vm, shared_vm, exec_vm;
  //total_vm 進程地址空間的大小(頁數(shù))
  //locked_vm 鎖住而不能換出的頁的個數(shù)
  //shared_vm 共享文件內(nèi)存映射中的頁數(shù)
  unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
  //stack_vm 用戶堆棧中的頁數(shù)
  //reserved_vm 在保留區(qū)中的頁數(shù)或者在特殊線性區(qū)中的頁數(shù)
  //def_flags 線性區(qū)默認的訪問標志
  //nr_ptes 進程的頁表數(shù)
  unsigned long start_code, end_code, start_data, end_data;
  //start_code 可執(zhí)行代碼的起始地址
  //end_code 可執(zhí)行代碼的最后地址
  //start_data已初始化數(shù)據(jù)的起始地址
  // end_data已初始化數(shù)據(jù)的最后地址
  unsigned long start_brk, brk, start_stack;
  //start_stack堆的起始位置
  //brk堆的當前的最后地址
  //用戶堆棧的起始地址
  unsigned long arg_start, arg_end, env_start, env_end;
  //arg_start 命令行參數(shù)的起始地址
  //arg_end命令行參數(shù)的起始地址
  //env_start環(huán)境變量的起始地址
  //env_end環(huán)境變量的最后地址
  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; //指向有關(guān)特定結(jié)構(gòu)體系信息的表
  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_AIO
  spinlock_t       ioctx_lock; //用于保護異步I/O上下文鏈表的鎖
  struct hlist_head    ioctx_list;//異步I/O上下文
#endif
#ifdef CONFIG_MM_OWNER
  struct task_struct *owner;
#endif
#ifdef CONFIG_PROC_FS
  unsigned long num_exe_file_vmas;
#endif
#ifdef CONFIG_MMU_NOTIFIER
  struct mmu_notifier_mm *mmu_notifier_mm;
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
  pgtable_t pmd_huge_pte; /* protected by page_table_lock */
#endif
#ifdef __GENKSYMS__
  unsigned long rh_reserved[2];
#else
  //有多少任務(wù)分享這個mm OOM_DISABLE
  union {
    unsigned long rh_reserved_aux;
    atomic_t oom_disable_count;
  };
  /* base of lib map area (ASCII armour) */
  unsigned long shlib_base;
#endif
};


總結(jié)

以上所述是小編給大家介紹的Linux內(nèi)存描述符mm_struct實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評論