Linux進(jìn)程地址空間管理_第1頁
Linux進(jìn)程地址空間管理_第2頁
Linux進(jìn)程地址空間管理_第3頁
Linux進(jìn)程地址空間管理_第4頁
Linux進(jìn)程地址空間管理_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Linux進(jìn)程地址空間管理第一頁,共24頁。進(jìn)程地址空間管理:管什么?管3GB的用戶虛擬地址空間:哪些區(qū)域被分配了,哪些區(qū)域是空閑的被分配區(qū)域的用途、權(quán)限等屬性信息頁表的相應(yīng)部分需要創(chuàng)建映射時再創(chuàng)建頁表,不需要時釋放頁表(而內(nèi)核空間對應(yīng)的頁表永不釋放)被映射給進(jìn)程的物理內(nèi)存需要時動態(tài)申請,不需要時釋放不要求物理內(nèi)存必須連續(xù)回收暫時不用的頁框(Ch.17)2第二頁,共24頁。進(jìn)程地址空間管理2個原則“先申請,后使用”“不用了,及時釋放”盡量推遲物理內(nèi)存的分配時機(jī)3第三頁,共24頁。內(nèi)存描述符(mm_struct)每個進(jìn)程都有自己獨(dú)立的3GB的線性地址空間。該空間不同的區(qū)域有不同的用途:代碼區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)、堆區(qū)…與進(jìn)程地址空間有關(guān)的全部信息都包含在一個叫內(nèi)存描述符的數(shù)據(jù)結(jié)構(gòu)中。4第四頁,共24頁。相關(guān)的數(shù)據(jù)結(jié)構(gòu)task_struct用于描述一個進(jìn)程,task_struct中有一個字段:structmm_struct*mm;mm_struct用于描述一個進(jìn)程虛擬地址空間的布局。mm_struct中有一個字段mmap,指向了一個鏈表。

structvm_area_struct*mmapmmap鏈表中的一個節(jié)點(diǎn)vm_area_struct記錄了實(shí)際分配的一個內(nèi)存區(qū)域。5第五頁,共24頁。進(jìn)程描述符(task_struct)structtask_struct{/*thesearehardcoded-don'ttouch*/volatilelongstate;/*-1unrunnable,0runnable,>0stopped*/longcounter;longpriority;….…………/*information*/structfs_struct*fs;/*open*/struct*files;/*memorymanagementinfo*/

structmm_struct*mm;….…………}第六頁,共24頁。內(nèi)存描述符第七頁,共24頁。內(nèi)存描述符(續(xù))第八頁,共24頁。內(nèi)存描述符(再續(xù))第九頁,共24頁。線性區(qū)(vm_area_struct)必須記錄進(jìn)程地址空間中哪些區(qū)域被使用了,而哪些區(qū)域空閑。如果進(jìn)程地址空間中的一個區(qū)域被分配給了進(jìn)程,則內(nèi)核會創(chuàng)建一個對應(yīng)的線性區(qū),也叫虛擬內(nèi)存區(qū)(VMA)屬于同一個進(jìn)程地址空間的線性區(qū)形成一個鏈表。不同的VMA綁定不同的訪問權(quán)限和屬性:可讀、可寫、可執(zhí)行、私有、共享、鎖定等。不同的VMA中存放了不同類型的數(shù)據(jù):代碼、全局變量、只讀數(shù)據(jù)、動態(tài)庫…為了加速查找空閑虛擬內(nèi)存區(qū),Linux同時將同一進(jìn)程的所有線性區(qū)組織成一棵紅黑樹。線性區(qū)的開始和結(jié)束都必須4KB對齊10第十頁,共24頁。VirtualMemoryAreas第十一頁,共24頁。與進(jìn)程地址空間相關(guān)的數(shù)據(jù)結(jié)構(gòu)mm_struct第十二頁,共24頁。觸發(fā)進(jìn)程空間的內(nèi)存動態(tài)分配的操作進(jìn)程創(chuàng)建:fork,execv,clone擴(kuò)充/緊縮堆內(nèi)存:brk,sbrk創(chuàng)建文件內(nèi)存映射或匿名映射:mmap,mremap,munmap創(chuàng)建進(jìn)程間共享內(nèi)存:shmat,shmdt當(dāng)用戶堆棧不夠用的時候,需要擴(kuò)展堆棧上述操作都可能引起線性區(qū)數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建和刪除。13第十三頁,共24頁。如何實(shí)現(xiàn)進(jìn)程地址空間動態(tài)內(nèi)存分配查找進(jìn)程虛擬地址空間是否存在大小合適的空閑區(qū)域。如果有,則創(chuàng)建相應(yīng)的線性區(qū)描述符vm_area_struct,并將其插入鏈表mmap線性區(qū)創(chuàng)建成功后,立即返回(注意,沒有分配相應(yīng)的物理頁框,也沒有修改頁表?。┊?dāng)用戶程序訪問剛剛動態(tài)分配的內(nèi)存時,會觸發(fā)缺頁異常。在缺頁異常的中斷服務(wù)程序中按“一次一頁”的方式分配物理頁框,并修改頁表。14第十四頁,共24頁。增加或刪除一個線性區(qū)第十五頁,共24頁。處理線性區(qū)的函數(shù)內(nèi)核進(jìn)程需要對一個線性區(qū)進(jìn)行處理,比如確定一個給定線性地址是否存在于一個線性地址空間中find_vma(),查找一個線性地址所屬的線性區(qū)兩個參數(shù):進(jìn)程內(nèi)存描述符的地址mm和線性地址addrfind_vma_intersection(),查找一個與給定地址區(qū)間重疊的線性區(qū)get_unmapped_area(),查找一個空閑的地址區(qū)間insert_vm_struct(),向內(nèi)存描述符鏈表中插入一個線性區(qū)split_vma(),拆分線性區(qū)第十六頁,共24頁。創(chuàng)建一個線性區(qū)間mmap()和do_mmap(),創(chuàng)建一個線性區(qū)根據(jù)file參數(shù)映射指定的文件中偏移量為offset,長度為len的一段內(nèi)容addr參數(shù)指明從何處開始查找一段可用的空閑線性地址區(qū)間Prot參數(shù)指定這個區(qū)間所包含的頁的存取權(quán)限flags參數(shù)指定這個創(chuàng)建的線性區(qū)本身的一些標(biāo)志staticinlineunsignedlongdo_mmap(structfile*file, unsignedlongaddr, unsignedlonglen, unsignedlongprot, unsignedlongflag, unsignedlongoffset)

