資源描述:
《linux內(nèi)核源碼學習》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、Linux內(nèi)核源碼學習--淺談內(nèi)存管理郭帆學習步驟?理論調(diào)研?Linux內(nèi)核的整體結構?每個子系統(tǒng)的功能及子系統(tǒng)之間的聯(lián)系?子系統(tǒng)的組成模塊及對應的詳細功能和基本原理?源碼閱讀(針對特定子系統(tǒng))?模塊分解(找到相應的源文件)?熟悉主要數(shù)據(jù)結構?閱讀源碼第一階段:理論調(diào)研?目標?熟悉Linux內(nèi)核的整體架構?熟悉各個子系統(tǒng)的功能及相互之間的聯(lián)系?熟悉子系統(tǒng)內(nèi)部的模塊組成及功能?方法?閱讀經(jīng)典書籍:《Linux內(nèi)核設計與實現(xiàn)》、《深入理解Linux內(nèi)核》等?博客、論壇等.1.1Linux內(nèi)核架構?Linux內(nèi)核特點:模塊化、分層、耦合度高1.2Linux內(nèi)存管理--機制?Linux采
2、用頁式內(nèi)存管理?應用給出的地址是虛擬地址,需要通過查詢頁表轉(zhuǎn)換成物理內(nèi)存地址1.2內(nèi)存管理子系統(tǒng)--功能?功能:提供對虛擬內(nèi)存空間和物理內(nèi)存的管理0GB3GB4GBKernel虛擬內(nèi)存VirtualAddressSpaceUserSpace(Stack,Heap...)Space管理LinearMappedPageMapped物理內(nèi)存PhysicalMemory管理0GB1GB4GB1.2內(nèi)存管理子系統(tǒng)--架構1.3內(nèi)存管理子系統(tǒng)--子模塊?物理內(nèi)存管理?物理內(nèi)存頁分配、回收、遷移、交換?虛擬內(nèi)存管理?虛擬內(nèi)存分配、內(nèi)存映射、頁表管理、虛擬空間管理?頁緩存管理?頁緩存的分配、管理
3、、預取、訪問?異常管理?內(nèi)存相關的異常管理機制1.3子模塊分析--分配與映射?C語言中的malloc在內(nèi)核中包含兩步?分配虛擬地址區(qū)間?訪問虛擬地址時分配物理頁,建立頁表映射?malloc(<128KB)操作的執(zhí)行流程?用戶態(tài)?應用調(diào)用malloc申請內(nèi)存->malloc從空閑堆空間緩沖區(qū)鏈表申請內(nèi)存,若有內(nèi)存則返回,若不足則調(diào)用sys_brk()擴充進程的堆空間?內(nèi)核態(tài)1.在mm_struct中的堆上界brk延伸到newbrk:即申請一塊vma,vma.start=brkvma.end=newbrk2.當進程訪問其中某個虛擬地址,觸發(fā)缺頁中斷再申請物理頁并進行映射第二階段:源碼
4、閱讀?目標?熟悉每個源文件的功能?熟悉主要數(shù)據(jù)結構?詳細分析特定模塊的源碼?方法:?從點切入,追蹤調(diào)用路徑?用調(diào)試手段分析源碼(printk、kgdb、dump_stack)?仔細閱讀注釋,參考源碼解讀2.1源文件分類?物理內(nèi)存管理?內(nèi)存分配?page_alloc:伙伴分配系統(tǒng)?debug-pagealloc:伙伴分配系統(tǒng)輔助函數(shù)?slab、slub、slob:基于伙伴系統(tǒng)之上的內(nèi)存分配算法?huge_memory、hugetlb:大頁模式的支持(分配)?slob:用于嵌入式的簡單內(nèi)存分配器?slab_common:slab和slub共用的功能函數(shù)?bootmem:啟動期間的內(nèi)存
5、分配器?memblock:初始化期間物理內(nèi)存塊的管理,是對bootmem的改進替代?mmzone:managementcodesforpgdats,zonesandpageflags?mempool:內(nèi)存池,內(nèi)存資源極度緊張情況下使用,可保證無死鎖、內(nèi)存分配不會失敗?...2.1源文件分類?物理內(nèi)存管理?內(nèi)存回收與遷移?vmscan:內(nèi)存回收算法?compaction:內(nèi)存碎片整理(調(diào)用migrate)?migrate:MemoryMigrationfunctionality?內(nèi)存交換?swapfile:內(nèi)存頁交換到硬盤空間?swap:對物理頁換入換出的支持函數(shù)2.1源文件分類?
6、虛擬內(nèi)存管理?頁表(映射)建立與管理?memory:頁表映射管理(MMU)?huge_memory、hugetlb:大頁模式的支持(映射)?rmap:physicaltovirtualreversemappings?mmap:虛擬空間內(nèi)存管理(structmm_struct/structvm_area_struct)?mempolicy:內(nèi)存映射策略?vmalloc:虛擬內(nèi)存分配?bounce:高端內(nèi)存的臨時映射訪問機制?highmem:Highmemoryhandlingcommoncodeandvariables?pagewalk:頁表遍歷函數(shù)?pgtable-generic
7、:頁表幫助函數(shù)?mmu_context:任務的內(nèi)存地址空間切換?init-mm:初始化進程的內(nèi)存地址空間2.2主要數(shù)據(jù)結構分析?與物理內(nèi)存管理相關的數(shù)據(jù)結構?內(nèi)存節(jié)點描述符:structpglist_data?記錄每個內(nèi)存(CPU)節(jié)點的內(nèi)存情況,例如包含幾個內(nèi)存區(qū)域(zone),以及node內(nèi)的頁框數(shù)?內(nèi)存區(qū)域描述符:structzone?記錄單個內(nèi)存節(jié)點內(nèi)部不同用途的內(nèi)存區(qū)域,例如ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM?頁描述符:structpag