操作系統(tǒng)實踐第17章linux內(nèi)存管理_第1頁
操作系統(tǒng)實踐第17章linux內(nèi)存管理_第2頁
操作系統(tǒng)實踐第17章linux內(nèi)存管理_第3頁
操作系統(tǒng)實踐第17章linux內(nèi)存管理_第4頁
操作系統(tǒng)實踐第17章linux內(nèi)存管理_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第17章Linux內(nèi)存管理操作系統(tǒng)實踐山東科技大學(xué)操作系統(tǒng)教研組了解Linux物理內(nèi)存管理方法了解IA32架構(gòu)中的邏輯地址映射機制,包括分段和分頁了解Linux的分段機制及其特色理解并掌握Linux從線性地址到物理地址的映射機制理解Linux進(jìn)程虛擬地址空間機制理解Linux虛擬內(nèi)存區(qū)域vma的管理方法與操作系統(tǒng)知識相結(jié)合,深入理解內(nèi)存在計算機運行過程中的重要性。與具體計算機架構(gòu)和操作統(tǒng)相結(jié)合,深入認(rèn)識內(nèi)存管理中的設(shè)計原則、技巧和方法。結(jié)合本章實驗,深入理解進(jìn)程創(chuàng)建以及進(jìn)程上下文切換的流程。本章目標(biāo)實驗1:獲取IA32段寄存器中的描述符實驗2:獲取IA32中的全局段表信息實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址實驗4:顯示進(jìn)程的虛擬內(nèi)存地址空間分布信息實驗5:獲取一個進(jìn)程的虛擬存儲區(qū)域信息第17章Linux內(nèi)存管理實驗?zāi)康牧私釯A32架構(gòu)中的邏輯地址映射機制了解Linux的分段機制及其特色實驗1:獲取IA32段寄存器中的描述符

實驗2:獲取IA32中的全局段表信息

實驗內(nèi)容通過添加內(nèi)核模塊來獲取段寄存器的值,驗證Linux中段的設(shè)置本節(jié)實驗代碼為電子資源中“/源代碼/ch17/segmentselector/”目錄下的相關(guān)文件實驗1:使用內(nèi)存映射文件實現(xiàn)進(jìn)程間通信

實驗內(nèi)容通過添加內(nèi)核模塊來獲取GDT中各個段的段描述,驗證Linux中段的設(shè)置實驗代碼為電子資源中“/源代碼/ch17/myhshowgdt/”目錄下的相關(guān)文件實驗2:獲取IA32中的全局段表信息

原理/背景:段寄存器和段地址映射機制教材p.244-246實驗1/2原理/背景:IA32段地址和頁地址映射機制實驗1/2原理/背景:IA32段選擇符進(jìn)程由不同的段組成,如CS、DS等;CS由包括應(yīng)用程序代碼段、內(nèi)核代碼段(應(yīng)用程序調(diào)用內(nèi)核代碼)等。這些段具有不同的權(quán)限,并且放置在不同的內(nèi)存位置因此程序在運行時,必須指明當(dāng)前運行的是哪一段;CPU據(jù)此施加不同的保護(hù)措施實驗1/2原理/背景:IA32段描述符實驗1/2段段描述符BaseGLimitSTypeDPLP內(nèi)核代碼段00CF9B000000FFFF0x0000000010xFFFFF11031內(nèi)核數(shù)據(jù)段00CF93000000FFFF0x0000000010xFFFFF1231用戶代碼段00CFFB000000FFFF0x0000000010xFFFFF11001用戶數(shù)據(jù)段00CFF3000000FFFF0x0000000010xFFFFF1201原理/背景IA32結(jié)構(gòu)中的控制寄存器

教材p.249IA32結(jié)構(gòu)中PAE機制教材p.249Linux中的內(nèi)存尋址機制如何與IA32結(jié)構(gòu)相適應(yīng)教材P.250-252實驗1/2總結(jié)實驗1、2的重點是體會和理解Linux操作系統(tǒng)的分段機制如何與IA32結(jié)構(gòu)相適應(yīng)的。Linux把用戶代碼段、數(shù)據(jù)段以及內(nèi)核代碼段、數(shù)據(jù)段等段的編號都固定在GDT表中,而且每段的起始地址都為0。也就是說,經(jīng)過Linux段機制映射后,CPU發(fā)出的邏輯地址段+偏移量就映射為固定的段號+段的起始地址0+線性地址。實驗1和2中很多內(nèi)容都是工程性的,也即硬性規(guī)定,比如IA32中的段寄存器、控制寄存器等。在Linux內(nèi)核中內(nèi)存管理部分與硬件架構(gòu)聯(lián)系非常密切;Linux在不同的硬件架構(gòu)上采用的內(nèi)存管理方案在實現(xiàn)上有差異。實驗1/2實驗?zāi)康牧私釯A32架構(gòu)中的邏輯地址映射機制,包括分段和分頁了解Linux的分段機制及其特色理解并掌握Linux從線性地址到物理地址的映射機制實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址

