計(jì)算機(jī)操作系統(tǒng)(第二版)課件:Linux內(nèi)存管理機(jī)制_第1頁
計(jì)算機(jī)操作系統(tǒng)(第二版)課件:Linux內(nèi)存管理機(jī)制_第2頁
計(jì)算機(jī)操作系統(tǒng)(第二版)課件:Linux內(nèi)存管理機(jī)制_第3頁
計(jì)算機(jī)操作系統(tǒng)(第二版)課件:Linux內(nèi)存管理機(jī)制_第4頁
計(jì)算機(jī)操作系統(tǒng)(第二版)課件:Linux內(nèi)存管理機(jī)制_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Linux內(nèi)存管理機(jī)制4.7.1Linux地址映射機(jī)制虛擬地址空間程序可以看到和使用的空間大小與實(shí)際可用的物理內(nèi)存數(shù)量無關(guān)每個(gè)進(jìn)程的虛擬地址空間都是獨(dú)立的分為內(nèi)核空間和用戶空間(TASK_SIZE)例如32位系統(tǒng)是232=4GB虛擬地址虛擬地址空間中的地址稱為虛擬地址程序中使用的就是虛擬地址Linux采用分頁機(jī)制以頁面為單位對(duì)虛擬地址空間進(jìn)行劃分頁面大小通常為2k(例如k=9,10,11,12)Linux特權(quán)級(jí)核心態(tài)用戶態(tài)Linux采用四級(jí)頁表PGDPUDPMDPTE與體系結(jié)構(gòu)相關(guān)的頭文件include/asm-arch/page.hinclude/asm-arch/pgtable.hinclude/asm-x86/page_32.hinclude/asm-x86/pgtable_64.h#definePAGE_SIZE(1UL<<PAGE_SHIFT)#definePAGE_MASK(~(PAGE_SIZE-1))查代碼:PUD_MASK、PMD_MASK和PGDIR_MASK?2.物理內(nèi)存空間與物理地址系統(tǒng)配置的物理內(nèi)存所提供的存儲(chǔ)空間物理內(nèi)存也是采用字節(jié)編址CPU的字長(zhǎng)也限制了物理內(nèi)存的最大長(zhǎng)度物理內(nèi)存與進(jìn)程的虛擬地址空間無關(guān)物理內(nèi)存往往小于虛擬地址空間虛擬空間只有一部分映射到物理內(nèi)存空間物理內(nèi)存空間也劃分為與頁面大?。?kB)相同的頁框(物理塊)頁面裝入頁框頁框是內(nèi)存分配的基本單位Linux提供了slab機(jī)制分配處理小于一個(gè)頁框的分配請(qǐng)求物理地址是一維線性地址X86架構(gòu)(32位)支持4GB內(nèi)存。通過引入PAE,物理地址36位,支持64GB內(nèi)存。3.地址映射機(jī)制進(jìn)程執(zhí)行期間所產(chǎn)生的虛擬地址,不能直接用于訪存,經(jīng)過地址變換,得到對(duì)應(yīng)的實(shí)際物理地址,稱為地址映射機(jī)制。Linux的四級(jí)頁表每級(jí)頁表也稱為頁目錄,表項(xiàng)稱為目錄項(xiàng)四種目錄項(xiàng)結(jié)構(gòu)定義在page.h中pgd_tpud_tpmd_tpte_t查代碼:看看pte_t頁表項(xiàng)是如何構(gòu)成的。圖4-29Linux多級(jí)頁表和地址映射示意圖查代碼:Linux如何設(shè)置使四級(jí)頁表實(shí)際相當(dāng)于二級(jí)頁表的?提示:將PUD和PMD頁目錄表的表項(xiàng)的數(shù)量都設(shè)置為1項(xiàng)PTRS_PER_PMD和PTRS_PER_PUD都等于1模擬上級(jí)頁目錄和中間頁目錄include/asm-generic/pgtable-nopud.hinclude/asm-generic/pgtable-nopmd.h4.7.2Linux物理內(nèi)存空間管理Linux物理內(nèi)存劃分為內(nèi)核空間和用戶空間內(nèi)核空間在系統(tǒng)啟動(dòng)的過程中加載了操作系統(tǒng)的內(nèi)核用戶空間的管理采用的是伙伴系統(tǒng),實(shí)現(xiàn)對(duì)內(nèi)存頁框的分配和回收,頁框是管理的最小單位slab分配機(jī)制處理小于一個(gè)頁框的內(nèi)存空間分配請(qǐng)求1.內(nèi)存的組織模型兩種方式一致內(nèi)存訪問UMA:內(nèi)存是連續(xù)的一個(gè)整體,CPU可以一致地訪問非一致內(nèi)存訪問NUMA:每個(gè)CPU訪問其本地內(nèi)存時(shí)速度很快,當(dāng)訪問其他CPU的內(nèi)存時(shí)速度就要慢一些內(nèi)存節(jié)點(diǎn)、內(nèi)存域和頁框的關(guān)系模型圖(1)節(jié)點(diǎn)node在NUMA系統(tǒng)中,內(nèi)存以節(jié)點(diǎn)node為起始每個(gè)節(jié)點(diǎn)關(guān)聯(lián)一個(gè)CPU表示為一個(gè)pg_data_t數(shù)據(jù)結(jié)構(gòu)的實(shí)例定義在include/linux/mmzone.h文件中多個(gè)CPU則對(duì)應(yīng)多個(gè)節(jié)點(diǎn)和多個(gè)pg_data_t結(jié)構(gòu)體的實(shí)例節(jié)點(diǎn)的pg_data_t結(jié)構(gòu)體實(shí)例通過pgdat_next指針構(gòu)成單向鏈表每個(gè)節(jié)點(diǎn)包含若干不同類型的內(nèi)存域zone(2)內(nèi)存域zone存儲(chǔ)在節(jié)點(diǎn)實(shí)例的結(jié)構(gòu)體數(shù)組node_zones中node_zonelists是節(jié)點(diǎn)的后備內(nèi)存域列表整型變量nr_zones存儲(chǔ)了節(jié)點(diǎn)中所包含的內(nèi)存域的數(shù)量每個(gè)內(nèi)存域都包含一定數(shù)量的頁框node_mem_map指向頁框結(jié)構(gòu)體數(shù)組node_spanned_pages頁框總數(shù)量用伙伴系統(tǒng)管理連續(xù)頁框內(nèi)存塊free_area數(shù)組(3)頁框page每個(gè)頁框都有一個(gè)page結(jié)構(gòu)體實(shí)例page結(jié)構(gòu)體數(shù)量巨大定義在/include/linux/mm_types.h中伙伴系統(tǒng)把連續(xù)的空閑頁框組織成不同大小的內(nèi)存塊查代碼:page結(jié)構(gòu)體中為什么使用union?2.伙伴系統(tǒng)(Buddy)是一種古老的算法(1965年)能夠很好地兼顧內(nèi)存分配器的速度和效率管理內(nèi)存塊的分配和回收(1)基本原理將2k(0≤k≤11)個(gè)連續(xù)頁框構(gòu)成內(nèi)存塊包含2k個(gè)頁框的內(nèi)存塊都放置在隊(duì)列k中對(duì)于分配n大小內(nèi)存的請(qǐng)求2m-1≤n

