linux內存管理器子系統

今天學習了一下linux的內存管理子系統。這裏總結一下。

linux系統的結構圖如下所示:

它有好幾個部分組成:硬件架構部分(ARCH)、設備驅動、內存管理、網絡棧、進程管理、VFS、系統調用接口。今天簡單介紹一下內存管理子系統——memory managementa。

內存管理子系統主要有這幾個工作:

(1)虛擬地址空間分佈

(1)負責虛擬地址與物理地址的映射

(2)物理地址的分配管理

先簡單介紹虛擬地址空間分佈,如下圖所示:


右邊紅框是linux的虛擬地址空間分佈。一些芯片的數據手冊中介紹的某些寄存器的地址是物理地址,用彙編語言直接操作寄存器的時候會用到物理地址。在linux系統中,或者在軟件編程中,使用的往往是虛擬地址。虛擬地址空間範圍有CPU決定,地址總線爲32位的CPU,它的虛擬地址空間容量有2^32=4GB的空間。

如上圖,linux虛擬地址空間分爲用戶空間和內核空間兩大部分。0~3G是用戶空間,3G~4G是內核空間。(以S5PV210爲例)

內核空間又分爲四個區域:直接映射區、vmalloc區、永久內核映射區、固定映射線性去。這四個區域在虛擬地址到物理地址的映射上有一定區別。

1、用戶空間到物理地址的映射。原來如下圖


cr3寄存器中存放有頁目錄基地址,與虛擬地址的高10位頁目錄偏移量相加,可以找到頁目錄裏面的一個頁目錄項。頁目錄項存放着一個頁表的基地址,該基地址與虛擬地址的中間第1221位的頁表偏移量相加,即可找到一個物理頁的基地址。物理頁的基地址,加上虛擬地址的低12位的物理頁偏移量,即可得到實際屋物理頁中的物理存儲單元。一個物理頁大小4kb


2、內核空間虛擬地址到物理地址的映射

(1)直接映射區:

該區域範圍是:3G——>3G+896MB。該區域的虛擬地址=3G+物理地址。因此,虛擬地址減去3G即可得到物理地址。物理地址中,896MB以後的區域成爲高端區,896MB以內區域(0~896)稱爲低端區域。直接映射區對應的物理地址是低端區。所以叫它直接映射區。

2vmalloc區:該區域虛擬地址即可訪問高端區域,也可訪問低端區域。與物理地址之間沒有簡單映射關係。


3)永久映射區:固定用來訪問物理地址爲896MB~1G的高端內存的。

 

4)固定映射線性區:此區域的虛擬地址用來訪問一些固定的寄存器。

除了直接映射區外,其他區域都要通過相應頁目錄跟頁表來映射到物理地址。


最後介紹一下物理內存的分配管理。如下圖


mallocforkexcutemmap申請內存空間時,返回的虛擬地址並沒有與物理地址相對應,即實際上沒有分配物理地址,僅當訪問虛擬地址時,纔會分配物理內存。

但是用Kmalloc申請內存空間時,返回的虛擬地址已經跟物理地址相對應,即已經分配了物理地址。


以上講的所有操作都是有內存管理子系統完成的。歡迎拍磚。






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