版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)結(jié)構(gòu)虛擬內(nèi)存管理結(jié)構(gòu)描述李 煜摘要:本文。本文通過(guò)介紹虛擬內(nèi)存的概念,主要數(shù)據(jù)結(jié)構(gòu),Linux虛擬內(nèi)存重建和拷貝等過(guò)程進(jìn)行了詳細(xì)的介紹和總結(jié)概括。首先介紹了Linux虛擬內(nèi)存主要的數(shù)據(jù)結(jié)構(gòu)如虛擬內(nèi)存區(qū)域vm_area_struct,虛擬內(nèi)存管理mm_struct等。然后對(duì)Linux虛擬內(nèi)存重建和拷貝的過(guò)程進(jìn)行了詳細(xì)的介紹。目地是為了讓讀者了解Linux虛擬內(nèi)存的重建過(guò)程,虛擬內(nèi)存的拷貝以及重要數(shù)據(jù)結(jié)構(gòu)有一個(gè)初步的了解。關(guān) 鍵 詞:虛擬內(nèi)存;Linux;數(shù)據(jù)結(jié)構(gòu)1 引言我們知道程序代碼和數(shù)據(jù)必須駐留在內(nèi)存中才能得以運(yùn)行,然而系統(tǒng)內(nèi)存數(shù)量很有限,往往不能容納一個(gè)完整程序的所有代碼和數(shù)據(jù),更
2、何況在多任務(wù)系統(tǒng)中,可能需要同時(shí)打開子處理程序,畫圖程序,瀏覽器等很多任務(wù),想讓內(nèi)存駐留所有這些程序顯然不太可能。因此首先能想到的就是將程序分割成小份,只讓當(dāng)前系統(tǒng)運(yùn)行它所有需要的那部分留在內(nèi)存,其它部分都留在硬盤。當(dāng)系統(tǒng)處理完當(dāng)前任務(wù)片段后,再?gòu)耐獯嬷姓{(diào)入下一個(gè)待運(yùn)行的任務(wù)片段。的確,老式系統(tǒng)就是這樣處理大任務(wù)的,而且這個(gè)工作是由程序員自行完成。但是隨著程序語(yǔ)言越來(lái)越高級(jí),程序員對(duì)系統(tǒng)體系的依賴程度降低了,很少有程序員能非常清楚的駕馭系統(tǒng)體系,因此放手讓程序員負(fù)責(zé)將程序片段化和按需調(diào)入輕則降低效率,重則使得機(jī)器崩潰。系統(tǒng)必須采取一種能按需分配而不需要程序員干預(yù)的新技術(shù)。 虛擬內(nèi)存(
3、之所以稱為虛擬內(nèi)存,是和系統(tǒng)中的邏輯內(nèi)存和物理內(nèi)存相對(duì)而言的,邏輯內(nèi)存是站在進(jìn)程角度看到的內(nèi)存,因此是程序員關(guān)心的內(nèi)容。而物理內(nèi)存是站在處理器角度看到的內(nèi)存,由操作系統(tǒng)負(fù)責(zé)管理。虛擬內(nèi)存可以說(shuō)是映射到這兩種不同視角內(nèi)存的一個(gè)技術(shù)手段。)技術(shù)就是一種由操作系統(tǒng)接管的按需動(dòng)態(tài)內(nèi)存分配的方法,它允許程序不知不覺(jué)中使用大于實(shí)際物理空間大小的存儲(chǔ)空間(其實(shí)是將程序需要的存儲(chǔ)空間以頁(yè)的形式分散存儲(chǔ)在物理內(nèi)存和磁盤上),所以說(shuō)虛擬內(nèi)存徹底解放了程序員,從此程序員不用過(guò)分關(guān)心程序的大小和載入,可以自由編寫程序了,繁瑣的事情都交給操作系統(tǒng)去做吧。 2 虛擬內(nèi)存的概念極其優(yōu)缺點(diǎn)2.1 虛擬內(nèi)存的概念在
4、分頁(yè)系統(tǒng)中,由于在程序地址空間和物理地址空間引入了頁(yè)表,隔離了兩個(gè)地址空間,一個(gè)程序可以在物理內(nèi)存中不連續(xù)。操作系統(tǒng)負(fù)責(zé)在內(nèi)外存之間交換頁(yè)面,造成每個(gè)進(jìn)程都認(rèn)為自己是系統(tǒng)中唯一一個(gè)程序,獨(dú)占系統(tǒng)全部地址空間的假象。虛擬地址是一塊地址空間,它的特點(diǎn)主要是:(1)從0開始編址并且連續(xù)(2)不受系統(tǒng)物理內(nèi)存大小限制(3)在功能上等價(jià)于物理內(nèi)存,但實(shí)際上并不存在(4)虛擬地址空間是相互隔離的2.2 虛擬內(nèi)存的優(yōu)缺點(diǎn)在分頁(yè)系統(tǒng)中,由Linux虛擬內(nèi)存的優(yōu)點(diǎn)主要有以下幾個(gè):(1)大地址空間:運(yùn)行在I386平臺(tái)的每個(gè)Linux進(jìn)程,都可以使用4GB的地址空間。(2)進(jìn)程保護(hù):系統(tǒng)的每一個(gè)進(jìn)程都有自己的虛擬地
5、址空間,不同進(jìn)程的虛擬空間所對(duì)應(yīng)的物理地址是完全隔離的。(3)內(nèi)存映射:利用內(nèi)存映射可以將數(shù)據(jù)文件映射到虛擬地址空間,從而使得對(duì)文件的訪問(wèn)和對(duì)內(nèi)存單元的訪問(wèn)一樣。(4)虛存共享:多個(gè)進(jìn)程的虛擬地址映射到同一個(gè)物理地址空間,則可以在不同的進(jìn)程之間實(shí)現(xiàn)虛存共享。(5)多程序同時(shí)駐留內(nèi)存:由于進(jìn)程只有一部分駐留在內(nèi)存,因此內(nèi)存中可以駐留多個(gè)進(jìn)程,提高cpu效率。(6)允許運(yùn)行重定位程序:程序可以放在物理內(nèi)存的任意位置,并且在執(zhí)行過(guò)程中也可以移動(dòng)。(7)代價(jià)?。簱Q入換出單個(gè)頁(yè)面的代價(jià)比交換這個(gè)進(jìn)程小。但是,虛擬內(nèi)存也是有代價(jià)的,虛擬內(nèi)存管理需要建立很多的數(shù)據(jù)結(jié)構(gòu),它們要占額外的內(nèi)存;虛擬地址到物理地址
6、的轉(zhuǎn)化增加了每條指令的執(zhí)行時(shí)間;頁(yè)面的換入換出也增加了磁盤的I/O操作。3 虛擬內(nèi)存管理結(jié)構(gòu)3.1 虛擬內(nèi)存管理實(shí)現(xiàn)思路在分頁(yè)系統(tǒng)中,由Linux虛擬內(nèi)存的優(yōu)點(diǎn)主要有以下幾個(gè):(1)大地址空間:運(yùn)行在I386平臺(tái)的每個(gè)Linux進(jìn)程,都可以使用4虛擬內(nèi)個(gè)管理的基本思路是虛擬或者制造假象,它使得每個(gè)進(jìn)程都認(rèn)為系統(tǒng)中有足夠大的內(nèi)存并且內(nèi)存中只有自己一個(gè)進(jìn)程,實(shí)現(xiàn)的基本思路是如下,具體如圖1所示:(1)將系統(tǒng)的物理地址和進(jìn)程的虛擬地址分成固定大小的頁(yè),為每個(gè)進(jìn)程重建一個(gè)頁(yè)表,從而實(shí)現(xiàn)兩個(gè)地址空間的隔離。(2)由虛擬內(nèi)存管理器管理和維護(hù)進(jìn)程的頁(yè)表,建立虛擬內(nèi)存頁(yè)和物理頁(yè)的對(duì)應(yīng)關(guān)系,利用硬件實(shí)現(xiàn)地址的轉(zhuǎn)
7、換。(3)由內(nèi)存管理器負(fù)責(zé)內(nèi)外存之間的頁(yè)面交換,將進(jìn)程使用的虛擬頁(yè)面換入物理內(nèi)存,不用的換出內(nèi)存,提高物理內(nèi)存的使用率,造成幾乎無(wú)限大小的虛擬內(nèi)存的假象。圖1. Linux虛擬內(nèi)存管理器的實(shí)現(xiàn)思路3.2 頁(yè)表的介紹在分頁(yè)系頁(yè)表是虛擬內(nèi)存管理中最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),在Intel的32位處理器中分為兩級(jí),分別稱為頁(yè)目錄和頁(yè)表。其特點(diǎn)主要有:(1)頁(yè)目錄和頁(yè)表只能由虛擬內(nèi)存管理,對(duì)進(jìn)程是透明的。(2)虛擬頁(yè)在內(nèi)存時(shí),頁(yè)表項(xiàng)記錄這對(duì)應(yīng)關(guān)系,虛擬頁(yè)不在內(nèi)存時(shí),虛擬項(xiàng)記錄這頁(yè)面在外存的位置。(3)頁(yè)表項(xiàng)和頁(yè)表都是動(dòng)態(tài)重建和動(dòng)態(tài)刪除的。(4)虛擬頁(yè)和物理頁(yè)的映射關(guān)系不要求連續(xù),也不要求有序,多個(gè)虛擬頁(yè)可以對(duì)應(yīng)一
8、個(gè)物理頁(yè)。它的每一個(gè)元素稱為一個(gè)頁(yè)表項(xiàng)(PTE),在Intel系統(tǒng)上,頁(yè)表項(xiàng)長(zhǎng)度為32位,4個(gè)字節(jié),包含以下信息:(1) 有效標(biāo)志:表示頁(yè)表本項(xiàng)是否有效(2)映射關(guān)系:本頁(yè)表項(xiàng)所對(duì)應(yīng)的物理頁(yè)編號(hào)(3)訪問(wèn)控制信息:描述本頁(yè)是否可寫?是否包含執(zhí)行代碼。3.3 虛擬內(nèi)存區(qū)域的代碼實(shí)現(xiàn)的每個(gè)進(jìn)程都有自己的頁(yè)目錄和頁(yè)表,通過(guò)頁(yè)目錄和頁(yè)表,每個(gè)進(jìn)程有擁有4GB的虛擬地址空間。進(jìn)程的所有信息比如代碼、數(shù)據(jù)、堆棧、共享區(qū)等。Linux使用結(jié)構(gòu)vm_area_struct(vma)結(jié)構(gòu)來(lái)描述一個(gè)虛擬內(nèi)存區(qū)域,其定義如下,具體如圖2所示:struct vm_area_struct struct mm_struc
9、t * vm_mm; /* 指向虛擬區(qū)所在的mm_struct結(jié)構(gòu)的指針*/ unsigned long vm_start; /* 在vm_mm中的起始地址*/ unsigned long vm_end; /*在vm_mm中的結(jié)束地址 */ struct vm_area_struct *vm_next; pgprot_t vm_page_prot; /* 對(duì)這個(gè)虛擬區(qū)間的存取保護(hù)權(quán)限(只讀、只寫、執(zhí)行) */ unsigned long vm_flags; /* 虛擬區(qū)間的標(biāo)志.(讀、寫、共享) */ 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; /*對(duì)這個(gè)區(qū)間進(jìn)行操作的函數(shù) */ unsigned long vm_pgoff; /*映射文件中的偏移量 */struct file * vm_file; /*指向映射文件的文件對(duì)象 */unsigned long vm_raend; /* 預(yù)讀信息 */void * vm_private_data; /* 指向內(nèi)存區(qū)的私有數(shù)據(jù) */.圖2. Linux虛擬內(nèi)存管理器的實(shí)現(xiàn)思路linux利用了面向?qū)ο蟮乃枷耄岩?/p>
11、個(gè)虛存區(qū)看成一個(gè)對(duì)象,用vm_area_struct(vma)描述對(duì)象屬性,其中的vm_operation描述了對(duì)象的操作,定義如下: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 虛擬內(nèi)存區(qū)域虛擬內(nèi)存管理器還需要一個(gè)地方來(lái)記錄進(jìn)程中與內(nèi)存有關(guān)的信息,如進(jìn)程頁(yè)目錄的位置,進(jìn)程的代碼、數(shù)據(jù)、堆棧等在虛擬空間的位置進(jìn)程駐留在物理內(nèi)存中的頁(yè)面的個(gè)數(shù),為此,Linux為每個(gè)進(jìn)程重建了一個(gè)內(nèi)存管理結(jié)構(gòu)mm_struct,來(lái)管理進(jìn)程中與虛擬內(nèi)
13、存相關(guān)的信息。該結(jié)構(gòu)定義如下: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; *進(jìn)程頁(yè)目錄基地址*/atomic_t mm_users; /*用戶空間中的有多少用戶*/ atomic_t mm_count; /*對(duì)"struct mm_struct"引用的計(jì)數(shù)*/ int map_count; /*虛擬區(qū)間的個(gè)
14、數(shù)*/ struct rw_semaphore mmap_sem;/*線性區(qū)的讀寫信號(hào)量*/spinlock_t page_table_lock; /*線性區(qū)的自旋鎖和頁(yè)表的自旋鎖 */ struct list_head mmlist; /*所有活動(dòng)(active)mm的鏈表 */unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack; /* 堆的相關(guān)信息*/ unsigned long arg_start, arg_end, env_start, e
15、nv_end; unsigned long rss, total_vm, locked_vm; unsigned long def_flags;/* 線性區(qū)默認(rèn)的訪問(wèn)標(biāo)志*/進(jìn)程的task_struct結(jié)構(gòu)中包含一個(gè)mm域,指向mm_struct。進(jìn)程的mm_struct包含進(jìn)程的可執(zhí)行映像信息和進(jìn)程頁(yè)目錄指針PGD等。該結(jié)構(gòu)還包含指向vm_area_struct結(jié)構(gòu)的指針,每一個(gè)vm_area_struct代表進(jìn)程一個(gè)虛擬地址空間,如圖3所示:圖3. 相關(guān)數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系3.5 虛擬內(nèi)存區(qū)域在進(jìn)程的生命周期中,它的虛擬地址空間會(huì)不斷變化,過(guò)程如下:(1)在進(jìn)程重建時(shí),從父進(jìn)程拷貝虛擬地址空
16、間。在拷貝的過(guò)程中,系統(tǒng)根據(jù)父進(jìn)程虛擬地址空間的定義,復(fù)制一套內(nèi)存管理結(jié)構(gòu)(mm_struct,vm_area_struct,頁(yè)目錄,頁(yè)表)。(2)在進(jìn)程需要裝入自己的執(zhí)行映像時(shí),系統(tǒng)將先廢棄進(jìn)程當(dāng)前的虛擬地址空間,而后再根據(jù)執(zhí)行映像的定義重建新的內(nèi)存管理系統(tǒng)。(3)在進(jìn)程執(zhí)行過(guò)程中,會(huì)不斷的發(fā)生缺頁(yè)異常,異常處理程序會(huì)不斷的修改頁(yè)目錄和頁(yè)表項(xiàng)。(4)在物理內(nèi)存緊張,需要回收內(nèi)存時(shí),物理內(nèi)存回收程序會(huì)將進(jìn)程的某些暫時(shí)不用的頁(yè)從內(nèi)存中換出。一個(gè)虛擬頁(yè)如何被換出有它所在的虛擬內(nèi)存區(qū)域決定的。(5)在進(jìn)程執(zhí)行過(guò)程中,進(jìn)程的虛擬頁(yè)會(huì)不斷的換進(jìn)換出,系統(tǒng)只在內(nèi)存中為每個(gè)進(jìn)程保留它最需要的頁(yè)。這樣,系統(tǒng)就
17、用有限的物理內(nèi)存為每個(gè)進(jìn)程模擬出4GB的虛擬地址空間。(6)在進(jìn)程結(jié)束時(shí),系統(tǒng)會(huì)釋放它的所有的內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu),同時(shí)釋放它在內(nèi)存中所有的頁(yè),從而釋放它的所有虛擬地址空間。3.6 映射關(guān)系在早期的系統(tǒng)中,Linux僅用了mm_struct、vm_area_struct、頁(yè)目錄和頁(yè)表描述進(jìn)程的虛擬空間,這些數(shù)據(jù)定義了一種正映射關(guān)系。然而在某些時(shí)候比如物理頁(yè)回收,還需要逆向映射關(guān)系,以便能方便的使用一個(gè)物理頁(yè)或者是文件頁(yè)的所有進(jìn)程及該頁(yè)在進(jìn)程中對(duì)應(yīng)的虛擬頁(yè),為此,新的linux版本引進(jìn)了逆向映射關(guān)系。3.6.1 文件頁(yè)到虛擬頁(yè)的逆映射關(guān)系(1)如果虛擬頁(yè)的內(nèi)容來(lái)源于文件且該文件的文件區(qū)間僅僅被映射
18、到一個(gè)進(jìn)程的虛擬內(nèi)存空間里面,則虛擬內(nèi)存建立的就是文件頁(yè)與虛擬頁(yè)的一一對(duì)應(yīng)的關(guān)系。(2)如果某文件頁(yè)的文件區(qū)間被同時(shí)映射到多個(gè)進(jìn)程的虛擬地址空間中,那么,那么每個(gè)進(jìn)程都會(huì)為包含該頁(yè)的文件區(qū)間建立一個(gè)虛擬內(nèi)存區(qū)域,這些內(nèi)存區(qū)域建立的是文件頁(yè)到虛擬頁(yè)一對(duì)多的映射關(guān)系。為了找到一個(gè)文件頁(yè)對(duì)應(yīng)的所有的虛擬頁(yè),Linux為每個(gè)文件建立了一個(gè)文件地址空間address_space。給定一個(gè)文件頁(yè)(頁(yè)號(hào)為pgoff),查它的address_space,可得到包含該頁(yè)的所有內(nèi)存區(qū)域vma,進(jìn)而可得出該頁(yè)在各進(jìn)程虛擬地址空間的虛擬地址。3.6.2 物理頁(yè)到虛擬頁(yè)的逆映射關(guān)系一個(gè)物理頁(yè)的內(nèi)容可能是動(dòng)態(tài)建立的(匿名
19、頁(yè)),也可能來(lái)源于一個(gè)文件(映射頁(yè))。來(lái)源于文件的頁(yè)可能屬于共享區(qū)域,也可能屬于私有區(qū)域。不用來(lái)源的物理頁(yè)需要不同的逆向映射關(guān)系。(1)匿名頁(yè)屬于匿名的虛擬內(nèi)存空間。值得注意的是,共享物理頁(yè)的多個(gè)匿名虛擬內(nèi)存區(qū)域具有相同的屬性和大小,也就是說(shuō)物理頁(yè)在各區(qū)域中的偏移量是相同的。為了便于一個(gè)物理頁(yè)找到所有的虛擬頁(yè),Linux做了以下的安排:首先為每一類匿名虛擬內(nèi)存空間定義一個(gè)匿名結(jié)構(gòu)anno_vma,共享同樣的物理頁(yè)、具有相同屬性的虛擬內(nèi)存區(qū)域被組織在一個(gè)anno_vma結(jié)構(gòu)中(雙向鏈表),然后復(fù)制page結(jié)構(gòu)中的三個(gè)域,讓_mapcount記錄映射到該頁(yè)的虛擬頁(yè)的個(gè)數(shù),mapping指向anon
20、_vma結(jié)構(gòu)、index記錄頁(yè)在虛擬內(nèi)存區(qū)域的頁(yè)號(hào)。給定一個(gè)物理頁(yè)的page結(jié)構(gòu),查與之關(guān)聯(lián)的anon_vma結(jié)構(gòu),可找到包含它的所有虛擬內(nèi)存區(qū)域的vma,進(jìn)而可得出它在各虛擬地址空間中的虛擬地址。(2)共享映射頁(yè)屬于共享區(qū)域,其內(nèi)容來(lái)源于文件,可以被多個(gè)進(jìn)程占用,因此會(huì)出現(xiàn)在多個(gè)進(jìn)程的頁(yè)表中。為了便于找到共享頁(yè)對(duì)應(yīng)的所有虛擬頁(yè),Linux復(fù)用了page中的三個(gè)域,在_mapcount中映射到該物理頁(yè)的虛擬頁(yè)的個(gè)數(shù), mapping指向文件的地址空間address_space、在index中記錄該頁(yè)在文件中的偏移量。進(jìn)而可得出該頁(yè)在各虛擬空間的虛擬地址。(3)私有映射頁(yè)屬于私有區(qū)域,其內(nèi)容來(lái)源
21、于文件,可以被多個(gè)進(jìn)程讀或者執(zhí)行,但是只能被一個(gè)進(jìn)程修改。私有類型的虛擬內(nèi)存區(qū)域出現(xiàn)在文件的地址空間中。如果進(jìn)程未對(duì)私有映射頁(yè)實(shí)行寫操作,則它使用的是該頁(yè)的正本。正本的page結(jié)構(gòu)設(shè)置與共享映射頁(yè)相同。獲得物理頁(yè)對(duì)應(yīng)的虛擬頁(yè)的方式也相同。如果進(jìn)程對(duì)私有頁(yè)實(shí)行了寫操作,則它使用的就是該頁(yè)的副本,通過(guò)文件地址空間已經(jīng)無(wú)法確定與副本頁(yè)對(duì)應(yīng)的虛擬頁(yè)。linux做了如下處理:首先,將包含副本頁(yè)的虛擬內(nèi)存區(qū)域同時(shí)加入到文件地址空間和匿名域中,然后復(fù)用page結(jié)構(gòu)中的三個(gè)域,讓_mapcount記錄映射該頁(yè)的虛擬頁(yè)的個(gè)數(shù),mapping指向anon_vma結(jié)構(gòu)、index記錄頁(yè)在文件中的頁(yè)號(hào)。給定一個(gè)副本頁(yè)
22、的page結(jié)構(gòu),查與之相關(guān)的anno_vma結(jié)構(gòu),可以找到包含他所有的虛擬內(nèi)存區(qū)域vma,進(jìn)而可以得出他在個(gè)虛擬地址空間中的虛擬地址。4 虛擬內(nèi)存的重建和拷貝4.1 虛擬內(nèi)存的重建進(jìn)程創(chuàng)建時(shí),通過(guò)虛擬內(nèi)存的拷貝,已經(jīng)為子進(jìn)程建立了虛擬內(nèi)存地址空間。只有當(dāng)進(jìn)程希望改變自己的行為時(shí),它可以調(diào)用exec函數(shù),根據(jù)新的執(zhí)行映像重建自己的虛擬內(nèi)存空間。完成執(zhí)行映像加載的函數(shù)是exec,該函數(shù)在處理完參數(shù)以后,最終會(huì)調(diào)用函數(shù)do_execve,所以真正完成虛擬內(nèi)存建立工作的函數(shù)是do_execve。除了exec以外,Linux還提供了一個(gè)系統(tǒng)調(diào)用old_mmap,讓用戶建立自己的內(nèi)存映射區(qū)域,如為打開一個(gè)
23、數(shù)據(jù)文件建立虛擬映射區(qū)域。系統(tǒng)調(diào)用old_mmap函數(shù)直接從用戶空間接受參數(shù),該函數(shù)定義如下,包含了建立虛擬內(nèi)存映射需要的所有的信息:asmlinkage int old_mmap(struct mmap_arg_struct *arg)函數(shù)old_mmap將參數(shù)拷貝到內(nèi)核,然后調(diào)用函數(shù)do_mmap建立內(nèi)存映射區(qū)域。do_mmap用于一個(gè)虛擬內(nèi)存區(qū)域的建立,其建立的內(nèi)存映射區(qū)域主要有兩種:共享區(qū)域和私有區(qū)域。共享區(qū)域的頁(yè)允許多個(gè)進(jìn)程共享,它在內(nèi)存中只有一份拷貝,進(jìn)程可以直接修改共享映射區(qū)域的頁(yè),當(dāng)需要將共享映射頁(yè)從內(nèi)存中換出時(shí),系統(tǒng)會(huì)將修改過(guò)的共享映射頁(yè)直接寫回到映射文件。私有區(qū)域的頁(yè)是進(jìn)程
24、專有的,多進(jìn)程可以讀,但是某進(jìn)程如果修改的話,系統(tǒng)會(huì)為寫進(jìn)程創(chuàng)建一個(gè)副本,其操作都是在副本上進(jìn)行的,當(dāng)要將私有映射頁(yè)交換出內(nèi)存時(shí),系統(tǒng)會(huì)將其寫到交換設(shè)備,而不是映射文件。函數(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)映射到進(jìn)程虛擬內(nèi)存的paddr,paddr+length),flags指定了映射類型(共
25、享、私有等),prot指定該內(nèi)存區(qū)域的保護(hù)權(quán)限(讀、寫、執(zhí)行、不可訪問(wèn)等)。如果映射類型指定為MAP_FIXED,則paddr就是addr,否則,paddr是系統(tǒng)根據(jù)情況決定的一個(gè)虛擬地址(addr是首選)。4.2 虛擬內(nèi)存的拷貝linux提供了很靈活的進(jìn)程創(chuàng)建機(jī)制,一般分為兩種情況:第一種是在進(jìn)程創(chuàng)建標(biāo)志中指出了CLONE_VM,則父子進(jìn)程共用同一個(gè)虛擬地址空間,頁(yè)目錄也是公用的。另一種進(jìn)程的創(chuàng)建使用Copy on Write技術(shù),從父進(jìn)程拷貝頁(yè)目錄和頁(yè)表,但將父子進(jìn)程的頁(yè)表項(xiàng)都設(shè)置為只讀,頁(yè)面的拷貝推遲到寫操作進(jìn)行。為了拷貝虛擬內(nèi)存空間,需要將父進(jìn)程的內(nèi)存結(jié)構(gòu)mm_struct拷貝到子進(jìn)程
26、,拷貝的內(nèi)容包括各個(gè)內(nèi)存結(jié)構(gòu)vm_area_struct和每個(gè)內(nèi)存區(qū)對(duì)應(yīng)的頁(yè)目錄,頁(yè)表項(xiàng),但是不拷貝內(nèi)容。完成內(nèi)存拷貝的函數(shù)是copy_mm。該函數(shù)的工作流程如下所示:(1)如果標(biāo)志clone_flags中設(shè)置了CLONE_VM,則父子進(jìn)程要共用同樣的內(nèi)存結(jié)構(gòu)mm_struct,只需將父進(jìn)程內(nèi)存結(jié)構(gòu)的引用計(jì)數(shù)加1即可,返回0.(2)否則,要拷貝內(nèi)存結(jié)構(gòu):1) 向內(nèi)存管理器申請(qǐng)一個(gè)mm_struct結(jié)構(gòu):mm=mm_alloc();2) 如果申請(qǐng)成功,則從父進(jìn)程中拷貝內(nèi)容:*mm=*current->mm;將該結(jié)構(gòu)的應(yīng)用計(jì)數(shù)值記為1;將mm結(jié)構(gòu)的map_count,def_flags,mm
27、ap, mmap_avl,map_cache等區(qū)域清空。3)將申請(qǐng)到的mm_struct結(jié)構(gòu)填入進(jìn)程結(jié)構(gòu):tsk->mm=mm;4)設(shè)置進(jìn)程結(jié)構(gòu)的參數(shù),如將min_flt,maj_flt,cmin_flt的值為05)為新進(jìn)程創(chuàng)建段LDT:copy_segment(nr,tsk,mm)6)為新進(jìn)程創(chuàng)建頁(yè)目錄:new_page_tables(tsk)7)將新頁(yè)目錄的首地址放到新進(jìn)程TSS段的CR3域和新進(jìn)程內(nèi)存結(jié)構(gòu)的頁(yè)目錄域中:SET_PAGE_DIR(tsk,new_page);tsk->mm->pgd=new_pg; 將父進(jìn)程的所有的虛擬內(nèi)存區(qū)域都拷貝到新進(jìn)程中:dup_mm
28、ap(mm);函數(shù)dup_mmap(mm)的工作流程如下所示:(1)找到父進(jìn)程的vma鏈表:mpnt=current->mm->mmap;(2)如果mpnt為空,則跳轉(zhuǎn)到(11)。(3)從內(nèi)存管理器中申請(qǐng)一個(gè)vm_area_srtuct結(jié)構(gòu)tmp。(4)拷貝vm_area_srtuct結(jié)構(gòu)的信息:*tmp=*mpnt(5)調(diào)整新vm_area_struct結(jié)構(gòu)的某些域,如vm_flags,vm_mm等。 (6)如果是一個(gè)文件映射區(qū)域,則將文件結(jié)構(gòu)vm_file的計(jì)數(shù)加1, 將新vma結(jié)構(gòu)加入文件inode結(jié)構(gòu)的vma中??截愴?yè)目錄、頁(yè)表項(xiàng):retval=copy_page_range(mm,current->mm,tmp);(8)如果tmp的操作集合定義有open操作,則執(zhí)行它:tmp->vm_ops->open(tmp);(9)將tmp加入到內(nèi)存管理結(jié)構(gòu)mm的vma隊(duì)列中(10)mpnt=mpnt->vm_next,轉(zhuǎn)(2)。(11)到此為止,所有的內(nèi)存區(qū)域都已經(jīng)拷貝完畢。如果新進(jìn)程的內(nèi)存區(qū)域總數(shù)大于AVL_MIN_MAP_COUNT,則為其建立
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)間融資借款合同范本
- 酒店物資采購(gòu)銷售合同
- 土工材料訂購(gòu)協(xié)議模板在線
- 政府單位采購(gòu)合同中的保密條款
- 快餐配送協(xié)議樣式
- 瓦工班組分包勞務(wù)規(guī)定
- 永州市房產(chǎn)買賣協(xié)議范例
- 建筑拆除合同樣本
- 空調(diào)故障及時(shí)告知
- 木材供應(yīng)訂購(gòu)協(xié)議
- 面試評(píng)估表及評(píng)分標(biāo)準(zhǔn)及面試評(píng)估表及評(píng)估標(biāo)準(zhǔn)
- 消防安全重點(diǎn)單位規(guī)范化管理手冊(cè)
- 【拓展閱讀】類文閱讀《王羲之吃墨》
- 熱電廠機(jī)組A級(jí)檢修策劃書
- 浙教版數(shù)學(xué)八年級(jí)下冊(cè)全冊(cè)優(yōu)質(zhì)課件
- 第三講:蘇聯(lián)模式興衰
- GB/T 5623-2008產(chǎn)品電耗定額制定和管理導(dǎo)則
- GB/T 41002-2022兒童箱包通用技術(shù)規(guī)范
- 光學(xué)5(光的偏振)
- GB/T 20833-2007旋轉(zhuǎn)電機(jī)定子線棒及繞組局部放電的測(cè)量方法及評(píng)定導(dǎo)則
- 2023年企業(yè)法律顧問(wèn)服務(wù)進(jìn)度月報(bào)
評(píng)論
0/150
提交評(píng)論