進程虛擬地址管理

文章目錄

  • 1 地址分布
    • 實際使用中的內存區域
  • 2 進程的虛擬地址描述
    • 用戶空間mmap
    • 線程之間共享內存地址的實現機制

1 地址分布

在這里插入圖片描述
現在采用虛擬內存的操作系統通常都使用平坦地址空間,平坦地址空間是指地址空間范圍是一個獨立的連續空間(比如,地址從0擴展到429496729位地址空間),對于32位的操作系統而言,每個進程的虛擬地址空間都是0x00000000~0xC0000000,合計3G大小。

進程的3G虛擬地址空間只有映射為物理地址空間,才能夠被使用,那么進程是如何管理和分配它的3G虛擬地址空間呢?
在這里插入圖片描述
這就用到了分治思想,進程虛擬地址空間按照不同的訪問屬性和功能劃分為不同的內存區域,我們也叫虛擬內存區域(VMA)。
內存區域可以包含各種內存對象,比如:

  • 代碼段(text section):可執行文件的內存映射
  • 數據段:可執行文件的已初始化全局變量和靜態局部變量的內存映射
  • bss段:未初始化的或者值為0的變量的內存映射
  • lib庫的代碼段:(多個)
  • lin庫的數據段:(多個)
  • lib庫的bss段:(多個)
  • 任何內存映射文件(有名mmap建立)
  • 任何共享內存段(匿名mmap建立)
  • 進程棧(stack)
  • 進程堆(heap)

實際使用中的內存區域

可以使用/proc文件系統和pmap工具查看給定進程的內存空間和其中所包含的內存區域。

#include <stdio.h>
#include <unistd.h>int main(void)
{printf("PID=%d\n",getpid());while(1){sleep(2);}return 0;
}

運行該程序,輸入命令 cat /proc/<pid>/maps查看進程地址空間中的全部內存區域(我的機子是64位,所以使用的是64位虛擬地址空間)
在這里插入圖片描述

進程的內存區域由vm_area_struct結構體描述,定義在文件linux/mm.h中

struct vm_area_struct {struct mm_struct * vm_mm;	/* The address space we belong to. */unsigned long vm_start;		/* Our start address within vm_mm. */unsigned long vm_end;		/* The first byte after our end addresswithin vm_mm. *//* linked list of VM areas per task, sorted by address */struct vm_area_struct *vm_next;pgprot_t vm_page_prot;		/* Access permissions of this VMA. */unsigned long vm_flags;		/* Flags, listed below. */struct rb_node vm_rb;/** For areas with an address space and backing store,* linkage into the address_space->i_mmap prio tree, or* linkage to the list of like vmas hanging off its node, or* linkage of vma in the address_space->i_mmap_nonlinear list.*/union {struct {struct list_head list;void *parent;	/* aligns with prio_tree_node parent */struct vm_area_struct *head;} vm_set;struct prio_tree_node prio_tree_node;} shared;/** A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma* list, after a COW of one of the file pages.  A MAP_SHARED vma* can only be in the i_mmap tree.  An anonymous MAP_PRIVATE, stack* or brk vma (with NULL file) can only be in an anon_vma list.*/struct list_head anon_vma_node;	/* Serialized by anon_vma->lock */struct anon_vma *anon_vma;	/* Serialized by page_table_lock *//* Function pointers to deal with this struct. */struct vm_operations_struct * vm_ops;/* Information about our backing store: */unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZEunits, *not* PAGE_CACHE_SIZE */struct file * vm_file;		/* File we map to (can be NULL). */void * vm_private_data;		/* was vm_pte (shared mem) */#ifdef CONFIG_NUMAstruct mempolicy *vm_policy;	/* NUMA policy for the VMA */
#endif
};

上面的圖片中,輸出由六列,每一列都是vm_area_struct的一項

內核vm_area_struct中的項/proc/pid/maps中的項及其含義
vm_start第一列’-'前的數字,如55c4b4d68000 ,表示該虛擬內存區域的開始地址
vm_end第一列’-'后的數字 ,如55c4b4d69000 ,表示該虛擬內存區域的結束地址
vm_flags第二列,如r-xp,表示該虛擬內存區域的屬性,每種屬性用一個字段表示,r表示可讀,w表示可寫,x表示可執行,p和s共用一個字段,p表示私有段,s表示共享段,如果沒有相應權限,用’-'代替
vm_pgoff第三列,如00001000,含義:對用有名映射,表示此虛擬內存起始地址在文件中以頁為單位的編譯,對匿名映射,它等于0或者vm_start/PAGE_SIZE
vm_file->f_dentry->d_inode->i_sb->s_dev第四列,如08:01,表示映射文件所屬設備號,對匿名映射來說,因為沒有文件在磁盤上,所有沒有設備號,始終為00:00,對有名映射來說,是映射的文件所在設備的設備號
vm_file->f_dentry->d_inode->i_ino第五列,如1724853,含義:映射文件所屬節點號,對匿名文件來說,因為沒有節點號,所以時鐘是0,對有名映射來說,是映射文件的結點號
第六列,如/lib/x86_64-linux-gnu/libc-2.27.so,對有名映射來說,是映射的文件名,對匿名映射來說,是此段虛擬內存在進程中的角色,stack表示在進程中作為棧使用,heap表示堆

