




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux進(jìn)程地址空間管理第一頁,共24頁。進(jìn)程地址空間管理:管什么?管3GB的用戶虛擬地址空間:哪些區(qū)域被分配了,哪些區(qū)域是空閑的被分配區(qū)域的用途、權(quán)限等屬性信息頁表的相應(yīng)部分需要?jiǎng)?chuàng)建映射時(shí)再創(chuàng)建頁表,不需要時(shí)釋放頁表(而內(nèi)核空間對應(yīng)的頁表永不釋放)被映射給進(jìn)程的物理內(nèi)存需要時(shí)動(dòng)態(tài)申請,不需要時(shí)釋放不要求物理內(nèi)存必須連續(xù)回收暫時(shí)不用的頁框(Ch.17)2第二頁,共24頁。進(jìn)程地址空間管理2個(gè)原則“先申請,后使用”“不用了,及時(shí)釋放”盡量推遲物理內(nèi)存的分配時(shí)機(jī)3第三頁,共24頁。內(nèi)存描述符(mm_struct)每個(gè)進(jìn)程都有自己獨(dú)立的3GB的線性地址空間。該空間不同的區(qū)域有不同的用途:代碼區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)、堆區(qū)…與進(jìn)程地址空間有關(guān)的全部信息都包含在一個(gè)叫內(nèi)存描述符的數(shù)據(jù)結(jié)構(gòu)中。4第四頁,共24頁。相關(guān)的數(shù)據(jù)結(jié)構(gòu)task_struct用于描述一個(gè)進(jìn)程,task_struct中有一個(gè)字段:structmm_struct*mm;mm_struct用于描述一個(gè)進(jìn)程虛擬地址空間的布局。mm_struct中有一個(gè)字段mmap,指向了一個(gè)鏈表。
structvm_area_struct*mmapmmap鏈表中的一個(gè)節(jié)點(diǎn)vm_area_struct記錄了實(shí)際分配的一個(gè)內(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)程地址空間中的一個(gè)區(qū)域被分配給了進(jìn)程,則內(nèi)核會創(chuàng)建一個(gè)對應(yīng)的線性區(qū),也叫虛擬內(nèi)存區(qū)(VMA)屬于同一個(gè)進(jìn)程地址空間的線性區(qū)形成一個(gè)鏈表。不同的VMA綁定不同的訪問權(quán)限和屬性:可讀、可寫、可執(zhí)行、私有、共享、鎖定等。不同的VMA中存放了不同類型的數(shù)據(jù):代碼、全局變量、只讀數(shù)據(jù)、動(dòng)態(tài)庫…為了加速查找空閑虛擬內(nèi)存區(qū),Linux同時(shí)將同一進(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)存動(dòng)態(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)用戶堆棧不夠用的時(shí)候,需要擴(kuò)展堆棧上述操作都可能引起線性區(qū)數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建和刪除。13第十三頁,共24頁。如何實(shí)現(xiàn)進(jìn)程地址空間動(dòng)態(tài)內(nèi)存分配查找進(jìn)程虛擬地址空間是否存在大小合適的空閑區(qū)域。如果有,則創(chuàng)建相應(yīng)的線性區(qū)描述符vm_area_struct,并將其插入鏈表mmap線性區(qū)創(chuàng)建成功后,立即返回(注意,沒有分配相應(yīng)的物理頁框,也沒有修改頁表?。┊?dāng)用戶程序訪問剛剛動(dòng)態(tài)分配的內(nèi)存時(shí),會觸發(fā)缺頁異常。在缺頁異常的中斷服務(wù)程序中按“一次一頁”的方式分配物理頁框,并修改頁表。14第十四頁,共24頁。增加或刪除一個(gè)線性區(qū)第十五頁,共24頁。處理線性區(qū)的函數(shù)內(nèi)核進(jìn)程需要對一個(gè)線性區(qū)進(jìn)行處理,比如確定一個(gè)給定線性地址是否存在于一個(gè)線性地址空間中find_vma(),查找一個(gè)線性地址所屬的線性區(qū)兩個(gè)參數(shù):進(jìn)程內(nèi)存描述符的地址mm和線性地址addrfind_vma_intersection(),查找一個(gè)與給定地址區(qū)間重疊的線性區(qū)get_unmapped_area(),查找一個(gè)空閑的地址區(qū)間insert_vm_struct(),向內(nèi)存描述符鏈表中插入一個(gè)線性區(qū)split_vma(),拆分線性區(qū)第十六頁,共24頁。創(chuàng)建一個(gè)線性區(qū)間mmap()和do_mmap(),創(chuàng)建一個(gè)線性區(qū)根據(jù)file參數(shù)映射指定的文件中偏移量為offset,長度為len的一段內(nèi)容addr參數(shù)指明從何處開始查找一段可用的空閑線性地址區(qū)間Prot參數(shù)指定這個(gè)區(qū)間所包含的頁的存取權(quán)限flags參數(shù)指定這個(gè)創(chuàng)建的線性區(qū)本身的一些標(biāo)志staticinlineunsignedlongdo_mmap(structfile*file, unsignedlongaddr, unsignedlonglen, unsignedlongprot, unsignedlongflag, unsignedlongoffset)
include/linux/mm.h第十七頁,共24頁。刪除一個(gè)線性區(qū)間munmap()和do_munmap()do_munmap()函數(shù)從進(jìn)程地址空間中刪除一段線性空間mm參數(shù)指向了當(dāng)前進(jìn)程的內(nèi)存描述符addr參數(shù)為線性區(qū)的起始地址len參數(shù)指明要?jiǎng)h除的區(qū)間大小intdo_munmap (structmm_struct*mm,unsignedlongaddr, size_tlen) mm/mmap.c第十八頁,共24頁。mmap內(nèi)存映射利用mmap函數(shù)可以將一個(gè)磁盤文件或者其它設(shè)備對象映射到虛擬內(nèi)存空間。文件被映射到多個(gè)頁上,所有頁的大小之和大于等于文件大小。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)志,是以下的某個(gè)值,可以通過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í)行時(shí)會一次性將整個(gè)被映射文件讀入內(nèi)存嗎?即用mmap函數(shù)映射一個(gè)大文件時(shí)會很耗時(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是整個(gè)物理內(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游景區(qū)擴(kuò)建用地居間
- 新能源汽車充電樁上市公司
- 新能源技術(shù)發(fā)展及應(yīng)用練習(xí)題
- 三農(nóng)村電商三農(nóng)村電商與旅游融合方案
- 農(nóng)業(yè)綜合開發(fā)項(xiàng)目可行性研究報(bào)告
- 醫(yī)療器械可行性分析報(bào)告模板
- 磐安縣生活垃圾焚燒發(fā)電項(xiàng)目
- 電影娛樂產(chǎn)業(yè)制作與發(fā)行指南
- 品牌傳播策略實(shí)施方案
- 三農(nóng)創(chuàng)新驅(qū)動(dòng)發(fā)展戰(zhàn)略作業(yè)指導(dǎo)書
- 《美的集團(tuán)財(cái)務(wù)分析報(bào)告(2020-2022)【論文】》
- 2021年四川省綿陽市中考語文真題及答案
- 公司休假銷假單模板
- 婦產(chǎn)科介入治療護(hù)理常規(guī)
- 《基于杜邦分析法的企業(yè)財(cái)務(wù)分析國內(nèi)外文獻(xiàn)綜述》
- 統(tǒng)計(jì)學(xué)調(diào)查報(bào)告(共5篇)
- 四川大學(xué)C語言上機(jī)考試題
- 2022年蕪湖職業(yè)技術(shù)學(xué)院職業(yè)適應(yīng)性測試題庫及答案解析
- DBJ∕T 15-134-2018 廣東省地下管線探測技術(shù)規(guī)程
- 人崗匹配分析和總結(jié)
- 幼小銜接拼音課程 課件(共49張PPT)
評論
0/150
提交評論