讀核日記(七)
--linux的記憶體管理機制(1)
記憶體管理是乙個作業系統必不可少.並且.非常重要的一環.linux的成功.和它優秀的記憶體管理聯絡非常密切.因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制.我項很多人吃過dos下640k 的苦吧.
前面我們介紹了386保護模式.從今天起我們將在此基礎上,分析linux的虛擬儲存管理,對每個程式設計師來說.他們都希望有無窮大的快速的記憶體,然而,現階段是不可能的,況且,無窮大與快速本身就可能矛盾
為了解決無窮大.linux 引入了虛擬儲存系統,為了解決快速,linux 引入了cache ,交換機制等等,以使的儲存系統,在容量上接近硬碟,速度上接近cache.(當然,我認為這是儲存系統的實際目的).
linux 的記憶體管理採取的是分頁機制.它的設計目的是時分復用.linux 可同時處理256個任務(這應該與某個變數來定義,一時想不起來).同時它採用了兩級飽和機制來分別核心程序與使用者程序.
相反,使用者程序,在使用者空間的定址是通過所使用者頁目錄中的指標得到使用者的頁表.並通過頁表的指標直接指向相應的物理記憶體.
linux虛擬記憶體的實現,需要幾種不同的機制來實現:
位址對映機制
記憶體的分配與**
請頁機制
交換機制
記憶體共享機制
在具體的讀原始碼之前.我們先根據我們以前學過的作業系統知識.和c語言等知識.來考慮一下,這幾個機制如何實現.現自己設計一下.在看別人是怎樣實現的.找到自己想不到.或者對效率空間有損的地方.這樣才有進步.我不止一次的說.作業系統的某一部分,就起實現來說,非常簡單.它的難點是如何將大量的功能整合出乙個kernerl.
位址對映機制,說白了,就是在虛擬記憶體與物理記憶體上的乙個橋梁.它要做的事情可能就是通過幾個不同的表.把虛擬位址轉換成實體地址,把實體地址轉化虛擬位址.
我們以前說過.因為有系統與使用者之分,它必須也要有不同的資料結構.為了解決速度等問題.它會有乙個硬體的緩衝區
對於它的資料結構.我們可以先想一下.如虛擬位址的資訊,虛擬位址在那個區域等等
至於請頁機制,更好理解.因為linux是頁式儲存的.因此必然會存在空白頁和使用頁.既然是頁.就必然會存在頁溢位.頁無效(是不是在win98 下經常出現類似錯誤,當然linux的記憶體管理不可能和windows一樣,可基本道理相同).因此.在每乙個頁出錯.或者該頁存不下多餘的資料時.就要要求核心分配新的頁面
同時.當時用fork() 產生乙個新的程序時.也需要分配新的葉面.這一部分大概講的就是程序如何向內和描述自己需要怎麼樣的和多少頁
在我們學習《資料結構》是我們學了,很多記憶體分配方式,如首次擬和.最佳擬和,最差擬和等等.但是我們可以想象.linux 大概不會用他們.那就一定是夥伴系統了.因此我們可以對於夥伴系統的分配,**的基本演算法.回想一下.這樣在讀者一部分原始碼時,回有意象不到的收穫.
至於交換機制.我們也可以現想一想.記憶體中總與很多使用者的頁.如果這些也已經把所有的頁都用完了.再分配時必須把其中的某些頁釋放.釋放那些頁,需要考慮.如最近不用頁.近期少用頁,等等都可以在考慮之中.
這個演算法,大概就是計算記憶體中使用的頁,什麼時候可以換處.說白了就是為所有的使用頁計算乙個」權」,而這個」權」就決定了他什麼時候被釋放以換如它的內容.需要想的是對於經常使用的頁.可以把它放入cahe.(儘管這一部分對程式設計師是透明的,但我們應該理解他的原理).
最後的一部分共享記憶體,我想和我門初學linux程式設計時,程序通訊裡面的共享記憶體沒有區別.大概也就是在它的資料結構中加入可以允許不同程序訪問的tag 就行了.
以上,只是我們對linux的記憶體管理機制的猜測,需要我們做的工作就是具體的讀原始碼.更正不正確的猜想.同時學習別人的實際思路.
從下篇日記開始.我們將分別講解這幾部分的實現
讀核日記 三
讀核日記 三 在linux 中每乙個程序都由 task struct 資料結構來定義 task struct 就是我們通常所說的 pcb.她是對程序控制的唯一手段也是最有效的手段.當我們呼叫 fork 時,系統會為我們產生乙個 task struct結構.然後從父程序 那裡繼承一些資料 並把新的程序...
讀核日記 五
讀核日記 五 進來忙得不得了,這時才體會出工作和在學校真的不同.有時候自己想做的事,很難如願.不過我這一段時間沒有太偷懶.對於linux 的386 保護模式,記憶體管理,作了乙個初步的學習.當初學習作業系統課時老覺得理論沒用.如今,真的時間了,才知道理論知識是多麼的缺乏.也許是書到用時方恨少 閒話少...
讀核日記 《Linux核心完全注釋》
linux核心完全注釋 v1.9.5版說明 linux 核心 6.程序間通訊機制 linux 核心 4.記憶體管理 linux 核心 5.linux程序 linux 核心 3.軟體基礎 linux 核心 2.硬體基礎 linux 核心 1.前言 讀核日記 八 linux的記憶體管理機制 2 讀核日記...