2 進程的虛擬地址描述

內核使用mm_struct來描述一個進程的地址空間,進程的地址空間由多個VMA組成,下面列舉幾個mm_struct管理內存的幾個重要域:

struct mm_struct {.../* 指向虛擬內存區域的鏈表 */struct vm_area_struct * mmap;		/* list of VMAs *//* 指向最近找到的虛擬內存區域 */struct vm_area_struct * mmap_cache;	/* last find_vma result *//* 指向該進程的頁目錄表 */pgd_t * pgd;...
};

VMA用struct vm_area_struct描述,內核將每個內存區域作為一個單獨的內存對象管理,每個內存區域都有一致的屬性,比如權限等。所以我們程序的代碼段、數據段和bss段在內核里都分別有一個struct vm_area_struct結構體來描述。

在這里插入圖片描述
進程由結構體task_struct描述,task_struct里面的mm域用來管理進程的內存,它指向mm_struct結構體,mm_struct的mmap域指向VMA鏈表,用來管理進程虛擬內存,虛擬內存地址又通過頁表轉換為物理地址,怎么轉換的,由mm_struct的pgd頁目錄表來轉換,從頁目錄表中找到物理地址。

用戶空間mmap

 #include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *addr, size_t length);

在用戶空間使用mmap就是給進程添加一個虛擬內存區域,即在VMA鏈表中添加一個vm_area_struct結構

線程之間共享內存地址的實現機制

在Linux中,如果clone()時設備CLONE_VM標志,我們把這樣的進程稱作為線程,線程之間共享同樣的虛擬內存空間。即將父進程的mm域復制給子進程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379524.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java兩個文件夾比較路徑_比較Java中兩個文件的路徑

java兩個文件夾比較路徑Given the paths of the two files and we have two compare the paths of the files in Java. 給定兩個文件的路徑&#xff0c;我們有兩個比較Java中文件的路徑。 Comparing paths of two files 比較兩個文件的路徑 To compare the paths of two file…

標題:加法變乘法

標題&#xff1a;我們都知道&#xff1a;123 … 49 1225 現在要求你把其中兩個不相鄰的加號變成乘號&#xff0c;使得結果為2015 比如&#xff1a; 123…10*1112…27*2829…49 2015 就是符合要求的答案。 請你尋找另外一個可能的答案&#xff0c;并把位置靠前的那個乘號左…

C# winform對話框用法大全收藏

對話框中我們常用了以下幾種&#xff1a; 1、文件對話框(FileDialog) 它又常用到兩個&#xff1a; 打開文件對話框(OpenFileDialog) 保存文件對話(SaveFileDialog) 2、字體對話框(FontDialog) 3、顏色對話框(&#xff23;olorDialog) 4、打印預瀏對話框(PrintPreviewDialog) 5、…

【翻譯】eXpressAppFramework QuickStart 業務模型設計(四)—— 實現自定義業務類...

這一講&#xff0c;你將學到如何從頭開始實現業務類。為此&#xff0c;將要實現Department和Position業務類。這些類將被應用到之前實現的Contact類中。你將學到引用對象自動生成用戶界面的基本要素。 在此之前&#xff0c;我建議你去閱讀一下 【翻譯】eXpressAppFramework Qui…

內存重映射

文章目錄1 kmap2 映射內核內存到用戶空間使用remap_pfn_range使用io_remap_pfn_rangemmap文件操作建立VMA和實際物理地址的映射mmap 之前分配 一次性映射mmap 之前分配 Page FaultPage Fault 中分配 映射內核內存有時需要重新映射&#xff0c;無論是從內核到用戶空間還是從內…

math.sqrt 有問題_JavaScript中帶有示例的Math.sqrt()方法

math.sqrt 有問題JavaScript | Math.sqrt()方法 (JavaScript | Math.sqrt() Method) The Math.sqrt() method is inbuilt in JavaScript to find the square root of a number. In this tutorial, we will learn about the sqrt() method with examples. JavaScript中內置了Mat…

標題:移動距離

標題&#xff1a;移動距離 X星球居民小區的樓房全是一樣的&#xff0c;并且按矩陣樣式排列。其樓房的編號為1,2,3… 當排滿一行時&#xff0c;從下一行相鄰的樓往反方向排號。 比如&#xff1a;當小區排號寬度為6時&#xff0c;開始情形如下&#xff1a; 1 2 3 4 5 6 12 11 1…

