笨叔叔借我點記憶體用用唄

2021-08-01 16:25:29 字數 1209 閱讀 9389

笨叔叔,可以借我點物理記憶體用用嗎?用完了就還給你。

不行,你是壞程序,你在偷笨叔叔的記憶體,我要kill了你~~

有不少同學接觸linux的記憶體管理是從malloc()這個c語言庫函式開始的。從那時候開始就知道了有虛擬記憶體這個概念,那虛擬記憶體究竟是個什麼東西呢?怎麼虛擬法呢?只關注上層應用程式編寫的同學對於這些東西可能不是太關心。可是如果不了解一些這方面的知識,也很難設計出高效的應用程式。很早期的作業系統是沒有虛擬記憶體這個概念的,為什麼現代作業系統都有虛擬記憶體這個概念了,包括windows或者linux。要搞明白虛擬記憶體是怎麼回事,你可能需要了解什麼是mmu、什麼是頁表、什麼是物理記憶體、什麼是物理頁面、什麼是建立對映關係、什麼叫按需分配、什麼是缺頁中斷以及什麼是寫時複製。

當了解什麼是mmu時,除了了解mmu工作原理外,還會接觸到linux核心是如何建立頁表對映的,這當中也包括使用者空間頁表的建立和核心空間頁表的建立。還包括核心是如何查詢頁表以及修改頁表的。

當了解什麼是物理記憶體和物理頁面時,會接觸到struct pg_data_t、struct zone以及struct page資料結構,這三個資料結構描述了系統中物理記憶體的組織架構。struct page資料結構除了描述乙個4kb(或者其它大小)大小的物理頁面外,還包含了很多複雜而有趣的成員。

當了解怎麼分配物理頁面時,會接觸到夥伴系統機制以及頁面分配器(page allocator),頁面分配器是記憶體管理中最複雜的**之一。

物理記憶體有了,那怎麼和虛擬記憶體建立對映關係呢?在linux核心中描述程序的虛擬記憶體用struct vm_area_struct資料結構。虛擬記憶體和物理記憶體建立對映關係採用建立頁表的方法來完成。為什麼和程序位址空間建立對映的頁面有的叫匿名頁面而有的叫page cache頁面呢?

當了解malloc()怎麼分配出物理記憶體時,會接觸到缺頁中斷。缺頁中斷也是記憶體管理中最複雜的**之一。

這時,虛擬記憶體和物理記憶體已經建立了對映關係了,這是基於頁為基礎的,可是有時候核心需要小於乙個頁面大小的記憶體,那slab機制誕生了。

上面已經勾畫出虛擬記憶體和物理記憶體的基本框圖了,但是如果使用者程序持續分配和使用記憶體,這時物理記憶體不足了怎麼辦?頁面**機制和反向對映機制孕育而生了。

虛擬記憶體和物理記憶體的對映關係經常是建立了又被解除了,時間長了系統物理頁面布局變得凌亂不堪,碎片化嚴重,這時候核心如果需要分配大塊連續記憶體變得越來越困難了,那記憶體規整機制(memory compaction)就誕生了。

上述是一位笨叔叔學習linux核心記憶體管理知識痛並快樂的心路歷程。詳情

跟著笨叔叔做實驗

跟著笨叔 本章主要是介紹一些核心除錯的工具和技巧。對於初學者來說,單步除錯linux核心應該是比較酷的一件事情,特別是有類似virtual c 的圖形化除錯環境。另外還要介紹核心開發者常用的除錯工具,比如ftrace和systemtap等,它們都是核心開發者的最愛。對於編寫核心 和驅動的讀者來說,記...

記憶體管理注意點

記憶體管理問題總結 共54個問題 以問題驅動學習的好處 1.學習效率極其的高 2.能夠清楚的知道,自己那裡會了,那裡不會.時間 3.課後寫 練習時目的性很強 4.擅長總結,在面試的時候能夠體現的淋漓盡致,使你面試非常容易 5.方便日後複習 6.只要你能夠把每天的問題都能夠通過自己的總結清晰的搞明白,...

C記憶體分配的注意點

c語言的記憶體分配,有很多的注意點。1.int 的大小問題。int 在不同的編譯器下大小是不一樣的。在tc下是2位,在 vc 下,和 long 一樣,是4位。2.memset 不是用來分配記憶體的,而是設定某個區域的記憶體為某個值,這個記憶體區域必須是可以修改的,而且是已經分配好了的。這個函式的原型...