linux內存管理理解

前言廢話:
linux內存管理涉及的原理知識太多了,也是學習linux系統軟硬件繞不開的部分,筆者水平有限,只能隨心列出一點點理解,希望能幫助到衆多學習linux的技術人員。

我們知道處理器core序列化執行指令,第一步是讀指令,從哪裏讀呢,當然是支持隨機訪問的ram存儲器(norflash也可以,這裏不說)。
當然啦,要讀ram,就需要一個叫做地址的東西去規定從ram的哪一個單元去讀,這裏拿32位core總線來舉例簡單說明硬件原理,從硬件上說就是在某幾個時鐘週期內給這32位地址總線上加上不一樣的電平,比如這32位地址線的狀態是10000000 00000000 00000000 00000000,就代表要操作第0x80000000的存儲單元,然後再給用電平邏輯告訴ram是要讀,然後就用數據總線輸出這個單元的數據。

處理器core執行指令幹嘛呢?當然是處理數據,對於cpu而言,直接的數據來源可能是ram,也可能是某外設(統一編地址獨立編址,這裏不說),都是需要一個地址來表徵要操作哪個單元。
綜上所述,地址很重要。
正題:

1.三類地址:邏輯地址 虛擬地址 物理地址

物理地址:當存儲器與cpucore總線接好之後,每一個存儲單元的地址在特定的配置下是唯一的,不變的,每個存儲單元都有一個地址,這個地址就是物理地址。

邏輯、虛擬地址:linux系統中,虛擬地址是理論地址,是理論上能操作的地址,有一個範圍,比如32位系統,就是0~0xffffffff,並且在linux系統中,邏輯地址與虛擬地址一致,舉例,邏輯地址的0x88888888就是虛擬地址的0x88888888,可這個邏輯、虛擬的0x88888888可不一定對應到物理地址的0x88888888,可能一會是0x02019888一會是0x12019888,linux內存管理的魅力就在這裏。那乾脆一個名字不行麼,不行,邏輯地址只是說和虛擬地址在linux系統中一致,他它兩在概念上差別可大了,這裏我們不多說。

一個現實的問題是,不是所有使用32位core的系統都要配全4G地址的存儲和設備,在linux早期很多系統只有幾百k 大小的ram,那虛擬地址和物理地址一定要產生某些聯繫才行,我們接下來就來看看linux下這個邏輯、虛擬地址以下簡稱是怎樣與物理地址產生關聯的。

2.MMU
MMU是一個與core相連的模塊,其功能就是是把虛擬地址轉化成物理地址,我們搞個圖來看看:
在這裏插入圖片描述
圖相當明顯了,功能上沒什麼好說的。但具體到這個模塊是怎麼工作的,怎麼配置的,那就有的說了,再搞張圖來看看:
在這裏插入圖片描述
上圖是個兩級mmu的映射表示,20-31 共12bits一級,對應爲4096個項,第二級12-19共8bits共256項,最後0-11共12bits是OFFSET。
舉例:給一個虛擬地址1000 0000 0001 0001 0002 0000 0000 0101對應的物理地址是啥呢,我們就要去查表,首先查20-31bit 一級映射1000 0000 0001對應的物理地址的低20-31bit表的第1000 0000 0001項裏面的內容是0000 0000 0000 ,物理地址12bits就有了,以此類推,二級0001 0002項的內容是0000 0000則物理地址的中間8bit就有了,然後最後再來個0000 0000 0101的OFFSET,整個物理地址就出來了:0000 0000 0000 0000 0000 0000 0000 0101,是不是與原來的虛擬地址比只剩一個OFFSET是一直的的了,並且值小了許多。linux虛擬地址0-4G而實際運行在物理內存只有幾百M的的系統上的原因了。

拓展:現在有6G內存,12G內存是如何處理的呢?
----用64bit的core。

3.三個數據集:頁目錄DIRECTORY,頁表TABLE,偏移量OFFSET
32位系統中,
頁目錄:1024項,每項32位,每項大小範圍二進制10bits即0~1023也即1024個項,每項裏面的內容是啥呢?是物理內存中一個頁表的地址。這裏的1024不準確,不同體系的cpu可能不一樣,arm會有4096項,甚至將來的8192項等等。

盜個圖來看看:

圖中只能是示意圖,是intel X86 32位的情景下的圖,讀者可能會發現,與上面的mmu映射有點像哦.
未完待續

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