天天看點

Linux-記憶體管理

1.位址類型

實體位址---CPU位址總線的尋址實體記憶體的位址信号,位址變換的最終結果

線性位址(虛拟位址)

邏輯位址---彙程式設計式中的位址

邏輯位址—段式管理單元—虛拟位址—頁式管理—實體位址

2.段式管理:

16位的CPU擁有20位位址線(8086),它的尋址範圍是2的20次方,即1M記憶體空間.但16位CPU寄存器隻有16位置能通路64K。是以CPU加入段寄存器,采用記憶體分段管理模式。16位吧1M記憶體分為若幹個邏輯段.

邏輯段的起始位址必須是16的倍數,即低4位全零。

邏輯段最大容量位64K.

邏輯位址=段基位址+段内偏移量

實體位址得到方法:

PA=段寄存器值×16+邏輯位址

eg:

通路代碼段CS+IP

通路堆棧:SS+SP

3.分頁管理

分頁單元吧所有的記憶體劃分位固定長度的頁,長度一般與線性位址頁相同。兩者一一映射關系

頁目錄索引(12位),頁表索引(10位),偏移(12位)​​

Linux核心的設計并沒有全部采用Intel提供的段機制,僅采用分頁機制(很多RISC不支援段機制),每個段的邏輯位址空間範圍0-4GB,所有段的基位址均為0,邏輯位址與現行位址保持一緻,Linux完全的利用了分頁機制。2.6.10版本Linux采用三級分頁模型,但從2.6.11版本開始,采用四級分頁模型,

四級分頁模型向前相容,比如64位CPU可能采用多級分頁模型,低32位與現32位CPU保持一緻,高位為0.

4.虛拟記憶體

(1)Linux采用虛拟記憶體管理技術,使得每個程序都有獨立的程序位址空間,大小0-3G,利用虛拟位址,不但可以保護作業系統,更重要的是使用者程式可以使用比實際記憶體更大的位址空間。核心空間從3G-4G。

(2)每個程序使用者空間是完全獨立的.

(3)實際的實體記憶體隻有當程序真的去通路新擷取的虛拟記憶體位址時,才會有“請頁機制”産生“缺頁異常”,進而進入配置設定實際頁框的程式,該異常會配置設定實體頁,建立對應頁表,這之後,虛拟位址才實實在在映射到實體位址上。

5.記憶體配置設定函數

  1. <linux/slab.h>
  2. *kmalloc(size_t size,int flags)
  3. (unsigned int flags)
  4. (unsigned int flags)
  5. (unsigned int flags,unsigned int order)
  6. (unsigned long addr)
  7. (unsigned long addr,unsigned long order)

詳細用法,參考LDD3的學習筆記

6.核心空間

核心空間完全是由核心負責映射的,不會跟着程序改變,是固定的。

(1)實體記憶體896MB以上的部分稱為高端記憶體.

 ​​

從3G開始,最大869MB的線性位址成為直接記憶體映射區,該區域的線性位址和實體位址存線上性轉換關系

線性位址=3G+實體位址

(2)動态記憶體映射區,該區有核心函數vmalloc來配置設定的,特點是線性空間連續,實體位址空間不一定連續,vmallc配置設定的線性位址對應的實體頁可能處于低端記憶體,也可能出于高端記憶體。

繼續閱讀