linux內核源代碼學習(4)關於一些數據結構和用戶內存的管理

《linux內核代碼情景分析》的內存管理數據結構映射圖linux內核源代碼學習(4)關於一些數據結構和用戶內存的管理

---flyli

      這兩天工作忙啊,1.8k的基本工資,每天爲了多賺績效獎,老是加班,加班沒有加班費,只能按幹活的多少來算績效領績效獎,不過還算好了,至少不算是白加班吧。。。。

      看到我把工資曬出來,大家可能可以發現,原來我是個如此墮落的程序員。。。說實話,我也不想只拿這麼一點,感覺還沒在大學學校裏當學生的時候拿的錢多。。。

       不過我還是相信很多過來人的話,“等你到了一定層次的時候,你會發現,剛走上社會拿的那些錢根本不值得一提。”,呵呵,找個理由偏偏自己吧

       好了!現在進入正題!

      前幾篇文章主要介紹了在閱讀MMU內存映射的時候遇到的一些不好理解的問題,現在就開始講我們用戶使用的內存是如何管理的了,和MMU映射的物理內存又有什麼關係呢?

      用戶程序中使用的內存被稱之爲“虛存”,因爲他並不是實實在在的直接指向物理內存的,中間還要經歷一道轉換,還有就是要更利於管理。

      我們的“虛存”是如何管理的?它和MMU映射的內存,和物理內存的地址有什麼區別呢?下面開始介紹。。

        我所說的用戶空間的內存管理,其實就是給予一個進程的用戶,每個進程都有一個自己的mm_struct結構,用於管理內存,其和內存有關的成員主要有2個,一個是這次提到的“虛存”(vm_area_struct)的鏈表,另外一個就是實際的內存映射地址(pgd_t)的數組,

       每一個vm_area_struct結構用於管理一個段連續的物理內存,當然不只是連續,而且其訪問權限也必須是相同的哈,當有多個段的時候,此結構的鏈表就會進行擴展,其基本成員有,地址的起始位置與終止位置,以及下一個vm_area_struct結構體的指針,不過千萬不要一位這些位置使用物理內存來表示的哦~~~~~其使用的是“虛存”,關於“虛存”和“pgd”的關係馬上就會講到

       一個mm_struct成員中除了有個虛存管理的結構外,還有就是一個pgd_t頁面目錄的數組了,這個數組是幹什麼的呢?他記錄了該進程中所有的物理頁面映射表。

      關於我們一般使用的malloc的具體過程我還沒看到書上寫的那部分,但是關於當堆棧區不夠使用時,linux如何對其進行擴展我基本還是讀懂了的。

      一個程序的用戶區間劃分如下圖所示

linux程序空間定義示意圖

      當堆棧的使用超出我們所規劃的區間後,linux會判斷這個超出的區間是正常的堆棧區需要擴展呢,還是訪問出錯,判斷方法就是x86cpu指令中最長的也就是壓棧32個字節,也就是說假如我們訪問的棧是再距離以前的劃分區間32以內就判斷是合法的。

       之後呢,既然說他是合法的,linux就要給這些內存辦“戶口”啊~如何辦呢?

       首先,由於在用戶區,堆棧本來就是連續的(“虛存連續”),所以呢,我們不需要單獨開闢一個vm_area_struct結構,直接對以前的堆棧結構進行修改就好了,如何修改呢?簡單,肯定是改其起始位置了~~~當然之所以修改的是其實位置,其原因是因爲堆棧的分配是自高向低擴展的,另外再修改寫別的什麼vm_area_struct區間的總頁面數啊,之類的了,至此,“虛擬地址”的分配基本就完了~這就完了?其實中間省略了很多哈,不過都是無關的小東西,不必刻意研究了吧~

      虛擬內存的建立到時完了,可是我的映射物理頁面怎麼辦呢?恩,這個就要和內存映射開始說起了,內存映射中,由於pgd是映射頁面是初始化的時候就全部搞好的所以linux只需要用一個pgd_offset函數就可以找到,而pmd就不一定了,因爲映射頁面可能還沒有建立,於是我們就需要用pmd_alloc函數開闢一個,這個函數和malloc很想吧~雖然實現方法千差萬別,不過功能似乎很是相似啊,找到了pmd後,再用pte_alloc找到pte的結構就好了,至此一步一步的pgd,pmd,pte全部湊齊了,映射也就建立了。

      然而,映射的頁面是4k的,而vm_area_struct是不一定多少位的連續區域,這個我們如何去把這兩個聯繫起來呢,其實這個並不難,我們知道vm_area_struct中可以包含很多個連續的內存頁面(“虛存層次上”),然而vm_area_struct鏈表中每個的開始位置和結束位置都是相連的,換言之就是連續的,這樣就使得“虛存”的物理頁面對應着連續的偏移量,通過這個偏移量做引索,或者說是數組下標,就可以再mm_struct結構中的pgd成員中找到對應的物理頁面。

      哈哈,這幾個概念終於被我理通了,不過假如有不對的地方,希望各位大俠千萬不要吝惜筆墨,多多指正哈,在下感激不盡!!!!!!!!!!!

      最後送上《linux內核代碼情景分析》的內存管理數據結構映射圖哈

 

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章