linux内核之内存管理.doc,linux内核之内存管理.doc
Linux內核之內存管理
作者:harvey wang
郵箱:harvey.perfect@
新浪博客地址:/harveyperfect ,有關于減肥和學習英語相關的博文,歡迎交流
把linux內存管理分為下面四個層面
(一)硬件輔助的虛實地址轉換
(二)內核管理的內存相關
(三)單個進程的內存管理
(四)malloc軟件
處理器硬件輔助的虛實地址轉換(以x86為例)
在x86中虛實地址轉換分為段式轉換和頁轉換。段轉換過程是由邏輯地址(或稱為虛擬地址)轉換為線性地址;頁轉換過程則是將線性地址轉換為物理地址。段轉換示意圖如下
X86支持兩種段,gdt和ldt(全局描述段表和局部描述符段表),在linux中只使用了4個全局描述符表,內核空間和用戶空間分別兩個gdt,分別對應各自的代碼段和數據段。也可以認為在linux中變相地disable了x86的段式轉換功能。
頁轉換示意圖如下
在linux中x86 的cr3寄存器(頁表基地址寄存器)保存在進程的上下文中,在進程切換時會保存或回復該寄存器的內容,這樣每個進程都有自己的轉換頁表,從而保證了每個進程有自己的虛擬空間。
內核管理的內存相關
從幾個概念展開內存管理:node、zone、buddy、slab
1、Node
SGI Altix3000系統的兩個結點
如上圖,NUMA系統的結點通常是由一組CPU(如,SGI Altix 3000是2個Itanium2 CPU)和本地內存組成。由于每個結點都有自己的本地內存,因此全系統的內存在物理上是分布的,每個結點訪問本地內存和訪問其它結點的遠地內存的延遲是不同的,為了優化對NUMA 系統的支持,引進了Node 來將NUMA 物理內存進行劃分為不同的Node。而操作系統也必須能感知硬件的拓撲結構,優化系統的訪存。
但是Intel x86 系統不是NUMA 系統。為了保持代碼的一致性,在x86 平臺上,Linux 將所有物理內存都劃分到同一個Node。事實上,對于非NUMA 體系結構,也是如此處理的。
Linux系統用定義了數組pg_data_t node_data[MAX_NUMNODES] 來管理各個node。
2、Zone
Linux中Node、Zone和頁的關系
每個結點的內存被分為多個塊,稱為zones,它表示內存中一段區域。一個zone用struct zone結構描述,zone的類型主要有ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_DMA位于低端的內存空間,用于某些舊的ISA設備。ZONE_NORMAL的內存直接映射到Linux內核線性地址空間的高端部分,ZONE_HIGHMEM位于物理地址高于896MB的區域。例如,在X86中,zone的物理地址如下:
內核空間只有1GB線性地址,如果使用大于1GB的物理內存就沒法直接映射到內核線性空間了。當系統中的內存大于896MB時,把內核線性空間分為兩部分,內核中低于896MB線性地址空間直接映射到低896MB的物理地址空間;高于896MB的128MB內核線性空間用于動態映射ZONE_HIGHMEM內存區域(即物理地址高于896MB的物理空間)。
3、Buddy
如上圖所示,每個zone區域都采用伙伴系統(buddy system)來管理空閑內存頁面。把所有的空閑頁框分組為11個塊鏈表,每個塊鏈表分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續的頁框?!?k… 10。
從buddy system中申請頁面過程:
根據申請存儲區域大小查找對應的編號為K的塊鏈表。
如果編號K的鏈表為空,則向編號為k+1的鏈表申請一個存儲區域。如果編號為k+1鏈表不為空,系統從編號為k+1的鏈表上拆下一個區域,并將拆下的區域分為兩個2^k的區域,一個返還給申請者,另一個則掛到編號為k的鏈表。
如果編號為k+1的鏈表也為空,編號為k+2的鏈表不為空。則從k+2的鏈表中拆下一個區域變為兩個2^(k+1)區域,一個掛到編號為k+1的鏈表上,把另一個拆為兩個2^k的區域,一個返還給申請者,把另一個掛到編號為k的鏈表上。
如果k+2的鏈表也為空,則一直向上迭代,直到編號為10的鏈表為止,如果編號為10的鏈表還為空,則申請失敗。
向buddy system中釋放頁面過程:
在向buddy system 釋放頁面時,總會檢測釋放的頁面和鏈表中其他頁面是否可以組成一個更大一級的頁面,如果可以組成,則把這兩個區域組成一個并掛到更高一級的鏈表中。這個過程是迭代的,釋放過程會一層層向上找伙伴,然后合并成更大的,再向上找伙伴,實在找不到了就停止了!給出了 slab 結構的高層組織結構。在最高層是 cache_chain,這是一個 slab 緩存的鏈接列表。可以用
總結
以上是生活随笔為你收集整理的linux内核之内存管理.doc,linux内核之内存管理.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信用卡分期还款怎么还
- 下一篇: linux 其他常用命令