虛擬內存結構描述_第1頁
虛擬內存結構描述_第2頁
虛擬內存結構描述_第3頁
虛擬內存結構描述_第4頁
虛擬內存結構描述_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統(tǒng)結構虛擬內存管理結構描述李 煜摘要:本文。本文通過介紹虛擬內存的概念,主要數(shù)據(jù)結構,Linux虛擬內存重建和拷貝等過程進行了詳細的介紹和總結概括。首先介紹了Linux虛擬內存主要的數(shù)據(jù)結構如虛擬內存區(qū)域vm_area_struct,虛擬內存管理mm_struct等。然后對Linux虛擬內存重建和拷貝的過程進行了詳細的介紹。目地是為了讓讀者了解Linux虛擬內存的重建過程,虛擬內存的拷貝以及重要數(shù)據(jù)結構有一個初步的了解。關 鍵 詞:虛擬內存;Linux;數(shù)據(jù)結構1 引言我們知道程序代碼和數(shù)據(jù)必須駐留在內存中才能得以運行,然而系統(tǒng)內存數(shù)量很有限,往往不能容納一個完整程序的所有代碼和數(shù)據(jù),更

2、何況在多任務系統(tǒng)中,可能需要同時打開子處理程序,畫圖程序,瀏覽器等很多任務,想讓內存駐留所有這些程序顯然不太可能。因此首先能想到的就是將程序分割成小份,只讓當前系統(tǒng)運行它所有需要的那部分留在內存,其它部分都留在硬盤。當系統(tǒng)處理完當前任務片段后,再從外存中調入下一個待運行的任務片段。的確,老式系統(tǒng)就是這樣處理大任務的,而且這個工作是由程序員自行完成。但是隨著程序語言越來越高級,程序員對系統(tǒng)體系的依賴程度降低了,很少有程序員能非常清楚的駕馭系統(tǒng)體系,因此放手讓程序員負責將程序片段化和按需調入輕則降低效率,重則使得機器崩潰。系統(tǒng)必須采取一種能按需分配而不需要程序員干預的新技術。 虛擬內存(

3、之所以稱為虛擬內存,是和系統(tǒng)中的邏輯內存和物理內存相對而言的,邏輯內存是站在進程角度看到的內存,因此是程序員關心的內容。而物理內存是站在處理器角度看到的內存,由操作系統(tǒng)負責管理。虛擬內存可以說是映射到這兩種不同視角內存的一個技術手段。)技術就是一種由操作系統(tǒng)接管的按需動態(tài)內存分配的方法,它允許程序不知不覺中使用大于實際物理空間大小的存儲空間(其實是將程序需要的存儲空間以頁的形式分散存儲在物理內存和磁盤上),所以說虛擬內存徹底解放了程序員,從此程序員不用過分關心程序的大小和載入,可以自由編寫程序了,繁瑣的事情都交給操作系統(tǒng)去做吧。  2 虛擬內存的概念極其優(yōu)缺點2.1 虛擬內存的概念在

4、分頁系統(tǒng)中,由于在程序地址空間和物理地址空間引入了頁表,隔離了兩個地址空間,一個程序可以在物理內存中不連續(xù)。操作系統(tǒng)負責在內外存之間交換頁面,造成每個進程都認為自己是系統(tǒng)中唯一一個程序,獨占系統(tǒng)全部地址空間的假象。虛擬地址是一塊地址空間,它的特點主要是:(1)從0開始編址并且連續(xù)(2)不受系統(tǒng)物理內存大小限制(3)在功能上等價于物理內存,但實際上并不存在(4)虛擬地址空間是相互隔離的2.2 虛擬內存的優(yōu)缺點在分頁系統(tǒng)中,由Linux虛擬內存的優(yōu)點主要有以下幾個:(1)大地址空間:運行在I386平臺的每個Linux進程,都可以使用4GB的地址空間。(2)進程保護:系統(tǒng)的每一個進程都有自己的虛擬地

5、址空間,不同進程的虛擬空間所對應的物理地址是完全隔離的。(3)內存映射:利用內存映射可以將數(shù)據(jù)文件映射到虛擬地址空間,從而使得對文件的訪問和對內存單元的訪問一樣。(4)虛存共享:多個進程的虛擬地址映射到同一個物理地址空間,則可以在不同的進程之間實現(xiàn)虛存共享。(5)多程序同時駐留內存:由于進程只有一部分駐留在內存,因此內存中可以駐留多個進程,提高cpu效率。(6)允許運行重定位程序:程序可以放在物理內存的任意位置,并且在執(zhí)行過程中也可以移動。(7)代價?。簱Q入換出單個頁面的代價比交換這個進程小。但是,虛擬內存也是有代價的,虛擬內存管理需要建立很多的數(shù)據(jù)結構,它們要占額外的內存;虛擬地址到物理地址

