Linux記憶體 記憶體管理的實質

2021-04-17 22:47:55 字數 2095 閱讀 5907

1. 核心初始化:

* 核心建立好核心頁目錄頁表資料庫,假設物理記憶體大小為len,則建立了[3g--3g+len]::[0--len]這樣的虛位址vaddr和實體地址paddr的線性對應關係;

* 核心建立乙個page陣列,page陣列和物理頁面系列完全是線性對應,page用來管理該物理頁面狀態,每個物理頁面的虛位址儲存在page->virtual中;

* 核心建立好乙個free_list,將沒有使用的物理頁面對應的page放入其中,已經使用的就不用放入了;

2. 核心模組申請記憶體vaddr = get_free_pages(mask,order):

* 記憶體管理模組從free_list找到乙個page,將page->virtual作為返回值,該返回值就是對應物理頁面的虛位址;

* 將page從free_list中脫離;

* 模組使用該虛擬位址操作對應的物理記憶體;

3. 核心模組使用vaddr,例如執行指令mov(eax, vaddr):

* cpu獲得vaddr這個虛位址,利用建立好的頁目錄頁表資料庫,找到其對應的物理記憶體位址;

* 將eax的內容寫入vaddr對應的物理記憶體位址內;

4. 核心模組釋放記憶體free_pages(vaddr,order):

* 依據vaddr找到對應的page;

* 將該page加入到free_list中;

5. 使用者程序申請記憶體vaddr = malloc(size):

* 記憶體管理模組從使用者程序記憶體空間(0--3g)中找到一塊還沒使用的空間vm_area_struct(start--end);

* 隨後將其插入到task->mm->mmap鍊錶中;

6. 使用者程序寫入vaddr(0-3g),例如執行指令mov(eax, vaddr):

* cpu獲得vaddr這個虛位址,該虛位址應該已經由glibc庫設定好了,一定在3g一下的某個區域,根據cr3暫存器指向的current->pgd查當前程序的頁目錄頁表資料庫,發現該vaddr對應的頁目錄表項為0,故產生異常;

* 在異常處理中,發現該vaddr對應的vm_area_struct已經存在,為vaddr對應的頁目錄表項分配乙個頁表;

* 隨後從free_list找到乙個page,將該page對應的物理頁面物理首位址賦給vaddr對應的頁表表項,很明顯,此時的vaddr和paddr不是線性對應關係了;

* 將page從free_list中脫離;

* 異常處理返回;

* cpu重新執行剛剛發生異常的指令mov(eax, vaddr);

* cpu獲得vaddr這個虛位址,根據cr3暫存器指向的current->pgd,利用建立好的頁目錄頁表資料庫,找到其對應的物理記憶體位址;

* 將eax的內容寫入vaddr對應的物理記憶體位址內;  

7. 使用者程序釋放記憶體vaddr,free(vaddr):

* 找到該vaddr所在的vm_area_struct;

* 找到vm_area_struct:start--end對應的所有頁目錄頁表項,清空對應的所有頁表項;

* 釋放這些頁表項指向物理頁面所對應的page,並將這些page加入到free_list佇列中;

* 有必要還會清空一些頁目錄表項,並釋放這些頁目錄表項指向的頁表;

* 從task->mm->mmap鏈中刪除該vm_area_struct並釋放掉;

綜合說明:

* 可用物理記憶體就是free_list中各page對應的物理記憶體;

* 頁目錄頁表資料庫的主要目的是為cpu訪問物理記憶體時轉換vaddr-->paddr使用,分配以及釋放記憶體時不會用到,但是需要核心記憶體管理系統在合適時機為cpu建立好該庫;

* 對於使用者程序在6中獲得的物理頁面,有兩個頁表項對應,乙個就是核心頁目錄頁表資料庫的某個pte[i ],乙個就是當前程序核心頁目錄頁表資料庫的某個 pte[j],但是只有乙個page和其對應。如果此時排程到其他程序,其他程序申請並訪問某個記憶體,則不會涉及到該物理頁面,因為其分配時首先要從 free_list中找乙個page,而該物理頁面對應的page已經從free_list中脫離出來了,因此不存在該物理頁面被其他程序改寫操作的情況。核心中通過get_free_pages等方式獲取記憶體時,也不會涉及到該物理頁面,原理同前所述。

Linux記憶體 記憶體管理的實質

1.核心初始化 核心建立好核心頁目錄頁表資料庫,假設物理記憶體大小為len,則建立了 3g 3g len 0 len 這樣的虛位址vaddr和實體地址paddr的線性對應關係 核心建立乙個page陣列,page陣列和物理頁面系列完全是線性對應,page用來管理該物理頁面狀態,每個物理頁面的虛位址儲存...

Linux記憶體 記憶體管理的實質

1.核心初始化 核心建立好核心頁目錄頁表資料庫,假設物理記憶體大小為len,則建立了 3g 3g len 0 len 這樣的虛位址vaddr和實體地址paddr的線性對應關係 核心建立乙個page陣列,page陣列和物理頁面系列完全是線性對應,page用來管理該物理頁面狀態,每個物理頁面的虛位址儲存...

Linux記憶體 記憶體管理的實質

1.核心初始化 核心建立好核心頁目錄頁表資料庫,假設物理記憶體大小為len,則建立了 3g 3g len 0 len 這樣的虛位址vaddr和實體地址paddr的線性對應關係 核心建立乙個page陣列,page陣列和物理頁面系列完全是線性對應,page用來管理該物理頁面狀態,每個物理頁面的虛位址儲存...