實驗內(nèi)容通過添加內(nèi)核模塊來獲取一個應(yīng)用程序變量的物理地址,驗證Linux中分頁機制的設(shè)置和實現(xiàn)方法實驗代碼為電子資源中“/源代碼/ch17/logadd2phyadd/”目錄下的相關(guān)文件實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址實驗步驟logadd2phyadd_test.c為測試程序,即應(yīng)用程序,按普通方式編譯和執(zhí)行。Logadd2phyadd.c為LKM內(nèi)核模塊,需要編譯后通過insmod命令添加到系統(tǒng)中執(zhí)行l(wèi)ogadd2phyadd_test程序時,其中write語句會把要查找的虛擬地址addr發(fā)送給Logadd2phyadd模塊;Logadd2phyadd將根據(jù)頁表映射機制查找器物理地址,并返回給應(yīng)用程序。實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址原理/背景:IA32頁面址映射機制實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址原理/背景:Linux頁面址映射機制實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址?頁全局目錄PGD(PageGlobalDirectory)?頁上級目錄PUD(PageUpperDirectory)?頁中間目錄PMD(PageMiddleDirectory)?頁表PTE(PageTable)原理/背景:Linux頁面址映射機制實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址每一級頁目錄都有三個重要的宏,SHIFT、MASK和SIZE。以頁表PageTable為例,其定義如下:#definePAGE_SHIFT 12#definePAGE_SIZE (1<<PAGE_SHIFT)#definePAGE_SIZE (1UL<<PAGE_SHIFT)#definePAGE_MASK (~(PAGE_SIZE-1))原理/背景:logadd2phyadd.c中vaddr2paddr函數(shù)的要點首先需要根據(jù)傳入的參數(shù)pid進(jìn)行find_get_pid調(diào)用,然后再調(diào)用pid_task獲得該進(jìn)程的task結(jié)構(gòu)體指針。一個虛擬地址只有在進(jìn)程自己的地址空間中才是有意義的。其次,根據(jù)進(jìn)程的任務(wù)描述符進(jìn)行地址映射。Linux內(nèi)核3.13.0使用的是四級映射機制。在IA32架構(gòu)上,PUD實際上不起作用。然后,在四級頁表映射完成之后計算該線性地址對應(yīng)的物理地址paddr=(pte_val(*pte_tmp)&PAGE_MASK)|(vaddr&~PAGE_MASK);