include/linux/mm.h第十七頁,共24頁。刪除一個線性區(qū)間munmap()和do_munmap()do_munmap()函數(shù)從進(jìn)程地址空間中刪除一段線性空間mm參數(shù)指向了當(dāng)前進(jìn)程的內(nèi)存描述符addr參數(shù)為線性區(qū)的起始地址len參數(shù)指明要刪除的區(qū)間大小intdo_munmap (structmm_struct*mm,unsignedlongaddr, size_tlen) mm/mmap.c第十八頁,共24頁。mmap內(nèi)存映射利用mmap函數(shù)可以將一個磁盤文件或者其它設(shè)備對象映射到虛擬內(nèi)存空間。文件被映射到多個頁上,所有頁的大小之和大于等于文件大小。19第十九頁,共24頁。mmap內(nèi)存映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset)start:要映射到的虛擬內(nèi)存區(qū)域的起始地址,通常都是用NULL,NULL表示由內(nèi)核來指定該內(nèi)存地址length:要映射的內(nèi)存區(qū)域的大小prot:期望的內(nèi)存保護(hù)標(biāo)志,是以下的某個值,可以通過or運(yùn)算符組合到一起1.PROT_EXEC可執(zhí)行;2.PROT_READ可讀;3.PROT_WRITE可執(zhí)flags:指定映射對象的類型,映射選項(xiàng)和映射頁是否可以共享。MAP_SHARED

/MAP_PRIVATE/MAP_LOCKED/MAP_ANONYMOUSfd:文件描述符(由open函數(shù)返回)offset:表示被映射對象(即文件)從那里開始對映,通常都是用0。該值應(yīng)該為大小應(yīng)為PAGE_SIZE的整數(shù)倍返回值:成功則返回被映射虛擬內(nèi)存區(qū)的指針,失敗返回-1。20第二十頁,共24頁。mmap內(nèi)存映射int

munmap(void

*start,

size_t

length)取消映射關(guān)系

int

msync(const

void

*start,

size_t

length,

int

flags)將內(nèi)存中的內(nèi)容同步到文件

思考:mmap函數(shù)執(zhí)行時會一次性將整個被映射文件讀入內(nèi)存嗎?即用mmap函數(shù)映射一個大文件時會很耗時嗎?21第二十一頁,共24頁。mmap的應(yīng)用快速讀寫大文件,簡化程序邏輯??焖僮x寫I/O設(shè)備(如V4L庫)創(chuàng)建進(jìn)程間共享內(nèi)存(可利用/dev/zero文件)在用戶態(tài)的應(yīng)用程序中直接讀寫物理內(nèi)存(即讀寫指定物理地址上的內(nèi)存單元)。/dev/mem是整個物理內(nèi)存的全映像文件open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接著就可以用

溫馨提示

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

評論

0/150

提交評論