国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux內存描述符mm_struct實例詳解

2020-10-28 18:44:50
字體:
來源:轉載
供稿:網友

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

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

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

struct mm_struct {  struct vm_area_struct * mmap;  //指向虛擬區間(VMA)的鏈表  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);//在進程地址空間中搜索有效線性地址區  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);//釋放線性地址區間時調用的方法  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;     //內核從這個地址開始搜索進程地址空間中線性地址的空閑區域  pgd_t * pgd;              //指向頁全局目錄  atomic_t mm_users;           //次使用計數器,使用這塊空間的個數    atomic_t mm_count;           //主使用計數器  int map_count;             //線性的個數  struct rw_semaphore mmap_sem;      //線性區的讀/寫信號量  spinlock_t page_table_lock;       //線性區的自旋鎖和頁表的自旋鎖  struct list_head mmlist;       //指向內存描述符鏈表中的相鄰元素  /* 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;  //進程所擁有的最大頁框數  unsigned long hiwater_vm;   //進程線性區中最大頁數  unsigned long total_vm, locked_vm, shared_vm, exec_vm;  //total_vm 進程地址空間的大小(頁數)  //locked_vm 鎖住而不能換出的頁的個數  //shared_vm 共享文件內存映射中的頁數  unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;  //stack_vm 用戶堆棧中的頁數  //reserved_vm 在保留區中的頁數或者在特殊線性區中的頁數  //def_flags 線性區默認的訪問標志  //nr_ptes 進程的頁表數  unsigned long start_code, end_code, start_data, end_data;  //start_code 可執行代碼的起始地址  //end_code 可執行代碼的最后地址  //start_data已初始化數據的起始地址  // end_data已初始化數據的最后地址  unsigned long start_brk, brk, start_stack;  //start_stack堆的起始位置  //brk堆的當前的最后地址  //用戶堆棧的起始地址  unsigned long arg_start, arg_end, env_start, env_end;  //arg_start 命令行參數的起始地址  //arg_end命令行參數的起始地址  //env_start環境變量的起始地址  //env_end環境變量的最后地址  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; //指向有關特定結構體系信息的表  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  //有多少任務分享這個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};


總結

以上所述是小編給大家介紹的Linux內存描述符mm_struct實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卓资县| 吉木萨尔县| 勐海县| 军事| 宣恩县| 绥阳县| 武清区| 瑞金市| 深泽县| 宝丰县| 任丘市| 忻州市| 江北区| 达孜县| 家居| 胶南市| 濮阳县| 呼伦贝尔市| 怀化市| 稷山县| 广平县| 揭东县| 大足县| 清水河县| 濮阳市| 白山市| 郓城县| 营口市| 金坛市| 普定县| 黄石市| 海宁市| 安康市| 诸城市| 安陆市| 石河子市| 澜沧| 潢川县| 叙永县| 信丰县| 香港|