6、的轉化增加了每條指令的執(zhí)行時間;頁面的換入換出也增加了磁盤的I/O操作。3 虛擬內存管理結構3.1 虛擬內存管理實現(xiàn)思路在分頁系統(tǒng)中,由Linux虛擬內存的優(yōu)點主要有以下幾個:(1)大地址空間:運行在I386平臺的每個Linux進程,都可以使用4虛擬內個管理的基本思路是虛擬或者制造假象,它使得每個進程都認為系統(tǒng)中有足夠大的內存并且內存中只有自己一個進程,實現(xiàn)的基本思路是如下,具體如圖1所示:(1)將系統(tǒng)的物理地址和進程的虛擬地址分成固定大小的頁,為每個進程重建一個頁表,從而實現(xiàn)兩個地址空間的隔離。(2)由虛擬內存管理器管理和維護進程的頁表,建立虛擬內存頁和物理頁的對應關系,利用硬件實現(xiàn)地址的轉

7、換。(3)由內存管理器負責內外存之間的頁面交換,將進程使用的虛擬頁面換入物理內存,不用的換出內存,提高物理內存的使用率,造成幾乎無限大小的虛擬內存的假象。圖1. Linux虛擬內存管理器的實現(xiàn)思路3.2 頁表的介紹在分頁系頁表是虛擬內存管理中最基礎的數(shù)據(jù)結構,在Intel的32位處理器中分為兩級,分別稱為頁目錄和頁表。其特點主要有:(1)頁目錄和頁表只能由虛擬內存管理,對進程是透明的。(2)虛擬頁在內存時,頁表項記錄這對應關系,虛擬頁不在內存時,虛擬項記錄這頁面在外存的位置。(3)頁表項和頁表都是動態(tài)重建和動態(tài)刪除的。(4)虛擬頁和物理頁的映射關系不要求連續(xù),也不要求有序,多個虛擬頁可以對應一

8、個物理頁。它的每一個元素稱為一個頁表項(PTE),在Intel系統(tǒng)上,頁表項長度為32位,4個字節(jié),包含以下信息:(1) 有效標志:表示頁表本項是否有效(2)映射關系:本頁表項所對應的物理頁編號(3)訪問控制信息:描述本頁是否可寫?是否包含執(zhí)行代碼。3.3 虛擬內存區(qū)域的代碼實現(xiàn)的每個進程都有自己的頁目錄和頁表,通過頁目錄和頁表,每個進程有擁有4GB的虛擬地址空間。進程的所有信息比如代碼、數(shù)據(jù)、堆棧、共享區(qū)等。Linux使用結構vm_area_struct(vma)結構來描述一個虛擬內存區(qū)域,其定義如下,具體如圖2所示:struct vm_area_struct struct mm_struc

9、t * vm_mm; /* 指向虛擬區(qū)所在的mm_struct結構的指針*/ unsigned long vm_start; /* 在vm_mm中的起始地址*/ unsigned long vm_end; /*在vm_mm中的結束地址 */ struct vm_area_struct *vm_next; pgprot_t vm_page_prot; /* 對這個虛擬區(qū)間的存取保護權限(只讀、只寫、執(zhí)行) */ unsigned long vm_flags; /* 虛擬區(qū)間的標志.(讀、寫、共享) */ struct rb_node_t vm_rb; struct vm_area_struct

10、*vm_next_share;struct vm_area_struct *vm_pprev_share;struct vm_operations_struct * vm_ops; /*對這個區(qū)間進行操作的函數(shù) */ unsigned long vm_pgoff; /*映射文件中的偏移量 */struct file * vm_file; /*指向映射文件的文件對象 */unsigned long vm_raend; /* 預讀信息 */void * vm_private_data; /* 指向內存區(qū)的私有數(shù)據(jù) */.圖2. Linux虛擬內存管理器的實現(xiàn)思路linux利用了面向對象的思想,把一

