Linux內(nèi)存描述符mm_struct實(shí)例詳解
Linux對(duì)于內(nèi)存的管理涉及到非常多的方面,這篇文章首先從對(duì)進(jìn)程虛擬地址空間的管理說(shuō)起。(所依據(jù)的代碼是2.6.32.60)
無(wú)論是內(nèi)核線程還是用戶進(jìn)程,對(duì)于內(nèi)核來(lái)說(shuō),無(wú)非都是task_struct這個(gè)數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)例而已,task_struct被稱為進(jìn)程描述符(process descriptor),因?yàn)樗涗浟诉@個(gè)進(jìn)程所有的context。其中有一個(gè)被稱為'內(nèi)存描述符‘(memory descriptor)的數(shù)據(jù)結(jié)構(gòu)mm_struct,抽象并描述了Linux視角下管理進(jìn)程地址空間的所有信息。
mm_struct定義在include/linux/mm_types.h中,其中的域抽象了進(jìn)程的地址空間,如下圖所示:

struct mm_struct {
struct vm_area_struct * mmap; //指向虛擬區(qū)間(VMA)的鏈表
struct rb_root mm_rb; //指向線性區(qū)對(duì)象紅黑樹(shù)的根
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);//在進(jìn)程地址空間中搜索有效線性地址區(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ū)間時(shí)調(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)核從這個(gè)地址開(kāi)始搜索進(jìn)程地址空間中線性地址的空閑區(qū)域
pgd_t * pgd; //指向頁(yè)全局目錄
atomic_t mm_users; //次使用計(jì)數(shù)器,使用這塊空間的個(gè)數(shù)
atomic_t mm_count; //主使用計(jì)數(shù)器
int map_count; //線性的個(gè)數(shù)
struct rw_semaphore mmap_sem; //線性區(qū)的讀/寫(xiě)信號(hào)量
spinlock_t page_table_lock; //線性區(qū)的自旋鎖和頁(yè)表的自旋鎖
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代表的類(lèi)型實(shí)際是typedef atomic_long_t
mm_counter_t _anon_rss;
mm_counter_t _swap_usage;
unsigned long hiwater_rss; //進(jìn)程所擁有的最大頁(yè)框數(shù)
unsigned long hiwater_vm; //進(jìn)程線性區(qū)中最大頁(yè)數(shù)
unsigned long total_vm, locked_vm, shared_vm, exec_vm;
//total_vm 進(jìn)程地址空間的大小(頁(yè)數(shù))
//locked_vm 鎖住而不能換出的頁(yè)的個(gè)數(shù)
//shared_vm 共享文件內(nèi)存映射中的頁(yè)數(shù)
unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
//stack_vm 用戶堆棧中的頁(yè)數(shù)
//reserved_vm 在保留區(qū)中的頁(yè)數(shù)或者在特殊線性區(qū)中的頁(yè)數(shù)
//def_flags 線性區(qū)默認(rèn)的訪問(wèn)標(biāo)志
//nr_ptes 進(jìn)程的頁(yè)表數(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堆的當(dāng)前的最后地址
//用戶堆棧的起始地址
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; //用于保護(hù)異步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ù)分享這個(gè)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實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Linux下用Valgrind做檢查(防止內(nèi)存泄露)
- jmeter在linux系統(tǒng)下運(yùn)行及本地內(nèi)存調(diào)優(yōu)的方法詳解
- linux swap交換內(nèi)存擴(kuò)容的方法
- Python3監(jiān)控windows,linux系統(tǒng)的CPU、硬盤(pán)、內(nèi)存使用率和各個(gè)端口的開(kāi)啟情況詳細(xì)代碼實(shí)例
- Linux內(nèi)核私闖進(jìn)程地址空間并修改進(jìn)程內(nèi)存的方法
- 如何利用Bash腳本監(jiān)控Linux的內(nèi)存使用情況
- Linux系統(tǒng)查看CPU、機(jī)器型號(hào)、內(nèi)存等信息
- Linux中大內(nèi)存頁(yè)Oracle數(shù)據(jù)庫(kù)優(yōu)化的方法
- 詳解Linux內(nèi)核內(nèi)存管理架構(gòu)
- Linux系統(tǒng)下利用C程序輸出某進(jìn)程的內(nèi)存占用信息
- 解決Linux下php-fpm進(jìn)程過(guò)多導(dǎo)致內(nèi)存耗盡問(wèn)題
- python監(jiān)控linux內(nèi)存并寫(xiě)入mongodb(推薦)
- Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解
- Linux 下如何檢查內(nèi)存使用率
相關(guān)文章
linux top命令詳解與輸出結(jié)果說(shuō)明
top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況,常用于服務(wù)端性能分析,本文主要講解top命令參數(shù)詳解與輸出結(jié)果說(shuō)明2018-03-03
分布式監(jiān)控系統(tǒng)Zabbix3.2添加自動(dòng)發(fā)現(xiàn)磁盤(pán)IO并注冊(cè)監(jiān)控(推薦)
zabbix自帶的“Template OS Linux”模板可自動(dòng)發(fā)現(xiàn)磁盤(pán)并監(jiān)控空間利用率,小編這次介紹分布式監(jiān)控系統(tǒng)Zabbix3.2添加自動(dòng)發(fā)現(xiàn)磁盤(pán)IO并注冊(cè)監(jiān)控,需要的朋友參考下吧2018-01-01
CentOS的圖形安裝及初始環(huán)境設(shè)置教程
CentOS是當(dāng)前最流行的商業(yè)版Linux -- Red Hat Enterprise Linux(RHEL)的克隆版。它和RHEL的區(qū)別除了沒(méi)有RHEL一樣的技術(shù)支持以外,就是修正了RHEL已知的一些Bug,所以,其穩(wěn)定性值得我們信賴。2008-05-05
vm下centos7 mini版 NAT模式下配置靜態(tài)IP的方法
這篇文章主要介紹了vm下centos7 mini版 NAT模式下配置靜態(tài)IP 的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
linux下禁止root遠(yuǎn)程登錄和添加新用戶的方法
這篇文章主要介紹了linux下禁止root遠(yuǎn)程登錄和添加新用戶的方法,需要的朋友可以參考下2018-05-05

