Linux虛存分析報(bào)告.doc_第1頁
Linux虛存分析報(bào)告.doc_第2頁
Linux虛存分析報(bào)告.doc_第3頁
Linux虛存分析報(bào)告.doc_第4頁
Linux虛存分析報(bào)告.doc_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Linux 虛虛 存存 分分 析析 報(bào)報(bào) 告告 方方 存存 好好 第一章第一章 前前 言言2 第二章第二章 LINUX 虛存管理概述虛存管理概述3 1 LINUX虛存管理的基本特點(diǎn)3 2 LINUX虛存管理的主要實(shí)現(xiàn)技術(shù)3 第三章第三章 LINUX 虛存管理數(shù)據(jù)結(jié)構(gòu)虛存管理數(shù)據(jù)結(jié)構(gòu)5 1 32 BIT虛擬地址5 2 LINUX的多級頁表結(jié)構(gòu)5 3 頁表項(xiàng)的格式6 4 動(dòng)態(tài)地址映射7 5 用戶進(jìn)程的虛擬內(nèi)存結(jié)構(gòu)8 6 我們的工作10 第四章第四章 PROCESS 的虛存管理數(shù)據(jù)結(jié)構(gòu)的建立 維護(hù) 拆除及相關(guān)系統(tǒng)調(diào)用流程的虛存管理數(shù)據(jù)結(jié)構(gòu)的建立 維護(hù) 拆除及相關(guān)系統(tǒng)調(diào)用流程11 1 進(jìn)程的載入 創(chuàng)建及內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)和鏈結(jié)關(guān)系的建立11 2 數(shù)據(jù)結(jié)構(gòu)及鏈結(jié)關(guān)系的拆除 SYS EXIT 13 3 缺頁中斷服務(wù)14 第五章第五章 主要函數(shù)分析主要函數(shù)分析16 MEMORY C16 MMAP C22 第六章第六章 后記后記29 一一一 前前 言言 Linux 是一個(gè)功能強(qiáng)大的操作系統(tǒng) 而內(nèi)存管理則是操作系統(tǒng)的核心 它負(fù)責(zé)管理計(jì) 算機(jī)系統(tǒng)的存儲器 作為操作系統(tǒng)的核心 必須能夠克服物理內(nèi)存的局限 使用戶進(jìn)程在 透明方式下 擁有比實(shí)際物理內(nèi)存大得多的內(nèi)存 其策略之一就是使用虛擬內(nèi)存 Linux 成功地實(shí)現(xiàn)了以虛擬內(nèi)存為核心的內(nèi)存管理策略 強(qiáng)大得分頁機(jī)制 公平得交換方式 各 類有效得高速緩存 以及以頁保護(hù)為主得保護(hù)措施等 內(nèi)存管理的目的是要盡可能地方便 用戶 同時(shí) Linux 系統(tǒng)通過對用戶進(jìn)程虛存的有效管理 作到了虛存對一般用戶和 Linux 程序員的透明 本文首先闡述了 Linux 虛存管理以基本特點(diǎn)和主要實(shí)現(xiàn)技術(shù) 并分析了 Linux 虛存管 理的主要數(shù)據(jù)結(jié)構(gòu)及其相關(guān)關(guān)系 圍繞它的建立 維護(hù) 使用和拆除 作了一個(gè)粗淺的剖 析 因本人水平有限 有不當(dāng)之處 請老師指正 同時(shí)應(yīng)該指出的是本文所做的工作離不 開同組的林濤 徐玫峰和范昭偉同學(xué)的幫助 謝謝他們 一一一 Linux 虛存管理概述虛存管理概述 Linux 的內(nèi)存管理采用頁式管理 使用多級頁表 動(dòng)態(tài)地址轉(zhuǎn)換機(jī)構(gòu)與主存 輔存共 同實(shí)現(xiàn)虛擬內(nèi)存 每個(gè)用戶 Process 擁有 4GB 的虛擬地址空間 Process 在運(yùn)行過程中可以 動(dòng)態(tài)浮動(dòng)和擴(kuò)展 為用戶提供了透明的 靈活有效的內(nèi)存使用方式 下面簡述 Linux 虛存 管理以基本特點(diǎn)和主要實(shí)現(xiàn)技術(shù) 1 Linux 虛存管理的基本特點(diǎn)虛存管理的基本特點(diǎn) 1 更大的地址空間 虛擬內(nèi)存可以是系統(tǒng)實(shí)際擁有的物理內(nèi)存的若干倍 因而它使得操作系統(tǒng)看 起來擁有比實(shí)際大得多的內(nèi)存 2 合理的物理內(nèi)存分配 Linux 通過共享和交換策略 使各個(gè)運(yùn)行的進(jìn)程能公平地共享內(nèi)存 3 保護(hù) Linux 存儲管理子系統(tǒng)為每一內(nèi)存頁設(shè)置了 上鎖位 在線性地址及每級頁 表頁項(xiàng)上設(shè)置了 讀 寫 位 這樣來確保某一個(gè)進(jìn)程不受其他進(jìn)程的干擾 即使 某一個(gè)進(jìn)程失敗了 也不會影響到其他進(jìn)程和操作系統(tǒng)本身 4 共享虛擬內(nèi)存 Linux 實(shí)現(xiàn)的虛擬內(nèi)存允許兩個(gè)進(jìn)程之間互相共享內(nèi)存 例如 共享的庫 在 這種情形之下 庫代碼僅存在于一個(gè)進(jìn)程 而不需要為每一個(gè)應(yīng)用都復(fù)制一份 2 Linux 虛存管理的主要實(shí)現(xiàn)技術(shù)虛存管理的主要實(shí)現(xiàn)技術(shù) 1 請求調(diào)頁 demanding paging 與內(nèi)存擴(kuò)展 用戶 Process 創(chuàng)建時(shí) 并不是將它所需所有頁都分配給相應(yīng)物理頁 開始時(shí)只裝入頁 面中 Process 的第一個(gè)頁面 其他頁根據(jù) Process 運(yùn)行過程的請求從外存調(diào)入所需頁面 當(dāng) Process 訪問一個(gè)頁表項(xiàng) P 位為 0 的頁中地址時(shí) 表示此頁不在主存中 將產(chǎn)生缺頁中斷 系統(tǒng)調(diào)用 handle mm fault 處理訪問異常 為之分配相應(yīng)物理頁后 它再調(diào)用 swap in 函數(shù) 從外存中讀入該頁面 Linux 是一種請求式分頁存貯管理 這才使之可以運(yùn)行大于主存空間的 Process 2 頁換出策略 內(nèi)存中頁面不足時(shí) Linux 使用頁面 AGE 技術(shù)實(shí)現(xiàn)了頁淘汰策略的最近最少使用 LRU 算法 即每次換出時(shí) 總是選擇最老的頁換出 對易于從其他設(shè)備上獲取的非臟 not dirty 頁面 Linux 采用丟棄 discarding 技術(shù) 如果發(fā)生過寫操作 則將該頁寫 入系統(tǒng)的 Swapfile 中 這樣就可以加快換入的速度 3 內(nèi)存共享 Linux 將內(nèi)存劃分為 4K 大小的頁面 為內(nèi)存共享提供了基礎(chǔ) 1 不同進(jìn)程間頁面共享時(shí) 可令共享該頁的 Process 的頁表項(xiàng) pte 均指向該頁 2 對 kernel 代碼和數(shù)據(jù)段的共享 通過 Process 創(chuàng)建時(shí) fork 函數(shù)將 kernel 代碼和數(shù) 據(jù)段映射到用戶虛存的 3GB 4GB 的空間中去 所以每個(gè) Process 都可以通過一定方式共享 kernel 的代碼和數(shù)據(jù)段 4 內(nèi)存保護(hù) 采用了 Hole 技術(shù) 虛存段的保護(hù) 地址轉(zhuǎn)換機(jī)構(gòu) 頁表存取控制位 R W 位 等 技術(shù)實(shí)現(xiàn)了內(nèi)存保護(hù) Hole 技術(shù) 物理內(nèi)存前 4K 是一空頁 empty zero page 用來捕獲 NULL 指 針的異常訪問 在 Process 每個(gè)虛存段后 都有一個(gè) 4K 的 Hole 用來捕獲虛存段的 越界訪問 虛存段保護(hù)方式 主存中虛存段的全部或部分可以設(shè)為保護(hù)方式 防止非法訪問 頁表項(xiàng)存取控制位 R W 位 頁表項(xiàng)以 R W 位表示此頁的存取權(quán)限 1 為 可讀寫 0 為不可讀寫 可用來防止越權(quán)訪問 地址轉(zhuǎn)換機(jī)構(gòu) 分頁存貯管理方法中 地址轉(zhuǎn)換機(jī)構(gòu)進(jìn)行的頁面映象實(shí)際上防止 了各 Process 的主存塊間互不干擾 起到 Process 隔離的作用 5 動(dòng)態(tài)地址變換 利用 i386 的地址變換機(jī)構(gòu) Linux 實(shí)現(xiàn)了動(dòng)態(tài)地址變換 Process 執(zhí)行時(shí)訪問到某一虛擬 地址時(shí)才確定其對應(yīng)的物理地址 這種方式為 Process 存貯塊的動(dòng)態(tài)和動(dòng)態(tài)擴(kuò)展提供了基 礎(chǔ) 一一一 Linux 虛存管理數(shù)據(jù)虛存管理數(shù)據(jù)結(jié)結(jié)構(gòu)構(gòu) 1 32 bit 虛擬地址虛擬地址 在 Linux 中 4GB 的虛存需通過 32 bit 地址進(jìn)行尋址 Linux 中虛擬地址與線形地址 為同一概念 虛擬地址被分割成 3 個(gè)子位段 其中 2 個(gè)子位段包含 10 位 1 個(gè)子位段包 含 12 位 如圖 2 1 所示 123 圖 1 32 位虛擬地址 3 個(gè)子位段分別表示不同含義 子位段 1 指向被稱作頁目錄 PGD 的一張表 子位段 2 指向被稱作頁表 PTE 的一張表 子位段 3 指向頁內(nèi)地址 2 Linux 的多級頁表結(jié)構(gòu)的多級頁表結(jié)構(gòu) 標(biāo)準(zhǔn)的 Linux 的虛存頁表為三級頁表 依次為頁目錄 Page Directory PGD 中間頁目 錄 Page Middle Directory PMD 頁表 Page Table PTE 如圖 2 2 所示 PGD PMD PTE PAGE FRAME 圖 2 Linux 的多級頁表結(jié)構(gòu) 在 i386 機(jī)器上 Linux 的頁表結(jié)構(gòu)實(shí)際為兩級 PGD 和 PMD 頁表是合二為一的 所有 有關(guān) PMD 的操作實(shí)際上是對 PGD 的操作 所以原代碼中形如 pgd 和 pmd 的函數(shù) 實(shí)現(xiàn)的功能也是一樣的 頁目錄 PGD 是一個(gè)大小為 4K 的表 每一個(gè) process 只有一個(gè)頁目錄 以 4 字節(jié)為 一個(gè)表項(xiàng) 分成 1024 個(gè)表項(xiàng) 或稱入口點(diǎn) 該表項(xiàng)的值為所指頁表的始地址 32 位虛擬 地址的第 1 個(gè)子位段共 10 位 其值的范圍從 0 到 1023 對應(yīng)于頁目錄的一個(gè)入口點(diǎn) 頁目錄 PTE 的每一個(gè)入口點(diǎn)的值為此表項(xiàng)所指的一頁框 page frame 32 位虛擬 地址的第 2 個(gè)子位段共 10 位 其值的范圍從 0 到 1023 頁框 page frame 并不是物理頁 它指是虛存的一個(gè)地址空間 3 頁表項(xiàng)的格式 頁表項(xiàng)的格式 Linux 中頁表每一個(gè)表項(xiàng)的格式 如圖所示 31 12 11 7 6 5 4 3 2 1 0 Address Reserved DA U RP SW 圖 3 頁表項(xiàng)格式 其中 各位段的含義如下 P 存在位 表示該表項(xiàng)對地址的轉(zhuǎn)換是否有效 i386 處理器在 P 0 時(shí)不解釋 表項(xiàng)中的任何位 此時(shí)這些位的含義完全由軟件自行解釋 P 位提供了至關(guān) 重要的屬性 以支持分頁機(jī)制 如果 P 1 則表示虛擬地址所對應(yīng)的頁框存 在于物理內(nèi)存中 訪問該虛擬地址的程序可以正常運(yùn)行 P 0 則表示虛擬 地址所對應(yīng)的頁框不存在于物理內(nèi)存中 訪問該虛擬地址的程序?qū)l(fā)頁 訪問異常 產(chǎn)生缺頁中斷 使得 Operating System 可以把缺少的頁從磁盤上 讀入內(nèi)存 并將讀入頁存入到表項(xiàng)中 然后將該頁標(biāo)志為存在 再使引起異 常的程序繼續(xù)執(zhí)行 R W 讀寫位 表示對該表項(xiàng)指向的頁可以進(jìn)行讀 寫或執(zhí)行操作 R W 1 則該頁 可寫 可讀 且可執(zhí)行 R W 0 則該頁可讀 可執(zhí)行 但不可寫 當(dāng)處理器 處于特權(quán)級 0 2 時(shí) R W 位被忽略 如該表項(xiàng)位于頁目錄中 則作用于該表 項(xiàng)映射的所有各頁 U S 用戶 系統(tǒng)位 U S 1 則該頁可在任何處理器特權(quán)級下訪問 U S 0 則該頁只 能在處理器特權(quán)級 0 2 下被訪問 如該表項(xiàng)位于頁目錄中 則作用于該表項(xiàng) 映射的所有各頁 D 已寫標(biāo)志位 在對該表項(xiàng)映射的頁進(jìn)行寫訪問之前 處理器對該位置 1 如 該表項(xiàng)是頁目錄中表項(xiàng) 處理器不修改 D 位 Address 頁框物理地址的高 20 位 系統(tǒng)將物理內(nèi)存分割成 4K 大小的內(nèi)存頁框 Address 實(shí)際上代表了頁框的幀號 4 動(dòng)態(tài)地址映射 動(dòng)態(tài)地址映射 Linus 虛存采用動(dòng)態(tài)地址映射方式 即 Process 的地址空間和存儲空間的對應(yīng)關(guān)系是在 程序的執(zhí)行過程中實(shí)現(xiàn)的 Process 每用到一個(gè)地址時(shí) 都需虛存的地址轉(zhuǎn)換機(jī)構(gòu)把虛擬 地址轉(zhuǎn)化為內(nèi)存的實(shí)際地址 其地址映射如下圖所示 圖 4 32 位虛擬地址轉(zhuǎn)換圖 動(dòng)態(tài)地址映射使 Linux 可以實(shí)現(xiàn) Process 在主存中的動(dòng)態(tài)重定位 虛存段的動(dòng)態(tài)擴(kuò)展和 移動(dòng) 也為虛存的實(shí)現(xiàn)提供了基礎(chǔ) 5 用戶進(jìn)程的虛擬內(nèi)存結(jié)構(gòu) 用戶進(jìn)程的虛擬內(nèi)存結(jié)構(gòu) 用戶進(jìn)程的虛擬內(nèi)存結(jié)構(gòu)如圖所示 mm struct 每一個(gè)進(jìn)程的 task struct 中都有一個(gè)結(jié)構(gòu) mm struct 此結(jié)構(gòu)包含了進(jìn)程中與儲存管理 相關(guān)的大部分信息 其申明如下 struct mm struct int count 使用該 mm 結(jié)構(gòu)的個(gè)數(shù) 如果是多處理機(jī) 則有可能 count 1 pgd t pgd 進(jìn)程頁目錄的起始地址 如上圖所示 unsigned long context unsigned long start code end code start data end data start code end code 進(jìn)程代碼段的起始地址和結(jié)束地址 start data end data 進(jìn)程數(shù)據(jù)段的起始地址和結(jié)束地址 unsigned long start brk brk start stack start mmap unsigned long arg start arg end env start env end arg start arg end 調(diào)用參數(shù)區(qū)的起始地址和結(jié)束地址 env start env end 進(jìn)程環(huán)境區(qū)的起始地址和結(jié)束地址 unsigned long rss total vm locked vm rss 進(jìn)程內(nèi)容駐留在物理內(nèi)存的頁面總數(shù) unsigned long def flags struct vm area struct mmap 以雙向鏈表組成的 vma 模塊的首指針 struct vm area struct mmap avl 以 avl 樹結(jié)構(gòu)組成的虛擬空間的首指針 struct semaphore mmap sem 用戶進(jìn)程虛存管理的數(shù)據(jù)結(jié)構(gòu)如圖 5 所示 用戶共有 4GB 的虛存空間 實(shí)際可申請 的虛存空間為 0 3GB 3GB 4GB 的虛存空間在用戶進(jìn)程創(chuàng)建時(shí) 已由函數(shù) fork 將 kernel 的代碼段和數(shù)據(jù)段映射到 3GB 4GB 的虛存空間 因而所有進(jìn)程的 3GB 4GB 的虛存空間 的映象都是相同的 從而以這種方式使所有進(jìn)程共享 kernel 的代碼段和數(shù)據(jù)段 VMA 進(jìn)程的虛擬空間通常由一個(gè)個(gè) vma 塊組成 這些塊的結(jié)構(gòu)如下所示 struct vm area struct struct mm struct vm mm VM area parameters unsigned long vm start 該 vma 塊代表的使用虛擬空間的起始地址 unsigned long vm end 該 vma 塊代表的使用虛擬空間的結(jié)束地址 pgprot t vm page prot 保護(hù)位 unsigned short vm flags 標(biāo)志位 AVL tree of VM areas per task sorted by address short vm avl height avl 樹高度 struct vm area struct vm avl left vma 塊的左子節(jié)點(diǎn) struct vm area struct vm avl right vma 塊的右子節(jié)點(diǎn) linked list of VM areas per task sorted by address struct vm area struct vm next 在按地址大小排列的單向鏈表 上的下一個(gè)指針 for areas with inode the circular list inode i mmap for shm areas the circular list of attaches otherwise unused struct vm area struct vm next share struct vm area struct vm prev share more struct vm operations struct vm ops 對 VMA 塊進(jìn)行操作的函數(shù)集 unsigned long vm offset struct inode vm inode 該 VMA 塊對應(yīng)的文件 unsigned long vm pte shared mem 采用 avl 樹的優(yōu)點(diǎn)是可以快速找到相關(guān)地址所在的 vma 塊 同時(shí) 同一個(gè)任務(wù)的 vma 塊還按前后順序排成一個(gè)線性鏈表 6 我們的工作 我們的工作 針對上圖所示的用戶進(jìn)程虛存管理的數(shù)據(jù)結(jié)構(gòu) 圍繞它的建立 維護(hù) 使用和拆除 我們組作了相應(yīng)的工作 主要包括以下幾點(diǎn) 1 進(jìn)程的載入 創(chuàng)建及內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)和鏈結(jié)關(guān)系的建立 sys execve sys fork sys clone 2 頁表的建立與釋放 new page tables free page tables 3 虛擬內(nèi)存的申請與釋放 sys mmap sys munmap 4 缺頁中斷處理 do page fault 5 虛擬塊 VMA 的管理 sys remap sys mprotect 6 數(shù)據(jù)結(jié)構(gòu)及鏈結(jié)關(guān)系的拆除 sys exit 其中 虛擬內(nèi)存的申請與釋放由林濤和徐玫峰同學(xué)負(fù)責(zé) 虛擬塊 VMA 的管理由范昭 偉同學(xué)負(fù)責(zé) 相關(guān)的工作體現(xiàn)在他們的分析報(bào)告中 一一一 Process 的虛存管理數(shù)據(jù)的虛存管理數(shù)據(jù)結(jié)結(jié)構(gòu)的建立 構(gòu)的建立 維護(hù)維護(hù) 拆除 拆除 及相關(guān)系及相關(guān)系統(tǒng)調(diào)統(tǒng)調(diào)用流程用流程 1 進(jìn)程的載入 創(chuàng)建及內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)和鏈結(jié)關(guān)系的建立 進(jìn)程的載入 創(chuàng)建及內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)和鏈結(jié)關(guān)系的建立 sys execve 系統(tǒng)調(diào)用負(fù)責(zé)將可執(zhí)行文件映象載入到內(nèi)存 與內(nèi)存相關(guān)的操作主要是 通過調(diào)用 exit mmap 清除當(dāng)前進(jìn)程的所有的虛存塊 通過調(diào)用 clear page table 清除當(dāng)前進(jìn) 程的頁表項(xiàng) 通過調(diào)用 flush old signals 清除當(dāng)前進(jìn)程的殘留信號 通過調(diào)用 flush old files 清除當(dāng)前進(jìn)程的已打開文件 從而將當(dāng)前進(jìn)程掏空 成為一個(gè)空殼 然后系 統(tǒng)根據(jù) bprm 結(jié)構(gòu)更新 current 進(jìn)程的控制塊 并通過調(diào)用兩次 do mmap 分別將執(zhí)行文件的 代碼段和數(shù)據(jù)段映射到虛存 系統(tǒng)一般只將前兩頁載入物理內(nèi)存中 同時(shí)分配一頁給堆棧 其它的均留在硬盤中通過虛擬內(nèi)存映射機(jī)制映射為虛擬內(nèi)存 當(dāng)運(yùn)行中發(fā)生缺頁中斷時(shí) 系統(tǒng)處理缺頁中斷 將缺頁調(diào)入物理內(nèi)存中 如果發(fā)生物理內(nèi)存不足的情況 則由 kswapd 選擇合適的頁調(diào)入交換文件中或扔掉 如未發(fā)生寫操作 具體流程如下 asmlinkage int sys execve struct pt regs regs 為 do execve 的調(diào)用準(zhǔn)備參數(shù) do execve 初始化 bprm bprm 是 struct linux binprm 進(jìn)程控制塊中某些參數(shù)的暫存器 search binary handler 尋找二進(jìn)制文件的處理程序 handler 并用該 handler 一般是 load aout binary 程序處理該二進(jìn)制文件 load aout binary do load aout binary 異常情況判斷 flush old exec bprm exec mmap if necessary then copy on write exit mmap current mm 清除當(dāng)前進(jìn)程的所有的虛存塊 clear page table current 清除當(dāng)前進(jìn)程的頁表項(xiàng) flush tlb mm current mm flush thread flush old signals current sig 清除當(dāng)前進(jìn)程的殘留信號 flush old files current files 清除當(dāng)前進(jìn)程的已打開文件 到此為止 當(dāng)前進(jìn)程已被掏空 成為一個(gè)空殼 根據(jù) bprm 結(jié)構(gòu)更新 current 進(jìn)程的控制塊 do mmap 將執(zhí)行文件的代碼段映射到虛存 do mmap 將執(zhí)行文件的數(shù)據(jù)段映射到虛存 do load aout binary end for load aout binary end for search binary handler end for do execve end for sys execve 2 do fork 當(dāng)通過 sys fork 和 sys clone 系統(tǒng)調(diào)用來創(chuàng)建子進(jìn)程時(shí) 系統(tǒng)將通過 do fork 函數(shù)來完 成大部分的創(chuàng)建任務(wù) do fork 函數(shù)首先申請一頁的核心空間給進(jìn)程控制塊 再申請一頁的 核心空間給系統(tǒng)堆棧 再通過 copy mm 函數(shù)為子進(jìn)程復(fù)制父進(jìn)程的虛擬空間 如果是 sys clone 系統(tǒng)調(diào)用 則不用復(fù)制 子進(jìn)程的 mm 指針指向父進(jìn)程 mm struct 具體流程如 下 asmlinkage int sys fork struct pt regs regs return do fork SIGCHLD regs esp asmlinkage int sys clone struct pt regs regs unsigned long clone flags unsigned long newsp clone flags regs ebx newsp regs ecx if newsp newsp regs esp return do fork clone flags newsp do fork 申請一頁的核心空間給進(jìn)程控制塊 struct task struct p 申請一頁的核心空間給系統(tǒng)堆棧 P current 復(fù)制父進(jìn)程的進(jìn)程控制塊 作必要的修改 copy mm 如果是 clone 父子進(jìn)程的 mm 指針指向同一個(gè) mm struct mm struct count else 畫圖 struct mm struct mm 申請一頁核心空間 mm current mm 復(fù)制父進(jìn)程的相關(guān)信息 new page tables 建立新的頁目錄表 pgd 且復(fù)制 init 進(jìn)程的 768 1023 項(xiàng) dup mmap 復(fù)制父進(jìn)程的虛擬空間映射 for 對于父進(jìn)程中的每一個(gè) VMA 塊 復(fù)制該 VMA 塊 作相應(yīng)修改并重新鏈起來 copy page range mm current mm 該 VMA 塊 其工作機(jī)制是循環(huán)調(diào)用 copy pmd range 將 vma 塊中的所有 虛擬空間復(fù)制到對應(yīng)的虛擬空間中 在做復(fù)制之前 必須確保 新任務(wù)對應(yīng)的被復(fù)制的虛擬空間中必須都為零 end for dup mmap end for copy mm end for do fork 2 數(shù)據(jù)結(jié)構(gòu)及鏈結(jié)關(guān)系的拆除 數(shù)據(jù)結(jié)構(gòu)及鏈結(jié)關(guān)系的拆除 sys exit sys exit 系統(tǒng)調(diào)用 sys exit 來結(jié)束進(jìn)程 調(diào)用 exit mm 將所有虛擬內(nèi)存都結(jié)束掉 最后中止進(jìn) 程 asmlinkage int sys exit int error code do exit kerneld exit exit mm current if current mm count 無其他進(jìn)程共享該 mm struct exit mmap mm for 對于當(dāng)前進(jìn)程 current mm 中的每一個(gè) VMA 塊 調(diào)用 vm ops unmap 釋放該 VMA 塊對應(yīng)的虛擬空間 調(diào)用 zap page range 將指向釋放掉的虛擬空間中的 pte 頁表項(xiàng) 清零 調(diào)用 kfree 釋放該 VMA 塊結(jié)構(gòu)占用的物理空間 free page tables mm 將 mm pdg 中所有的 pte 頁表項(xiàng)清空 并將 mm pdg 清空 kfree mm current mm init mm end for exit mm current exit files current exit fs current exit sighand current end for do exit 3 缺頁中斷服務(wù) 缺頁中斷服務(wù) 當(dāng)程序在運(yùn)行中 訪問到的無效的虛擬地址的時(shí)候 系統(tǒng)將激發(fā)出缺頁中斷 激發(fā)缺頁中斷的情況通常有四種 1 C O W 型中斷 當(dāng)某個(gè)進(jìn)程進(jìn)行寫操作時(shí) 如果寫的頁是多進(jìn)程在使用 時(shí) 為了不影響其它進(jìn)程的正常運(yùn)行 通常需要將該頁復(fù)制一份 供執(zhí)行寫 操作的進(jìn)程單獨(dú)使用 2 被訪問的物理頁由于太長時(shí)間沒有訪問而被 kswapd 置換到 swap file 中 3 被訪問的物理頁由于是第一次訪問 所以還在磁盤上或由于訪問后被置換時(shí) 因?yàn)闆]有發(fā)生寫操作 而未寫到 swap file 中 4 當(dāng)進(jìn)程動(dòng)態(tài)的訪問一片存儲區(qū)域時(shí) 如在程序中動(dòng)態(tài)開辟的數(shù)組等 則該頁 不在 swap file 中 也不在磁盤上 缺頁中斷服務(wù)入口程序是函數(shù) do page fault do page fault 首先進(jìn)行各種錯(cuò)誤情況判斷 并作相應(yīng)處理 然后根據(jù) error code 來判斷缺頁中斷類型 第一種情況采用 do wp page 函數(shù)來處理 第二 三 四種情況由 do no page 函數(shù)來處理 下面將分別介紹這些函數(shù)的流程圖 void do wp page struct task struct tsk struct vm area struct vma unsigned long address int write access 為復(fù)制可寫頁申請一頁空間 根據(jù) address 計(jì)算 pgd pmd pte 退出 使用該物理頁的進(jìn)程 1 將該物理頁置 dirty 釋放原先分配的復(fù)制頁 將物理頁復(fù)制到復(fù)制頁上 將復(fù)制頁鏈入虛存中 將指向原先物理頁的 pte 釋放掉退出 異常 1 1 圖 7 do wp page 示意圖 void do no page struct task struct tsk struct vm area struct vma unsigned long address int write access 根據(jù) address 計(jì)算三級頁表中 pgd pmd pte 的值 如無對應(yīng)的項(xiàng) 分配空間將 其填上 if pte present entry 該頁已在內(nèi)存中 return 可能是共享該頁的其他進(jìn)程已將該頁讀入 else if pte none entry 情況 2 pte 中該項(xiàng)非空 說明該頁被 kswapd 置換到 swap file 中 調(diào)用 do swap page 讀入該頁 else if vma vm ops vma vm ops nopage 情況 4 該頁對應(yīng)的 VMA 塊沒有相應(yīng)的 nopage 操作 說明該 VMA 塊對應(yīng)的是 數(shù)據(jù)段內(nèi)容 調(diào)用 get free page 操作為該頁分配內(nèi)存 并將該頁賦值為 0 同時(shí)鏈入 該進(jìn)程的頁表中 else 情況 3 調(diào)用虛擬塊操作將磁盤中對應(yīng)文件讀入 page 中 將 pte 表中對應(yīng)的項(xiàng)指向該頁 將該頁 dirty 位置位 如果該頁有多進(jìn)程使用 且非共享 置寫保護(hù)位 一一一 主要函數(shù)分析主要函數(shù)分析 Memory c 在該文件中 Linux 提供了對虛擬內(nèi)存操作的若干函數(shù) 其中包括對虛擬頁的復(fù)制 新建頁表 清除頁表 處理缺頁中斷等等 1 static inline void copy page unsigned long from unsigned long to 為了節(jié)約內(nèi)存的使用 在系統(tǒng)中 各進(jìn)程通常采用共享內(nèi)存 即不同的進(jìn)程可以共享 同一段代碼段或數(shù)據(jù)段 當(dāng)某一進(jìn)程發(fā)生對共享的內(nèi)存發(fā)生寫操作時(shí) 為了不影響其它進(jìn) 程的正常運(yùn)行 系統(tǒng)將把該內(nèi)存塊復(fù)制一份 供需要寫操作的進(jìn)程使用 這就是所謂的 copy on write 機(jī)制 copy page 就是提供復(fù)制內(nèi)存功能的函數(shù) 它調(diào)用 C 語言中標(biāo)準(zhǔn)的內(nèi) 存操作函數(shù) 將首地址為 from 的一塊虛擬內(nèi)存頁復(fù)制到首地址為 to 的空間中 2 void clear page tables struct task struct tsk clear page table 的功能是將傳入的結(jié)構(gòu) tsk 中的 pgd 頁表中的所有項(xiàng)都清零 同時(shí)將 二級頁表所占的空間都釋放掉 傳入 clear page tables 的是當(dāng)前進(jìn)程的 tsk 結(jié)構(gòu) 取得該進(jìn) 程的一級頁目錄指針 pgd 后 采用循環(huán)的方式 調(diào)用 free one pgd 清除 pgd 表 表共 1024 項(xiàng) 在 free one pgd 中 實(shí)際執(zhí)行的功能只調(diào)用一次 free one pmd 在 80 x86 中 由于硬 件的限制 只有兩級地址映射 故將 pmd 與 pgd 合并在一起 在 free one pmd 中 函數(shù) 調(diào)用 pte free 將對應(yīng)于 pmd 的二級頁表所占的物理空間釋放掉 進(jìn)程代碼 數(shù)據(jù)所用的物 理內(nèi)存在 do munmap 釋放掉了 并將 pmd 賦值為零 clear page table 在系統(tǒng)啟動(dòng)一個(gè)可執(zhí)行文件的映象或載入一個(gè)動(dòng)態(tài)鏈接庫時(shí)被調(diào)用 在 fs exec c 中的 do load elf binary 或 do load aout binary 調(diào)用 flash old exec 后者調(diào) 用 exec mmap 而 exec mmap 調(diào)用 clear page table 其主要功能是當(dāng)啟動(dòng)一個(gè)新的應(yīng)用 程序的時(shí)候 將復(fù)制的 mm struct 中的頁表清除干凈 并釋放掉原有的所有二級頁表空間 3 void oom struct task struct task 返回出錯(cuò)信息 4 void free page tables struct mm struct mm 在 free page table 中 大部分的代碼與 clear page table 中的函數(shù)一致 所不同的是 該函數(shù)在最后調(diào)用了 pgd free page dir 即不光釋放掉二級頁表所占的空間 同時(shí)還釋放 一級頁目錄所占的空間 這是因?yàn)?free page tables 被 exit mm 調(diào)用 exit mm 又被 do exit kernel kernel c 調(diào)用 當(dāng)進(jìn)程中止 系統(tǒng)退出或系統(tǒng)重起時(shí)都需要用 do exit 屬于進(jìn)程管理 將所有的進(jìn)程結(jié)束掉 在結(jié)束進(jìn)程過程中 將調(diào)用 free page table 將進(jìn)程的空間全部釋放掉 當(dāng)然包括釋放進(jìn)程一級頁目錄所占的空間 5 int new page tables struct task struct tsk 該函數(shù)的主要功能是建立新的頁目錄表 它的主要流程如如下 1 調(diào)用 pgd alloc 為新的頁目錄表申請一片 4K 空間 2 將初始化進(jìn)程的內(nèi)存結(jié)構(gòu)中從 768 項(xiàng)開始到 1023 項(xiàng)的內(nèi)容復(fù)制給新的頁表 所 有的進(jìn)程都共用虛擬空間中 3G 4G 的內(nèi)存 即在核心態(tài)時(shí)可以訪問所有相同的 存儲空間 3 調(diào)用宏 SET PAGE DIR include asm pgtable h 將進(jìn)程控制塊 tsk ts CR3 的值 改為新的頁目錄表的首地址 同時(shí)將 CPU 中的 CR3 寄存器的值改為新的頁目錄 表的首地址 從而使新進(jìn)程進(jìn)入自己的運(yùn)行空間 4 將 tsk mm pgd 改為新的頁目錄表的首地址 new page tables 被 copy mm 調(diào)用 而 copy mm 被 copy mm do fork 調(diào)用 這兩個(gè)函 數(shù)都在 kernel fork c 中 同時(shí) new page tables 也可以在 exec mmap fs exec c 中調(diào)用 即新的進(jìn)程的產(chǎn)生可以通過兩種途徑 一種是 fork 在程序中動(dòng)態(tài)地生成新的進(jìn)程 這樣 新進(jìn)程的頁表原始信息利用 copy mm 從其父進(jìn)程中繼承而得 另一種是運(yùn)行一個(gè)可執(zhí)行 文件映象 通過文件系統(tǒng)中的 exec c 將映象復(fù)制到 tsk 結(jié)構(gòu)中 兩種方法都需要調(diào)用 new page tables 為新進(jìn)程分配頁目錄表 6 static inline void copy one pte pte t old pte pte t new pte int cow 將原 pte 頁表項(xiàng)復(fù)制到 new pte 上 其流程如下 1 檢測 old pte 是否在內(nèi)存中 如不在物理內(nèi)存中 調(diào)用 swap duplicate 按 old pte 在 swap file 中的入口地址 將 old pte 復(fù)制到內(nèi)存中 同時(shí)把 old pte 的入口地址 賦給 new pte 并返回 反之轉(zhuǎn)向 3 2 獲取 old pte 對應(yīng)的物理地址的頁號 3 根據(jù)頁號判斷 old pte 是否為系統(tǒng)保留的 如果為系統(tǒng)保留的 這些頁為所有的 進(jìn)程在核心態(tài)下使用 用戶進(jìn)程沒有寫的權(quán)利 則只需將 old pte 指針直接轉(zhuǎn)賦 給 new pte 后返回 反之則該 pte 屬于普通內(nèi)存的 則轉(zhuǎn)向 4 4 根據(jù)傳入的 C O W 標(biāo)志 為 old pte 置寫保護(hù)標(biāo)志 如果該頁是從 swap cache 中 得來的 將 old pte 頁置上 dirty 標(biāo)志 將 old pte 賦值給 new pte 5 將 mem map 結(jié)構(gòu)中關(guān)于物理內(nèi)存使用進(jìn)程的個(gè)數(shù)的數(shù)值 count 加 1 7 static inline int copy pte range pmd t dst pmd pmd t src pmd unsigned long address unsigned long size int cow 通過循環(huán)調(diào)用 copy one pte 將從源 src pmd 中以地址 address 開始的長度為 size 的空 間復(fù)制給 dst pmd 中 如 dst pmd 中還未分配地址為 address 的頁表項(xiàng) 則先給三級頁表 pte 表分配 4K 空間 每調(diào)用一次 copy one pte 復(fù)制 4K 空間 在一次 copy pte range 中最 多可復(fù)制 4M 空間 8 static inline int copy pmd range pgd t dst pgd pgd t src pgd unsigned long address unsigned long size int cow 通過循環(huán)調(diào)用 copy pte range 將從源 src pgd 中以地址 address 開始的長度為 size 的空 間復(fù)制給 dst pgd 中 如 dst pgd 中還未分配地址為 address 的頁表項(xiàng) 則在一級 同時(shí)也 是二級 頁表中給對應(yīng)的 pmd 分配目錄項(xiàng) 9 int copy page range struct mm struct dst struct mm struct src struct vm area struct vma 該函數(shù)的主要功能是將某個(gè)任務(wù)或進(jìn)程的 vma 塊復(fù)制給另一個(gè)任務(wù)或進(jìn)程 其工作機(jī) 制是循環(huán)調(diào)用 copy pmd range 將 vma 塊中的所有虛擬空間復(fù)制到對應(yīng)的虛擬空間中 在 做復(fù)制之前 必須確保新任務(wù)對應(yīng)的被復(fù)制的虛擬空間中必須都為零 copy page range 按 dup mmap copy mm do fork 的順序被調(diào)用 以上三個(gè)函數(shù)均在 kernel fork c 中 當(dāng)進(jìn)程被創(chuàng)建的時(shí)候 需要從父進(jìn)程處復(fù)制所有的虛擬空間 copy page range 完成的就是 這個(gè)任務(wù) copy page range 的函數(shù)調(diào)用關(guān)系見圖 8 copy page range copy pmd range copy pte range copy one pte dup mmap copy mm do fork kernel fork c 圖 8 copy page range 示意圖 9 static inline void free pte pte t page 虛存頁 page 如在內(nèi)存中 且不為系統(tǒng)的保留內(nèi)存 調(diào)用 free page 將其釋放掉 如在 系統(tǒng)保留區(qū)中 則為全系統(tǒng)共享 故不能刪除 如 page 在 swap file 中 調(diào)用 swap free 將其釋放 10 static inline void forget pte pte t page 如 page 不為空 調(diào)用 free pte 將其釋放 11 static inline void zap pte range pmd t pmd unsigned long address unsigned long size zap 為 zero all pages 的縮寫 該函數(shù)的作用是將在 pmd 中從虛擬地址 address 開始 長度為 size 的內(nèi)存塊通過循環(huán)調(diào)用 pte clear 將其頁表項(xiàng)清零 調(diào)用 free pte 將所含空間中 的物理內(nèi)存或交換空間中的虛存頁釋放掉 在釋放之前 必須檢查從 address 開始長度為 size 的內(nèi)存塊有無越過 PMD SIZE 溢出則可使指針逃出 0 1023 的區(qū)間 12 static inline void zap pmd range pgd t dir unsigned long address unsigned long size 函數(shù)結(jié)構(gòu)與 zap pte range 類似 通過調(diào)用 zap pte range 完成對所有落在 address 到 address size 區(qū)間中的所有 pte 的清零工作 zap pmd range 至多清除 4M 空間的物理內(nèi)存 13 int zap page range struct mm struct mm unsigned long address unsigned long size 函數(shù)結(jié)構(gòu)與前兩個(gè)函數(shù)類似 將任務(wù)從 address 開始到 address size 長度內(nèi)的所有對應(yīng) 的 pmd 都清零 zap page range 的調(diào)用關(guān)系與被調(diào)用的關(guān)系如圖 9 可知 zap page range 的主要功能是在進(jìn)行內(nèi)存收縮 釋放內(nèi)存 退出虛存映射或移動(dòng)頁表的過程中 將不在使 用的物理內(nèi)存從進(jìn)程的三級頁表中清除 在討論 clear page tables 時(shí) 就提到過當(dāng)進(jìn)程退 出時(shí) 釋放頁表之前 先保證將頁表對應(yīng)項(xiàng)清零 保證在處于退出狀態(tài)時(shí) 進(jìn)程不占用 0 3G 的空間 zap page rangevm truncate do munmap exit mmap move page tables zap pmd range zap pte range free page 圖 9 zap page range 調(diào)用關(guān)系示意圖 14 static inline void zeromap pte range pte t pte unsigned long address unsigned long size pte t zero pte 15 static inline int zeromap pmd range pmd t pmd unsigned long address unsigned long size pte t zero pte 16 int zeromap page range unsigned long address unsigned long size pgprot t prot 這三個(gè)函數(shù)與前面的三個(gè)函數(shù)從結(jié)構(gòu)上看很相似 他們的功能是將虛擬空間中從地址 address 開始 長度為 size 的內(nèi)存塊所對應(yīng)的物理內(nèi)存都釋放掉 同時(shí)將指向這些區(qū)域的 pte 都指向系統(tǒng)中專門開出的長度為 4K 全為 0 的物理頁 zeromap page range 在 kernel 代碼中沒有被引用 這個(gè)函數(shù)是舊版本的 Linux 遺留下來的 在新版本中已經(jīng)被 zap page range 所替代 17 static inline void remap pte range pte t pte unsigned long address unsigned long size unsigned long offset pgprot t prot 18 static inline int remap pmd range pmd t pmd unsigned long address unsigned long size unsigned long offset pgprot t prot 19 int remap page range unsigned long from unsigned long offset unsigned long size pgprot t prot 這三個(gè)函數(shù)也同前面的函數(shù)一樣 層層調(diào)用 現(xiàn)僅介紹一下最后一個(gè)函數(shù)的作用 remap page range 的功能是將原先被映射到虛擬內(nèi)存地址 from 處的 大小為 size 的虛擬內(nèi) 存塊映射到以偏移量 offset 為起始地址的虛擬內(nèi)存中 同時(shí)將原來的 pte pmd 項(xiàng)都清零 該函數(shù)也是逐級調(diào)用 在 remap pte range 中 通過 set pte 將的物理頁映射到新的虛擬內(nèi) 存頁表項(xiàng) pte 上 remap page range 函數(shù)的功能與下文中的 remap c 中介紹的功能相近 因 此在 kernel 中也沒有用到 20 unsigned long put dirty page struct task struct tsk unsigned long page unsigned long address 將虛擬內(nèi)存頁 page 鏈接到任務(wù) tsk 中虛擬地址為 address 的虛擬內(nèi)存中 其主要調(diào)用 的流程如下 put dirty page setup arg page do load xxx binary xxx 為 aout 或 elf 這些 函數(shù)都在 fs exec c 中 它的功能是將在載入可執(zhí)行文件的時(shí)候 將其相關(guān)的堆棧信息 環(huán) 境變量等復(fù)制到當(dāng)前進(jìn)程的空間上 21 void handle mm fault struct vm area struct vma unsigned long address int write access 用于處理 ALPHA 機(jī)中的缺頁中斷 mmap c 在 mmap c 中 主要提供了對進(jìn)程內(nèi)存管理進(jìn)行支持的函數(shù) 主要包括了 do mmap do munmap 等對進(jìn)程的虛擬塊堆 avl 數(shù)進(jìn)行管理的函數(shù) 圖 10 mmap c 中函數(shù)調(diào)用圖 有關(guān)有關(guān) avl 樹的一些操作 樹的一些操作 1 static inline void avl neighbours struct vm area struct node struct vm area struct tree struct vm area struct to the left struct vm area struct to the right 尋找 avl 樹 tree 中的節(jié)點(diǎn) node 的前序節(jié)點(diǎn)和后序節(jié)點(diǎn) 將結(jié)果放在指針 to the left 和 to the right 中 即使得 to the left next node node next to the right 在實(shí)際搜索中 過程是找到 node 節(jié)點(diǎn)中的左節(jié)點(diǎn)的最右節(jié)點(diǎn)和右節(jié)點(diǎn)的最左節(jié)點(diǎn) 采用 avl 樹搜索可以提 高效率 2 static inline void avl rebalance struct vm area struct nodeplaces ptr int count 將由于插入操作或刪除操作而造成不平衡的 avl 樹恢復(fù)成平衡狀態(tài) nodeplaces ptr 是 指向的是需要調(diào)整的子樹的根節(jié)點(diǎn) count 是該子樹的高度 3 static inline void avl insert struct vm area struct new node struct vm area struct ptree 將新節(jié)點(diǎn) new node 插入 avl 樹 ptree 中 并將該樹重新生成平衡 avl 樹 在創(chuàng)建 avl 樹 時(shí) 將 vma 模塊不斷的插入 avl 樹中 構(gòu)建一個(gè)大的 avl 樹 當(dāng)進(jìn)程創(chuàng)建時(shí) 復(fù)制父進(jìn)程 后需要將以雙向鏈表拷貝過來的 vma 鏈生成 avl 樹 4 static inline void avl insert neighbours struct vm area struct new node struct vm area struct ptree struct vm area struct to the left struct vm area struct to the right 將新節(jié)點(diǎn) new node 插入 avl 樹 ptree 中 并將該樹重新生成平衡 avl 樹 同時(shí)返回該 新節(jié)點(diǎn)的前序節(jié)點(diǎn)和后序節(jié)點(diǎn) avl rebalance avl insertavl insert neighbouravl neighbouravl remove build mmap avl dup mmap copy mm forkdo munmap merge segments unmap fixup insert vm struct do mmap 5 static inline void avl remove struct vm area struct node to delete struct vm area struct ptree 將指定要

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論