11、個虛存區(qū)看成一個對象,用vm_area_struct(vma)描述對象屬性,其中的vm_operation描述了對象的操作,定義如下:struct vm_operations_struct void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused); void (*unmap)(struct vm_ar

12、ea_struct * area,unsigned long,size_t) int(*swapout)(struct vm_area_struct * area,struct page*); pte_t(*swapin)(struct vm_area_struct * area,unsigned long,unsigned long);3.4 虛擬內存區(qū)域虛擬內存管理器還需要一個地方來記錄進程中與內存有關的信息,如進程頁目錄的位置,進程的代碼、數(shù)據(jù)、堆棧等在虛擬空間的位置進程駐留在物理內存中的頁面的個數(shù),為此,Linux為每個進程重建了一個內存管理結構mm_struct,來管理進程中與虛擬內

13、存相關的信息。該結構定義如下:struct mm_struct struct vm_area_struct * mmap; /*指向虛擬區(qū)間(VMA)鏈表頭 */ b_root_t mm_rb; *指向紅黑樹的根*/struct vm_area_struct * mmap_cache; /*指向最近找到的虛擬區(qū)間*/ pgd_t * pgd; *進程頁目錄基地址*/atomic_t mm_users; /*用戶空間中的有多少用戶*/ atomic_t mm_count; /*對"struct mm_struct"引用的計數(shù)*/ int map_count; /*虛擬區(qū)間的個

14、數(shù)*/ struct rw_semaphore mmap_sem;/*線性區(qū)的讀寫信號量*/spinlock_t page_table_lock; /*線性區(qū)的自旋鎖和頁表的自旋鎖 */ struct list_head mmlist; /*所有活動(active)mm的鏈表 */unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack; /* 堆的相關信息*/ unsigned long arg_start, arg_end, env_start, e

15、nv_end; unsigned long rss, total_vm, locked_vm; unsigned long def_flags;/* 線性區(qū)默認的訪問標志*/進程的task_struct結構中包含一個mm域,指向mm_struct。進程的mm_struct包含進程的可執(zhí)行映像信息和進程頁目錄指針PGD等。該結構還包含指向vm_area_struct結構的指針,每一個vm_area_struct代表進程一個虛擬地址空間,如圖3所示:圖3. 相關數(shù)據(jù)結構之間的關系3.5 虛擬內存區(qū)域在進程的生命周期中,它的虛擬地址空間會不斷變化,過程如下:(1)在進程重建時,從父進程拷貝虛擬地址空

16、間。在拷貝的過程中,系統(tǒng)根據(jù)父進程虛擬地址空間的定義,復制一套內存管理結構(mm_struct,vm_area_struct,頁目錄,頁表)。(2)在進程需要裝入自己的執(zhí)行映像時,系統(tǒng)將先廢棄進程當前的虛擬地址空間,而后再根據(jù)執(zhí)行映像的定義重建新的內存管理系統(tǒng)。(3)在進程執(zhí)行過程中,會不斷的發(fā)生缺頁異常,異常處理程序會不斷的修改頁目錄和頁表項。(4)在物理內存緊張,需要回收內存時,物理內存回收程序會將進程的某些暫時不用的頁從內存中換出。一個虛擬頁如何被換出有它所在的虛擬內存區(qū)域決定的。(5)在進程執(zhí)行過程中,進程的虛擬頁會不斷的換進換出,系統(tǒng)只在內存中為每個進程保留它最需要的頁。這樣,系統(tǒng)就

17、用有限的物理內存為每個進程模擬出4GB的虛擬地址空間。(6)在進程結束時,系統(tǒng)會釋放它的所有的內存管理的數(shù)據(jù)結構,同時釋放它在內存中所有的頁,從而釋放它的所有虛擬地址空間。3.6 映射關系在早期的系統(tǒng)中,Linux僅用了mm_struct、vm_area_struct、頁目錄和頁表描述進程的虛擬空間,這些數(shù)據(jù)定義了一種正映射關系。然而在某些時候比如物理頁回收,還需要逆向映射關系,以便能方便的使用一個物理頁或者是文件頁的所有進程及該頁在進程中對應的虛擬頁,為此,新的linux版本引進了逆向映射關系。3.6.1 文件頁到虛擬頁的逆映射關系(1)如果虛擬頁的內容來源于文件且該文件的文件區(qū)間僅僅被映射

