Linux之記憶體描述符mm_struct

来源:http://www.cnblogs.com/linhaostudy/archive/2017/09/06/7484587.html
-Advertisement-
Play Games

Linux對於記憶體的管理涉及到非常多的方面,這篇文章首先從對進程虛擬地址空間的管理說起。(所依據的代碼是2.6.32.60) 無論是內核線程還是用戶進程,對於內核來說,無非都是task_struct這個數據結構的一個實例而已,task_struct被稱為進程描述符(process descripto ...


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

無論是內核線程還是用戶進程,對於內核來說,無非都是task_struct這個數據結構的一個實例而已,task_struct被稱為進程描述符(process descriptor),因為它記錄了這個進程所有的context。其中有一個被稱為'記憶體描述符‘(memory descriptor)的數據結構mm_struct,抽象並描述了Linux視角下管理進程地址空間的所有信息。 mm_struct定義在include/linux/mm_types.h中,其中的域抽象了進程的地址空間,如下圖所示:

 

  1 struct mm_struct {
  2     struct vm_area_struct * mmap;    //指向虛擬區間(VMA)的鏈表
  3     struct rb_root mm_rb;            //指向線性區對象紅黑樹的根
  4     struct vm_area_struct * mmap_cache;     //指向最近找到的虛擬區間
  5     unsigned long(*get_unmapped_area) (struct file *filp,
  6     unsigned long addr, unsigned long len,
  7     unsigned long pgoff, unsigned long flags);//在進程地址空間中搜索有效線性地址區
  8     unsigned long(*get_unmapped_exec_area) (struct file *filp,
  9         unsigned long addr, unsigned long len,
 10         unsigned long pgoff, unsigned long flags);
 11     void(*unmap_area) (struct mm_struct *mm, unsigned long addr);//釋放線性地址區間時調用的方法
 12     unsigned long mmap_base;                /* base of mmap area */
 13     unsigned long task_size;                /* size of task vm space */
 14 
 15     unsigned long cached_hole_size;
 16     unsigned long free_area_cache;          //內核從這個地址開始搜索進程地址空間中線性地址的空閑區域
 17     pgd_t * pgd;                            //指向頁全局目錄
 18     atomic_t mm_users;                      //次使用計數器,使用這塊空間的個數    
 19     atomic_t mm_count;                      //主使用計數器
 20     int map_count;                          //線性的個數
 21     struct rw_semaphore mmap_sem;           //線性區的讀/寫信號量
 22     spinlock_t page_table_lock;             //線性區的自旋鎖和頁表的自旋鎖
 23 
 24     struct list_head mmlist;              //指向記憶體描述符鏈表中的相鄰元素
 25 
 26     /* Special counters, in some configurations protected by the
 27     * page_table_lock, in other configurations by being atomic.
 28     */
 29     mm_counter_t _file_rss; //mm_counter_t代表的類型實際是typedef atomic_long_t
 30     mm_counter_t _anon_rss;  
 31     mm_counter_t _swap_usage;
 32 
 33     unsigned long hiwater_rss;    //進程所擁有的最大頁框數
 34     unsigned long hiwater_vm;     //進程線性區中最大頁數
 35 
 36     unsigned long total_vm, locked_vm, shared_vm, exec_vm;
 37     //total_vm 進程地址空間的大小(頁數)
 38     //locked_vm 鎖住而不能換出的頁的個數
 39     //shared_vm 共用文件記憶體映射中的頁數
 40 
 41     unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
 42     //stack_vm 用戶堆棧中的頁數
 43     //reserved_vm 在保留區中的頁數或者在特殊線性區中的頁數
 44     //def_flags 線性區預設的訪問標誌
 45     //nr_ptes 進程的頁表數
 46 
 47     unsigned long start_code, end_code, start_data, end_data;
 48     //start_code 可執行代碼的起始地址
 49     //end_code 可執行代碼的最後地址
 50     //start_data已初始化數據的起始地址
 51     // end_data已初始化數據的最後地址
 52 
 53     unsigned long start_brk, brk, start_stack;
 54     //start_stack堆的起始位置
 55     //brk堆的當前的最後地址
 56     //用戶堆棧的起始地址
 57 
 58     unsigned long arg_start, arg_end, env_start, env_end;
 59     //arg_start 命令行參數的起始地址
 60     //arg_end命令行參數的起始地址
 61     //env_start環境變數的起始地址
 62     //env_end環境變數的最後地址
 63 
 64     unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */
 65 
 66     struct linux_binfmt *binfmt;
 67 
 68     cpumask_t cpu_vm_mask; //用於惰性TLB交換的位掩碼
 69     /* Architecture-specific MM context */
 70     mm_context_t context; //指向有關特定結構體系信息的表
 71 
 72 
 73     unsigned int faultstamp;
 74     unsigned int token_priority;
 75     unsigned int last_interval;
 76 
 77     unsigned long flags; /* Must use atomic bitops to access the bits */
 78 
 79     struct core_state *core_state; /* coredumping support */
 80 #ifdef CONFIG_AIO
 81     spinlock_t              ioctx_lock;  //用於保護非同步I/O上下文鏈表的鎖
 82     struct hlist_head       ioctx_list;//非同步I/O上下文
 83 #endif
 84 #ifdef CONFIG_MM_OWNER
 85     struct task_struct *owner;
 86 #endif
 87 
 88 #ifdef CONFIG_PROC_FS
 89     unsigned long num_exe_file_vmas;
 90 #endif
 91 #ifdef CONFIG_MMU_NOTIFIER
 92     struct mmu_notifier_mm *mmu_notifier_mm;
 93 #endif
 94 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 95     pgtable_t pmd_huge_pte; /* protected by page_table_lock */
 96 #endif
 97 #ifdef __GENKSYMS__
 98     unsigned long rh_reserved[2];
 99 #else
100     //有多少任務分享這個mm OOM_DISABLE
101     union {
102         unsigned long rh_reserved_aux;
103         atomic_t oom_disable_count;
104     };
105 
106     /* base of lib map area (ASCII armour) */
107     unsigned long shlib_base;
108 #endif
109 };

 

 

 Reference:

http://www.cnblogs.com/Rofael/archive/2013/04/13/3019153.html

http://blog.csdn.net/persistence_s/article/details/70179419


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文目錄: 1 基本概念2 sed選項3 定址表達式4 sed常用命令5 總結 1.基本概念 sed是一個流式編輯器程式,它讀取輸入流(可以是文件、標準輸入)的每一行放進模式空間(pattern space),同時將此行行號通過sed行號計數器記錄在記憶體中,然後對模式空間中的行進行模式匹配,如果能匹 ...
  • Linux企業運維人員最常用150個命令彙總 命令功能說明線上查詢及幫助命令(2個)man查看命令幫助,命令的詞典,更複雜的還有info,但不常用。help查看Linux內置命令的幫助,比如cd命令。文件和目錄操作命令(18個)ls全拼list,功能是列出目錄的內容及其內容屬性信息。cd全拼chan ...
  • 直接安裝go1.6以上版本會出現提示 Set $GOROOT_BOOTSTRAP to a working Go tree = Go 1.4. Go1.9的構建過程需要用於引導的 Go1.4二進位文件(簡而言之,它需要去構建Go) 首先從源頭構建Go1.4 然後用Go1.4二進位文件從源代碼構建Go ...
  • LAMP平臺的概述 LAMP環境腳本部署:https://github.com/spdir/ShellScripts/tree/master/lamp LAMP的介紹:百度百科 LAMP平臺的構成組件: Linux操作系統 Apache MySQL/mogodb PHP/Perl/Python LA ...
  • 一、小括弧,圓括弧() 1、單小括弧 () ①命令組。括弧中的命令將會新開一個子shell順序執行,所以括弧中的變數不能夠被腳本餘下的部分使用。括弧中多個命令之間用分號隔開,最後一個命令可以沒有分號,各命令和括弧之間不必有空格。 ②命令替換。等同於`cmd`,shell掃描一遍命令行,發現了$(cm ...
  • 原文發表於cu:2016-06-20 參考文檔: 官方文檔: http://www.openldap.org/doc/admin24/guide.html http://www.openldap.org/doc/admin24/quickstart.html http://www.2cto.com/ ...
  • Centos7 開始,網路由 NetworkManager 服務負責管理,相對於舊的 /etc/init.d/network 腳本,NetworkManager是動態的、事件驅動的網路管理服務。舊的 /etc/init.d/network 以及 ifup,ifdown 等依然存在,但是處於備用狀態, ...
  • 問題現象:由於重裝linux,並且加了固態硬碟,直接將系統裝在固態硬碟中。啟動伺服器的時候, 便看不到原來機械硬碟的掛載目錄了,不知如何訪問機械硬碟了。直接用命令 mount /dev/sda3 /store 掛載, 提示 mount: unknown filesystem type 'LVM2_m ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...