版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux進(jìn)程地址空間管理第一頁,共24頁。進(jìn)程地址空間管理:管什么?管3GB的用戶虛擬地址空間:哪些區(qū)域被分配了,哪些區(qū)域是空閑的被分配區(qū)域的用途、權(quán)限等屬性信息頁表的相應(yīng)部分需要?jiǎng)?chuàng)建映射時(shí)再創(chuàng)建頁表,不需要時(shí)釋放頁表(而內(nèi)核空間對(duì)應(yīng)的頁表永不釋放)被映射給進(jìn)程的物理內(nèi)存需要時(shí)動(dòng)態(tài)申請(qǐng),不需要時(shí)釋放不要求物理內(nèi)存必須連續(xù)回收暫時(shí)不用的頁框(Ch.17)2第二頁,共24頁。進(jìn)程地址空間管理2個(gè)原則“先申請(qǐng),后使用”“不用了,及時(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)核會(huì)創(chuàng)建一個(gè)對(duì)應(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)庫(kù)…為了加速查找空閑虛擬內(nèi)存區(qū),Linux同時(shí)將同一進(jìn)程的所有線性區(qū)組織成一棵紅黑樹。線性區(qū)的開始和結(jié)束都必須4KB對(duì)齊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í),會(huì)觸發(fā)缺頁異常。在缺頁異常的中斷服務(wù)程序中按“一次一頁”的方式分配物理頁框,并修改頁表。14第十四頁,共24頁。增加或刪除一個(gè)線性區(qū)第十五頁,共24頁。處理線性區(qū)的函數(shù)內(nèi)核進(jìn)程需要對(duì)一個(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,長(zhǎng)度為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è)備對(duì)象映射到虛擬內(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:指定映射對(duì)象的類型,映射選項(xiàng)和映射頁是否可以共享。MAP_SHARED
/MAP_PRIVATE/MAP_LOCKED/MAP_ANONYMOUSfd:文件描述符(由open函數(shù)返回)offset:表示被映射對(duì)象(即文件)從那里開始對(duì)映,通常都是用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í)會(huì)一次性將整個(gè)被映射文件讀入內(nèi)存嗎?即用mmap函數(shù)映射一個(gè)大文件時(shí)會(huì)很耗時(shí)嗎?21第二十一頁,共24頁。mmap的應(yīng)用快速讀寫大文件,簡(jiǎn)化程序邏輯??焖僮x寫I/O設(shè)備(如V4L庫(kù))創(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【大學(xué)課件】單片機(jī)原理與應(yīng)用設(shè)計(jì) 子程序結(jié)構(gòu)
- DB14T-日光溫室草莓固碳生產(chǎn)技術(shù)規(guī)程編制說明
- 《PCT在細(xì)菌感染診》課件
- 《母嬰護(hù)理員》課件
- 《電子郵件課件》課件
- 單位管理制度展示選集【職員管理】十篇
- 醫(yī)藥高新區(qū)排水防澇設(shè)施項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)拿地
- 單位管理制度收錄大合集人員管理篇十篇
- 《頭暈的健康教育》課件
- 2025房屋裝修合同范本版
- 辦理落戶新生兒委托書模板
- 施工現(xiàn)場(chǎng)環(huán)境因素識(shí)別、評(píng)價(jià)及環(huán)境因素清單、控制措施
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 兒科護(hù)士述職報(bào)告2024
- 股權(quán)投資協(xié)議的風(fēng)險(xiǎn)控制
- 酒店微笑服務(wù)培訓(xùn)
- 浙江省嘉興市2023-2024學(xué)年七年級(jí)上學(xué)期語文期末試卷(含答案)
- 《鴻蒙智能互聯(lián)設(shè)備開發(fā)(微課版)》全套教學(xué)課件
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 物理 含解析
- 安全與急救學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024電力安全工器具及小型施工機(jī)具預(yù)防性試驗(yàn)規(guī)程
評(píng)論
0/150
提交評(píng)論