資源描述:
《Linux內(nèi)存管理》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、內(nèi)存管理,不用多說,言簡意賅。在內(nèi)核里分配內(nèi)存還真不是件容易的事情,根本上是因為內(nèi)核不能想用戶空間那樣奢侈的使用內(nèi)存。?????先來說說內(nèi)存管理。內(nèi)核把物理頁作為內(nèi)存管理的基本單位。盡管處理器的最小可尋址單位通常是字,但是,內(nèi)存管理單元MMU通常以頁為單位進行處理。因此,從虛擬內(nèi)存的交代來看,頁就是最小單位。內(nèi)核用struct?page(linux/mm.h)結(jié)構(gòu)表示系統(tǒng)中的每個物理頁:?1234567891011121314Structpage{????????unsignedlongflags;???????????????????
2、???????????????????????????????????????????atomic_tcount;????????????????????????unsignedintmapcount;??????????????????unsignedlongprivate;??????????????????structaddress_space*mapping;??????????pgoff_tindex;??????????????????????????structlist_headlru;??????union{??????
3、?structpte_chain;???????pte_addr_t;????}?????????????????void*virtual;??????????????????};?????flag用來存放頁的狀態(tài),每一位代表一種狀態(tài),所以至少可以同時表示出32中不同的狀態(tài),這些狀態(tài)定義在linux/page-flags.h中。count記錄了該頁被引用了多少次。mapping指向與該頁相關(guān)的address_space對象。virtual是頁的虛擬地址,它就是頁在虛擬內(nèi)存中的地址。要理解的一點是page結(jié)構(gòu)與物理頁相關(guān),而并非與虛擬頁相
4、關(guān)。因此,該結(jié)構(gòu)對頁的描述是短暫的。內(nèi)核僅僅用這個結(jié)構(gòu)來描述當(dāng)前時刻在相關(guān)的物理頁中存放的東西。這種數(shù)據(jù)結(jié)構(gòu)的目的在于描述物理內(nèi)存本身,而不是描述包含在其中的數(shù)據(jù)。?????在linux中,內(nèi)核也不是對所有的也都一視同仁,內(nèi)核而是把頁分為不同的區(qū),使用區(qū)來對具有相似特性的頁進行分組。Linux必須處理如下兩種硬件存在缺陷而引起的內(nèi)存尋址問題:1.一些硬件只能用某些特定的內(nèi)存地址來執(zhí)行DMA2.一些體系結(jié)構(gòu)其內(nèi)存的物理尋址范圍比虛擬尋址范圍大的多。這樣,就有一些內(nèi)存不能永久地映射在內(nèi)核空間上。為了解決這些制約條件,Linux使用了三種區(qū):
5、1.ZONE_DMA:這個區(qū)包含的頁用來執(zhí)行DMA操作。2.ZONE_NOMAL:這個區(qū)包含的都是能正常映射的頁。3.ZONE_HIGHEM:這個區(qū)包"高端內(nèi)存",其中的頁能不永久地映射到內(nèi)核地址空間。?????區(qū)的實際使用與體系結(jié)構(gòu)是相關(guān)的。linux把系統(tǒng)的頁劃分區(qū),形成不同的內(nèi)存池,這樣就可以根據(jù)用途進行分配了。需要說明的是,區(qū)的劃分沒有任何物理意義,只不過是內(nèi)核為了管理頁而采取的一種邏輯上的分組。盡管某些分配可能需要從特定的區(qū)中獲得頁,但這并不是說,某種用途的內(nèi)存一定要從對應(yīng)的區(qū)來獲取,如果這種可供分配的資源不夠用了,內(nèi)核就會占
6、用其他可用去的內(nèi)存。下表給出每個區(qū)及其在X86上所占的列表:?????????每個區(qū)都用定義在linux/mmzone.h中的structzone表示,如下:?1234567891011121314structzone{????????spinlock_t?????????????lock;????????unsignedlong??????????free_pages;????????unsignedlong??????????pages_min,pages_low,pages_high;????????unsignedlong???
7、???????protection[MAX_NR_ZONES];????????spinlock_t?????????????lru_lock;???????????????structlist_head???????active_list;????????structlist_head???????inactive_list;????????unsignedlong??????????nr_scan_active;????????unsignedlong??????????nr_scan_inactive;????????unsign
8、edlong??????????nr_active;????????unsignedlong??????????nr_inactive;????????int????????????????????all_