Linux操作系統(tǒng)分析9-1_第1頁
Linux操作系統(tǒng)分析9-1_第2頁
Linux操作系統(tǒng)分析9-1_第3頁
Linux操作系統(tǒng)分析9-1_第4頁
Linux操作系統(tǒng)分析9-1_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Linux操作系統(tǒng)分析中國科學技術(shù)大學計算機系陳香蘭(0512-87161312)xlanchen@助教:裴建國、馮曉靜Autumn2008進程地址空間中國科學技術(shù)大學計算機系陳香蘭(0512-87161312)xlanchen@助教:裴建國、馮曉靜Autumn2008內(nèi)核態(tài)和用戶態(tài)分配內(nèi)存的不同內(nèi)核中的函數(shù)以直接了當?shù)姆绞将@得動態(tài)內(nèi)存內(nèi)核是操作系統(tǒng)中優(yōu)先級最高的成分。內(nèi)核信任自己采用我們上次課介紹的頁面級內(nèi)存分配和小內(nèi)存分配線性空間(3GB~4GB)線性空間(<3GB)物理內(nèi)存:highmem物理內(nèi)存:DMA物理內(nèi)存:Normal2/4/20233LinuxOSanalysis內(nèi)核態(tài)和用戶態(tài)分配內(nèi)存的不同給用戶態(tài)進程分配內(nèi)存時請求被認為是不緊迫的用戶進程不可信任因此,當用戶態(tài)進程請求動態(tài)內(nèi)存時,并沒有立即獲得實際的物理頁框,而僅僅獲得對一個新的線性地址區(qū)間的使用權(quán)這個線性地址區(qū)間會成為進程地址空間的一部分,稱作線性區(qū)(memoryareas)2/4/20234LinuxOSanalysis進程地址空間進程最多能訪問4GB的線性地址空間但進程在訪問某個線性空間之前,必須獲得該線性空間的許可因此,一個進程的地址空間是由允許該進程訪問的全部線性地址組成內(nèi)核使用線性區(qū)資源來表示線性地址空間每個線性區(qū)由起始線性地址、長度和一些存取權(quán)限描述2/4/20235LinuxOSanalysis與進程地址空間相關(guān)的描述符2/4/20236LinuxOSanalysis線性區(qū)的開始和結(jié)束都必須4KB對齊進程獲得新線性區(qū)的一些典型情況:剛剛創(chuàng)建的新進程使用exec系統(tǒng)調(diào)用裝載一個新的程序運行將一個文件(或部分)映射到進程地址空間中當用戶堆棧不夠用的時候,擴展堆棧對應(yīng)的線性區(qū)……2/4/20237LinuxOSanalysis線性區(qū)(memoryarea)比如0x08048000——0x0804C000這段線性地址空間被分配給了一個進程,進程就可以訪問這段地址空間進程只能訪問某個有效的memoryarea。進一步講,這個area可以被標志為只讀或者不可執(zhí)行(nonexecutable)如果進程試圖訪問一個有效的area之外的地址或者用不正確的方式訪問一個有效的area,內(nèi)核將通過段異常(segmentationfault)殺死這個進程2/4/20238LinuxOSanalysis線性區(qū)中可以包含各種內(nèi)容可執(zhí)行文件代碼段的內(nèi)存映射,就是.textsection數(shù)據(jù)段的內(nèi)存映射,.datasectionzeropage的內(nèi)存映射用來包含未初始化的全局變量,.bsssection為庫函數(shù)和鏈接器附加的代碼、數(shù)據(jù)、bss段文件的內(nèi)存映射共享內(nèi)存的映射匿名內(nèi)存區(qū)域的映射,比如通過malloc()函數(shù)申請的內(nèi)存區(qū)域2/4/20239LinuxOSanalysis進程地址空間中所有有效的線性地址都確定的存在于一個area中memoryareas不重疊進程中每個單獨的area對應(yīng)一個不同內(nèi)存區(qū):堆棧、二進制代碼、全局變量、文件映射等等task_struct中的內(nèi)存描述符2/4/202310LinuxOSanalysis內(nèi)核使用內(nèi)存描述符來描述進程的整個地址空間(即進程的全部線性區(qū))2/4/202311LinuxOSanalysis內(nèi)存描述符內(nèi)存描述符包含了跟進程地址空間相關(guān)的所有信息mm_users表示共享這個地址空間的進程數(shù)目比如兩個輕量級進程共享了這個area,mm_users就等于2mmap和mm_rb是兩個不同的數(shù)據(jù)結(jié)構(gòu),但是包含了相同的東西:進程地址空間中所有的memoryareas前者使用鏈表存儲areas后者用紅黑樹存儲areas所有的mm_struct結(jié)構(gòu)通過mmlist域鏈接在一個雙向鏈表上。這個鏈表的第一個元素是idle進程的mm_struct結(jié)構(gòu)2/4/202312LinuxOSanalysis分配一個內(nèi)存描述符copy_mm函數(shù)用來在fork()調(diào)用中從父進程拷貝內(nèi)存描述符而mm_struct數(shù)據(jù)結(jié)構(gòu)本身的空間是從mm_cachep指向的slab緩存中通過allocate_mm()宏分配得到的如果父進程在fork()創(chuàng)建子進程時,通過一些標志指明要和子進程共享地址空間。那么,只需要childtask->mm=parent->mm2/4/202313LinuxOSanalysis釋放一個內(nèi)存描述符在進程退出時,exit_mm()函數(shù)被調(diào)用首先做一些清除工作,更新一些內(nèi)核全局統(tǒng)計數(shù)據(jù)接著調(diào)用mmput(),這個函數(shù)減內(nèi)存描述符的mm_users域如果mm_users域變成了0,就調(diào)用mmdrop()函數(shù)來減mm_count域如果mm_count域變成了0,就由free_mm()宏調(diào)用kmem_cache_free()函數(shù)把mm_struct返還給mm_cachp指向slab緩存2/4/202314LinuxOSanalysis線性區(qū)(memoryareas)每個線性區(qū)由一個vm_area_struct結(jié)構(gòu)來表示這個結(jié)構(gòu)描述了一段給定的內(nèi)存區(qū)間區(qū)間中的地址都有同樣的屬性,比如同樣的存取權(quán)限和相關(guān)的操作函數(shù)用這個結(jié)構(gòu)可以表示各種線性區(qū),比如映射可執(zhí)行的二進制代碼的線形區(qū)、用作用戶態(tài)堆棧的線形區(qū)等等2/4/202315LinuxOSanalysis2/4/202316LinuxOSanalysis線性區(qū)的存取權(quán)限vm_flags域描述有關(guān)這個線性區(qū)全部頁的信息。例如,進程訪問每個頁的權(quán)限是什么。還有一些標志描述線性區(qū)自身,例如它應(yīng)該如何增長VM_READ,VM_WRITE,VM_EXECVM_SHAREDVM_RESERVEDVM_GROWSUP2/4/202317LinuxOSanalysis線性區(qū)的鏈表和紅黑樹通過內(nèi)存描述符中的兩個域mmap和mm_rb都可以訪問線性區(qū)。事實上,它們都指向了同一個vm_area_struct結(jié)構(gòu),只是鏈接的方式不同mmap指向的線性區(qū)鏈表用來遍歷整個進程的地址空間紅黑樹用來定位一個給定的線性地址落在進程地址空間中的哪一個線性區(qū)中2/4/202318LinuxOSanalysis處理線性區(qū)內(nèi)核進程需要對一個線性區(qū)進行處理,比如確定一個給定線性地址是否存在于一個線性地址空間中find_vma(),查找一個線性地址兩個參數(shù):進程內(nèi)存描述符的地址mm和線性地址addr2/4/202319LinuxOSanalysis創(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ū)本身的一些標志staticinlineunsignedlongdo_mmap(structfile*file, unsignedlongaddr, unsignedlonglen, unsignedlongprot, unsignedlongflag, unsignedlongoffset)

2/4/202320LinuxOSanalysis刪除一個線性區(qū)間munmap()和do_munmap()do_munmap()函數(shù)從進程地址空間中刪除一段線性空間mm參數(shù)指向了當前進程的內(nèi)存描述符addr參數(shù)為線性區(qū)的起始地址len參數(shù)指明要刪除的區(qū)間大小int

do_munmap

(struct

mm_struct*mm,unsignedlongaddr, size_t

len) 2/4/202321LinuxOSanalysis缺頁異常(i386中14號異常)如前所述,內(nèi)核只是通過mmap()等調(diào)用分配了一些線性地址空間給進程,并沒有真正的把實際的物理頁框分配給進程當進程試圖訪問這些分配給它的地址空間時,比如一段線性地址空間映射的是二進制代碼,則進程被調(diào)度執(zhí)行的時候會跳轉(zhuǎn)到這個地址上去執(zhí)行。此時,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論