18、到一個進程的虛擬內存空間里面,則虛擬內存建立的就是文件頁與虛擬頁的一一對應的關系。(2)如果某文件頁的文件區(qū)間被同時映射到多個進程的虛擬地址空間中,那么,那么每個進程都會為包含該頁的文件區(qū)間建立一個虛擬內存區(qū)域,這些內存區(qū)域建立的是文件頁到虛擬頁一對多的映射關系。為了找到一個文件頁對應的所有的虛擬頁,Linux為每個文件建立了一個文件地址空間address_space。給定一個文件頁(頁號為pgoff),查它的address_space,可得到包含該頁的所有內存區(qū)域vma,進而可得出該頁在各進程虛擬地址空間的虛擬地址。3.6.2 物理頁到虛擬頁的逆映射關系一個物理頁的內容可能是動態(tài)建立的(匿名

19、頁),也可能來源于一個文件(映射頁)。來源于文件的頁可能屬于共享區(qū)域,也可能屬于私有區(qū)域。不用來源的物理頁需要不同的逆向映射關系。(1)匿名頁屬于匿名的虛擬內存空間。值得注意的是,共享物理頁的多個匿名虛擬內存區(qū)域具有相同的屬性和大小,也就是說物理頁在各區(qū)域中的偏移量是相同的。為了便于一個物理頁找到所有的虛擬頁,Linux做了以下的安排:首先為每一類匿名虛擬內存空間定義一個匿名結構anno_vma,共享同樣的物理頁、具有相同屬性的虛擬內存區(qū)域被組織在一個anno_vma結構中(雙向鏈表),然后復制page結構中的三個域,讓_mapcount記錄映射到該頁的虛擬頁的個數(shù),mapping指向anon

20、_vma結構、index記錄頁在虛擬內存區(qū)域的頁號。給定一個物理頁的page結構,查與之關聯(lián)的anon_vma結構,可找到包含它的所有虛擬內存區(qū)域的vma,進而可得出它在各虛擬地址空間中的虛擬地址。(2)共享映射頁屬于共享區(qū)域,其內容來源于文件,可以被多個進程占用,因此會出現(xiàn)在多個進程的頁表中。為了便于找到共享頁對應的所有虛擬頁,Linux復用了page中的三個域,在_mapcount中映射到該物理頁的虛擬頁的個數(shù), mapping指向文件的地址空間address_space、在index中記錄該頁在文件中的偏移量。進而可得出該頁在各虛擬空間的虛擬地址。(3)私有映射頁屬于私有區(qū)域,其內容來源

21、于文件,可以被多個進程讀或者執(zhí)行,但是只能被一個進程修改。私有類型的虛擬內存區(qū)域出現(xiàn)在文件的地址空間中。如果進程未對私有映射頁實行寫操作,則它使用的是該頁的正本。正本的page結構設置與共享映射頁相同。獲得物理頁對應的虛擬頁的方式也相同。如果進程對私有頁實行了寫操作,則它使用的就是該頁的副本,通過文件地址空間已經無法確定與副本頁對應的虛擬頁。linux做了如下處理:首先,將包含副本頁的虛擬內存區(qū)域同時加入到文件地址空間和匿名域中,然后復用page結構中的三個域,讓_mapcount記錄映射該頁的虛擬頁的個數(shù),mapping指向anon_vma結構、index記錄頁在文件中的頁號。給定一個副本頁

22、的page結構,查與之相關的anno_vma結構,可以找到包含他所有的虛擬內存區(qū)域vma,進而可以得出他在個虛擬地址空間中的虛擬地址。4 虛擬內存的重建和拷貝4.1 虛擬內存的重建進程創(chuàng)建時,通過虛擬內存的拷貝,已經為子進程建立了虛擬內存地址空間。只有當進程希望改變自己的行為時,它可以調用exec函數(shù),根據(jù)新的執(zhí)行映像重建自己的虛擬內存空間。完成執(zhí)行映像加載的函數(shù)是exec,該函數(shù)在處理完參數(shù)以后,最終會調用函數(shù)do_execve,所以真正完成虛擬內存建立工作的函數(shù)是do_execve。除了exec以外,Linux還提供了一個系統(tǒng)調用old_mmap,讓用戶建立自己的內存映射區(qū)域,如為打開一個

23、數(shù)據(jù)文件建立虛擬映射區(qū)域。系統(tǒng)調用old_mmap函數(shù)直接從用戶空間接受參數(shù),該函數(shù)定義如下,包含了建立虛擬內存映射需要的所有的信息:asmlinkage int old_mmap(struct mmap_arg_struct *arg)函數(shù)old_mmap將參數(shù)拷貝到內核,然后調用函數(shù)do_mmap建立內存映射區(qū)域。do_mmap用于一個虛擬內存區(qū)域的建立,其建立的內存映射區(qū)域主要有兩種:共享區(qū)域和私有區(qū)域。共享區(qū)域的頁允許多個進程共享,它在內存中只有一份拷貝,進程可以直接修改共享映射區(qū)域的頁,當需要將共享映射頁從內存中換出時,系統(tǒng)會將修改過的共享映射頁直接寫回到映射文件。私有區(qū)域的頁是進程