其中pte_val(*pte_tmp)&PAGE_MASK獲得的是物理幀號,而vaddr&~PAGE_MASK獲得的則是在該物理幀內(nèi)的偏移量。二者進(jìn)行或操作后就得到了完整的物理地址。最后輸出物理幀號、幀內(nèi)偏移量等信息實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址原理/背景:測試應(yīng)用程序logadd2phyadd_test.c的要點實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址intmain(){ unsignedlongtmp,addr; intfd,len; mydatawdata; tmp=0x12345678; addr=&tmp;printf("tmpvalueis:0x%08lX\n",tmp); printf("tmpaddressis:0x%08lX\n",addr); wdata.addr=addr; wdata.p=getpid();//打包傳遞給內(nèi)核模塊的數(shù)據(jù) printf("thepidis%d\n",getpid()); fd=open(“/proc/logadd2phyadd”,O_RDWR);//打開內(nèi)核模塊在proc的接口 write(fd,&wdata,sizeof(mydata));//把進(jìn)程id和要查找的虛擬地址傳遞給LKM len=read(fd,buf,BUFSIZE);//從proc中的LKM接口讀取返回的信息printf("thereadlengthis%dandthebufcontentis:\n%s\n",len,buf); return0;}typedefstructdata{ unsignedlongaddr;//應(yīng)用程序線性地址 intp;//應(yīng)用程序pid}mydata;原理/背景:測試結(jié)果說明實驗3:獲取C程序中一個邏輯地址對應(yīng)的物理地址以上是應(yīng)用程序自身產(chǎn)生信息的輸出以下是應(yīng)用程序從LKM模塊獲得的信息Linux四級頁表機制的相關(guān)信息:包括偏移量和各級頁表中的條目數(shù)輸入的邏輯地址、及其對應(yīng)的物理地址和該地址存儲的內(nèi)容;請與上面應(yīng)用程序的輸出進(jìn)行對比實驗?zāi)康睦斫釲inux進(jìn)程虛擬地址空間機制了解Linux的物理內(nèi)存管理機制加深對進(jìn)程以及進(jìn)程結(jié)構(gòu)體概念的理解實驗4:顯示進(jìn)程的虛擬內(nèi)存地址空間分布信息實驗內(nèi)容通過添加內(nèi)核模塊來獲取一個進(jìn)程的mm_struct結(jié)構(gòu)體信息本節(jié)實驗代碼為電子資源中“/源代碼/ch17/mm/”目錄下的相關(guān)文件實驗4:顯示進(jìn)程的虛擬內(nèi)存地址空間分布信息實驗?zāi)康睦斫釲inux虛擬內(nèi)存區(qū)域vma的管理方法理解Linux進(jìn)程虛擬地址空間機制了解Linux的物理內(nèi)存管理機制實驗5:獲取一個進(jìn)程的虛擬存儲區(qū)域信息實驗內(nèi)容過添加內(nèi)核模塊來獲取一個進(jìn)程的vm_area_struct結(jié)構(gòu)體信息本節(jié)實驗代碼為電子資源中“/源代碼/ch17/vma/”目錄下的相關(guān)文件實驗5:獲取一個進(jìn)程的虛擬存儲區(qū)域信息原理/背景:Linux物理內(nèi)存管理機制Linux的物理內(nèi)存管理主要由內(nèi)存節(jié)點node、內(nèi)存區(qū)域zone和物理頁框page三級架構(gòu)組成一個節(jié)點由多個zone組成,每個zone又由很多page組成。經(jīng)常使用的zone有如下類型:ZONE_DMA:包含0~16M地址范圍的物理內(nèi)存空間。Linux將低端的16M物理內(nèi)存保留以便與老式設(shè)備兼容。ZONE_NORMAL:包含16M~896M地址范圍的物理內(nèi)存空間。該區(qū)域被直接映射到內(nèi)核的線性地址空間的低地址區(qū)域。內(nèi)核大部分操作都是在ZONE_NORMAL中完成的。ZONE_HIGHMEM:896M~結(jié)束地址范圍的物理內(nèi)存空間。這些物理內(nèi)存無法直接映射到內(nèi)核空間。一般都是由應(yīng)用程程序使用注意:Linux中的page結(jié)構(gòu)體用于物理幀;與一般操作系統(tǒng)教材中page用于邏輯頁不同。實驗4/5原理/背景:Linux中進(jìn)程的虛擬地址空間實驗4/5在IA32架構(gòu)上Linux的線性空間為4GB大小。Linux內(nèi)核將這4G字節(jié)的空間分為兩部分。內(nèi)核使用最高的1G字節(jié)稱為“內(nèi)核空間”。而較低的3G字節(jié)則由各個進(jìn)程使用,稱為“用戶空間”。從具體進(jìn)程的角度來看,每個進(jìn)程可以擁有4G字節(jié)的虛擬地址空間(也叫虛擬內(nèi)存);其中每個進(jìn)程各自的私有用戶空間為前3G,這個空間對系統(tǒng)中的其他進(jìn)程是不可見的,而最高的1GB內(nèi)核空間則為所有用戶進(jìn)程以及內(nèi)核所共享圖17.11Linux中的虛擬地址空間原理/背景:Linux中進(jìn)程的虛擬地址空間實驗4/5如圖17.11所示,在進(jìn)程虛擬地址空間的內(nèi)核空間中,Linux內(nèi)核映像處于0xC0000000到0xFFFFFFFF范圍內(nèi)。所以鏈接程序在鏈接內(nèi)核映像到進(jìn)程虛地址空間時在所有符號地址上加一個偏移量0xC0000000。該偏移量在Linux代碼中被稱為PAGE_OFFSET。從進(jìn)程虛地址映射到實際物理地址時,進(jìn)程內(nèi)核空間的映射總是從最低地址(0x00000000)開始。所以內(nèi)核映射遵循如下方法:給定一個虛地址X,其對應(yīng)的物理地址為“X-PAGE_OFFSET”;反之,給定一個物理地址Y,則其對應(yīng)的虛地址為“Y+PAGE_OFFSET”。這也是為什么在實驗2myshowgdt和實驗3logadd2phyadd兩個內(nèi)核代碼中,物理地址和虛擬內(nèi)核空間地址進(jìn)行轉(zhuǎn)換時需要加上PAGE_OFFSET的原因。原理/背景:Linux中進(jìn)程的虛擬

溫馨提示

  • 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

提交評論