ISAPI Rewrite 實現簡單url重寫、二級域名重寫

實現步驟&#xff1a; 第一步&#xff1a;下載ISAPI_Rewrite.rar&#xff0c;將Rewrite文件夾和httpd.ini直接放在項目根目錄下面。 第二步&#xff1a;IIS配置&#xff0c;篩選Rewrite文件夾里面的Rewrite.dll文件&#xff0c;如圖&#xff1a; 第三步&#xff1a;在httpd.ini…

用戶登錄

用戶登錄 代碼namespace 用戶登錄 {public partial class Form1 : Form{public Form1(){InitializeComponent();}bool b1, b2, b3, b4, b5, b6;private void button1_Click(object sender, EventArgs e){try{if (b1 && b2 && b3 && b4 && b5 &…

進程上下文和中斷上下文

文章目錄進程的preempt_count變量thread_infopreempt_counthardirq相關softirq相關上下文原文鏈接&#xff1a; https://zhuanlan.zhihu.com/p/88883239進程的preempt_count變量 thread_info 在內核中&#xff0c;上下文的設置和判斷接口可以參考 include/linux/preempt.h 文…

標題:湊算式

標題&#xff1a;湊算式 這個算式中AI代表19的數字&#xff0c;不同的字母代表不同的數字。 比如&#xff1a; 68/3952/714 就是一種解法&#xff0c; 53/1972/486 是另一種解法。 這個算式一共有多少種解法&#xff1f; 注意&#xff1a;你提交應該是個整數&#xff0c;不要…

匯編中imul_JavaScript中帶有示例的Math.imul()方法

匯編中imulJavaScript | Math.imul()方法 (JavaScript | Math.imul() Method) Math.imul() is a function in math library of JavaScript that is used to the 32-bit multiplication of the two values passed to it. It uses C-like semantics to find the multiplication. …

AFTER觸發器與INSTEAD OF觸發器的區別

INSTEAD OF 觸發器用來代替通常的觸發動作&#xff0c;即當對表進行INSERT、UPDATE 或 DELETE 操作時&#xff0c;系統不是直接對表執行這些操作&#xff0c;而是把操作內容交給觸發器&#xff0c;讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此&#xff0c;…

Linux內存地址管理

文章目錄系統內存布局內核地址的低端和高端內存概念低端內存高端內存地址轉換和MMULinux中的四級分頁模型虛擬地址字段頁表處理將虛擬地址轉換物理地址Linux系統中的每個內存地址都是虛擬的&#xff0c;它們不直接指向任何物理內存地址。每當訪問內存位置時&#xff0c;可以執行…

錄制caf 轉 mp3

編譯需要使用的 lame庫http://www.cocoachina.com/bbs/read.php?tid108237參考的文章http://blog.csdn.net/ysy441088327/article/details/7392842說起來&#xff0c;我一直在找一個音頻轉換成mp3的方法。一年前&#xff0c;我成功編譯出了一個lame for armv7的庫。苦于不會使…

杭電2012-素數判定(C)

Problem Description 對于表達式n^2n41&#xff0c;當n在&#xff08;x,y&#xff09;范圍內取整數值時&#xff08;包括x,y&#xff09;(-39<x<y<50)&#xff0c;判定該表達式的值是否都為素數。 Input 輸入數據有多組&#xff0c;每組占一行&#xff0c;由兩個整數…

math.ceil帶小數點_JavaScript中帶有示例的Math.ceil()方法

math.ceil帶小數點JavaScript | Math.ceil()方法 (JavaScript | Math.ceil() Method) Math.ceil() is a function in math library of JavaScript that is used to round up the number passed to the function. The method will return the nearest integer value indeed is g…

開發記要 詭異的變量

告別繁體文盲,從寫blog開始 Variable命名很重要,有多重要,看看.net和java的加密就知道, 都是把variable改到一塌糊塗,你想看看都沒門. 但是這幾天看遺留系統的代碼,真是大開眼界。 我一直以為別人寫a,b,c,d這些單字節variable已經很過分。直到我看到以下這幾個&#xff0…

排序算法---快速排序、堆排序、冒泡排序

排序算法1 快速排序代碼實現stdlib庫快排2 堆排序堆排序的基本思想如何構造一個大頂堆排序3 冒泡排序1 快速排序 文章原地址&#xff1a;https://blog.csdn.net/morewindows/article/details/6684558 快速排序的平均時間復雜度是0(NlogN)&#xff0c;它采用了一種分治的策略&a…

CSS Hack 匯總快查

*:lang(zh) select {font:12px !important;} /*FF的專用*/ select:empty {font:12px !important;} /*safari可見*/ 這里select是選擇符&#xff0c;根據情況更換。第二句是MAC上safari瀏覽器獨有的。 僅IE7識別 *html {…} 當面臨需要只針對IE7做樣式的時候就可以采用這個HACK…