24、專有的,多進程可以讀,但是某進程如果修改的話,系統(tǒng)會為寫進程創(chuàng)建一個副本,其操作都是在副本上進行的,當要將私有映射頁交換出內存時,系統(tǒng)會將其寫到交換設備,而不是映射文件。函數(shù)do_mmap定義如下:unsigned long do_mmap(struct*file,unsigned long addr,unsigned long len,unsigned long prot,unsigned long flags,unsigned long off)該函數(shù)把文件file中的區(qū)域off,off+length)映射到進程虛擬內存的paddr,paddr+length),flags指定了映射類型(共

25、享、私有等),prot指定該內存區(qū)域的保護權限(讀、寫、執(zhí)行、不可訪問等)。如果映射類型指定為MAP_FIXED,則paddr就是addr,否則,paddr是系統(tǒng)根據(jù)情況決定的一個虛擬地址(addr是首選)。4.2 虛擬內存的拷貝linux提供了很靈活的進程創(chuàng)建機制,一般分為兩種情況:第一種是在進程創(chuàng)建標志中指出了CLONE_VM,則父子進程共用同一個虛擬地址空間,頁目錄也是公用的。另一種進程的創(chuàng)建使用Copy on Write技術,從父進程拷貝頁目錄和頁表,但將父子進程的頁表項都設置為只讀,頁面的拷貝推遲到寫操作進行。為了拷貝虛擬內存空間,需要將父進程的內存結構mm_struct拷貝到子進程

26、,拷貝的內容包括各個內存結構vm_area_struct和每個內存區(qū)對應的頁目錄,頁表項,但是不拷貝內容。完成內存拷貝的函數(shù)是copy_mm。該函數(shù)的工作流程如下所示:(1)如果標志clone_flags中設置了CLONE_VM,則父子進程要共用同樣的內存結構mm_struct,只需將父進程內存結構的引用計數(shù)加1即可,返回0.(2)否則,要拷貝內存結構:1) 向內存管理器申請一個mm_struct結構:mm=mm_alloc();2) 如果申請成功,則從父進程中拷貝內容:*mm=*current->mm;將該結構的應用計數(shù)值記為1;將mm結構的map_count,def_flags,mm

27、ap, mmap_avl,map_cache等區(qū)域清空。3)將申請到的mm_struct結構填入進程結構:tsk->mm=mm;4)設置進程結構的參數(shù),如將min_flt,maj_flt,cmin_flt的值為05)為新進程創(chuàng)建段LDT:copy_segment(nr,tsk,mm)6)為新進程創(chuàng)建頁目錄:new_page_tables(tsk)7)將新頁目錄的首地址放到新進程TSS段的CR3域和新進程內存結構的頁目錄域中:SET_PAGE_DIR(tsk,new_page);tsk->mm->pgd=new_pg; 將父進程的所有的虛擬內存區(qū)域都拷貝到新進程中:dup_mm

28、ap(mm);函數(shù)dup_mmap(mm)的工作流程如下所示:(1)找到父進程的vma鏈表:mpnt=current->mm->mmap;(2)如果mpnt為空,則跳轉到(11)。(3)從內存管理器中申請一個vm_area_srtuct結構tmp。(4)拷貝vm_area_srtuct結構的信息:*tmp=*mpnt(5)調整新vm_area_struct結構的某些域,如vm_flags,vm_mm等。 (6)如果是一個文件映射區(qū)域,則將文件結構vm_file的計數(shù)加1, 將新vma結構加入文件inode結構的vma中。拷貝頁目錄、頁表項:retval=copy_page_range(mm,current->mm,tmp);(8)如果tmp的操作集合定義有open操作,則執(zhí)行它:tmp->vm_ops->open(tmp);(9)將tmp加入到內存管理結構mm的vma隊列中(10)mpnt=mpnt->vm_next,轉(2)。(11)到此為止,所有的內存區(qū)域都已經拷貝完畢。如果新進程的內存區(qū)域總數(shù)大于AVL_MIN_MAP_COUNT,則為其建立

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論