≤2m在隊(duì)列m中查找空閑塊如果m隊(duì)列里沒有,則查看m+1隊(duì)列若m+1隊(duì)列非空,則取一塊分為兩個(gè)2m的塊若m+1隊(duì)列空,則繼續(xù)查找更大塊的隊(duì)列,直至隊(duì)列11(即211大小塊的隊(duì)列)若找到則多次平分,獲得并分配一塊2m大小的塊否則返回內(nèi)存分配錯(cuò)誤圖4-31伙伴系統(tǒng)分配示例free_area[]數(shù)組中各個(gè)元素的索引(數(shù)組下標(biāo))也可以解釋為階確定了對(duì)應(yīng)空閑塊鏈表中內(nèi)存塊所包含的連續(xù)頁框的數(shù)量例如free_area[0]對(duì)應(yīng)的是內(nèi)存塊是單個(gè)頁框(20=1),free_area[1]對(duì)應(yīng)鏈表中內(nèi)存塊包含2個(gè)頁框,其他以此類推。圖4-32伙伴系統(tǒng)內(nèi)存域中空閑內(nèi)存塊鏈表(2)申請(qǐng)內(nèi)存內(nèi)存塊分配方式主要有兩種:快速分配伙伴系統(tǒng)首先嘗試快速分配,根據(jù)zonelist鏈表的優(yōu)先級(jí)順序,以內(nèi)存域的low閥值從相應(yīng)內(nèi)存域的伙伴系統(tǒng)中分配內(nèi)存塊,成功則返回內(nèi)存塊的第一個(gè)頁框的頁描述符。慢速分配如果所有內(nèi)存域的快速分配都不成功,則進(jìn)行慢速分配。根據(jù)zonelist鏈表的優(yōu)先級(jí)順序,以內(nèi)存域的min閥值從相應(yīng)內(nèi)存域的伙伴系統(tǒng)中分配連續(xù)頁框,如果失敗,先嘗試回收釋放內(nèi)存空間,再嘗試分配。(3)釋放內(nèi)存包括如下幾個(gè)步驟:檢查要釋放的頁框是否被其他進(jìn)程使用(頁描述符page的_count是否為0)。歸還單頁框。歸還2k個(gè)頁框的內(nèi)存塊。在歸還伙伴系統(tǒng)的過程中,可能會(huì)與伙伴合并,變?yōu)楦唠A(order)的鏈表中的節(jié)點(diǎn)。3.slab分配器char*p;p=(char*)malloc(sizeof(char)*10);如果使用伙伴系統(tǒng)為其分配一個(gè)4KB的頁框就是很浪費(fèi)了。slab分配器先向伙伴系統(tǒng)申請(qǐng)分配單個(gè)頁框或者一個(gè)內(nèi)存塊,然后在此基礎(chǔ)上將整塊頁面分割成大小相等的小內(nèi)存塊,稱為對(duì)象,以滿足小內(nèi)存空間分配的需要。slab分配器對(duì)于頻繁使用的對(duì)象,采用了緩存的方式提高系統(tǒng)效率。slab緩存的構(gòu)成基本可以分成兩部分:保存管理性數(shù)據(jù)的緩存對(duì)象保存被管理對(duì)象的各個(gè)slab4.7.3Linux虛擬地址空間管理每個(gè)進(jìn)程都有一個(gè)自己可以訪問的連續(xù)內(nèi)存區(qū),但不是實(shí)際的物理內(nèi)存,所以稱為虛擬地址空間。每個(gè)進(jìn)程都具有同樣的系統(tǒng)視圖,多個(gè)進(jìn)程因此可以同時(shí)運(yùn)行,而不會(huì)相互干擾。虛擬地址空間通過地址映射與物理地址空間關(guān)聯(lián),但是并非所有的頁面都有對(duì)應(yīng)的頁框,只有部分頁面裝載到物理內(nèi)存中。各個(gè)進(jìn)程的虛擬地址空間從0開始直到TASK_SIZE–1,其上是內(nèi)核地址空間。32位系統(tǒng)中的虛擬地址空間可以達(dá)到232=4GB按照3:1的比例劃分內(nèi)核部分:1GB(0xC0000000~0xFFFFFFFF)用戶部分:3GB(0x00000000~0xBFFFFFFF)所有進(jìn)程的內(nèi)核空間部分的內(nèi)容總是相同的用戶進(jìn)程不能訪問內(nèi)核空間用戶進(jìn)程不能訪問其他用戶進(jìn)程的虛擬空間1.進(jìn)程的虛擬地址空間/*include/linux/mm_types.h*/structmm_struct{structvm_area_struct*mmap; /*listofVMAs*/structrb_rootmm_rb;

structvm_area_struct*mmap_cache; /*lastfind_vmaresult*/unsignedlong(*get_unmapped_area)(structfile*filp,

unsignedlongaddr,unsignedlonglen,

unsignedlongpgoff,unsignedlongflags);

void(*unmap_area)(structmm_struct*mm,unsignedlongaddr);

unsignedlongmmap_base; /*mmap區(qū)域基地址*/

unsignedlongtask_size; /*進(jìn)程虛擬空間的長(zhǎng)度

*/

unsignedlongstart_code,end_code,start_data,end_data;

unsignedlongstart_brk,brk,start_stack;

unsignedlongarg_start,arg_end,env_start,env_end;};2.數(shù)據(jù)結(jié)構(gòu)可執(zhí)行代碼段:start_code~end_code數(shù)據(jù)段:start_data~end_data堆空間:start_brk~brk(brk值會(huì)改變)虛擬地址空間中用于內(nèi)存映射的起始地址mm_struct->mmap_baseTASK_UNMAPPED_BASE一般是TASK_SIZE的1/3處在32位系統(tǒng)中為0x40000000進(jìn)程的地址空間長(zhǎng)度:task_size通常是TASK_SIZEtext段起始地址與體系結(jié)構(gòu)有關(guān)在32位系統(tǒng)中是0x08048000其他系統(tǒng)中也有使用其他起始地址的該地址之前的地址空間(約128M),用于捕獲NULL指針text段之后緊接著就是堆,自下向上增長(zhǎng)棧stack起始于STACK_TOPPF_RANDOMIZE標(biāo)志棧的起始地址會(huì)在進(jìn)程啟動(dòng)時(shí)減少一個(gè)隨機(jī)量提高了惡意代碼通過緩存溢出攻擊的難度大多數(shù)體系結(jié)構(gòu)設(shè)置的STACK_TOP就是TASK_SIZE,即用戶空間中最高可用地址棧是自頂向下進(jìn)行擴(kuò)展的棧里的初始數(shù)據(jù)進(jìn)程的參數(shù)列表:arg_start和arg_end環(huán)境變量:env_start和env_end都是位于棧中最高的區(qū)域進(jìn)程虛擬內(nèi)存相關(guān)數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系3.內(nèi)核虛擬地址空間在整個(gè)物理內(nèi)存中內(nèi)核只存儲(chǔ)了一份映射到每個(gè)進(jìn)程的虛擬地址空間中每個(gè)進(jìn)程的內(nèi)核虛擬地址空間內(nèi)容都相同在32體系結(jié)構(gòu)的系統(tǒng)中,按照3:1的比例劃分,Linux內(nèi)核空間占用進(jìn)程虛擬地址空間的3G~4G的地址空間,大小為1GB內(nèi)核地址空間劃分為三種類型的區(qū)ZONE_DMA:3G之后起始的16MBZONE_NORMAL:16MB~896MBZONE_HIGHMEM:896MB~1G內(nèi)核的虛擬地址和內(nèi)核的實(shí)際物理地址其實(shí)只相差一個(gè)起始地址偏移量:實(shí)際物理地址=虛擬地址–0xC0000000內(nèi)核高端內(nèi)存區(qū)ZONE_HIGHMEM區(qū)是專門開辟的一塊不必線性映射,可以靈活定制映射的區(qū)域,用于訪問1GB以上物理內(nèi)存的區(qū)域通過借一段虛擬地址空間,建立臨時(shí)地址映射,用完后釋放,這段虛擬地址空間可以循環(huán)使用,訪問所有物理內(nèi)存高端內(nèi)存(128MB)劃分為3個(gè)功能區(qū):VMALLOC部分從VMALLOC_START到VMALLOC_END的區(qū)域用于物理上不連續(xù)的內(nèi)核映射,訪問1GB內(nèi)核以外的物理內(nèi)存空間永久映射部分從KMAP_BASE到FIXADDR_START的區(qū)域用于將高端內(nèi)存域中的非持久頁映射到內(nèi)核中固定映射部分從FIXADDR_START到4G的區(qū)域用于虛擬地址空間中的頁面與物理地址空間中的頁框的固定映射4.8本章小結(jié)存儲(chǔ)器管理概述多級(jí)存儲(chǔ)體系存儲(chǔ)器管理功能程序的裝入

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論