linux0 11之記憶體管理

2021-06-01 00:34:25 字數 996 閱讀 6684

其實我覺得作業系統的記憶體管理很神秘,且不說在寫應用程式時呼叫的malloc,在寫linux驅動時get_free_page,get_free_pages,kmalloc,就相當頭疼。看完linux0.11之後小有感觸,就此記下。

先說核心使用的get_free_page吧,其實get_free_page返回的是空閒頁面的實體地址,見下圖所示

物理記憶體被分割為一般大小為4kb的頁面,在核心中有乙個與總頁數大小相同的陣列,陣列對應項中儲存著對應頁面的一些基本資訊,如是否被占用,讀寫的許可權,共享等。

get_free_page函式就是在此陣列中尋找乙個沒有被使用的頁面,然後標記為在使用,然後返回該頁面的物理記憶體位址。沒錯就是實體地址,你學過作業系統,一般是不會使用實體地址,一般實體地址都是線性位址通過頁面就行轉換得來的,確實核心也不例外。先埋伏筆於此。

在linux0.11中核心的**段和資料段的限長為16mb,linux0.11所能管理的最大記憶體也就是16mb,所以核心能對每一塊記憶體訪問。核心有四個頁目錄項,總共對映16mb的記憶體。

總結一句就是在核心中,任何乙個線性位址經過頁表轉換,得到的實體地址和線性位址是一樣的(因為原因如上圖所示,核心對自己限長內的16mb都對映為與線性位址相同的實體地址,圖畫的不是很好,見諒)

所以當get_free_page返回實體地址時,核心可以直接使用實體地址作為指標,訪問對應的物理記憶體,因為實體地址和線性位址是一樣的。了然?

kmalloc其實返回的也是實體地址,如上在核心使用時直接使用,訪問對應物理記憶體,只不過它採用了一種機制,在核心中分配指定大小的物理記憶體。使用的是儲存桶原理

具體的實現我就不說了,網上有很多推薦一篇malloc儲存桶原理

在使用者程式中使用的malloc是使用者的函式庫提供的,基本原理就是最終會呼叫系統呼叫brk,增加資料區的大小,但並不在此時分配實際的物理記憶體,在實際呼叫使用的時候出現缺頁異常的時候分配記憶體,增加頁表項。

說了這麼多,理解核心分配的要點就是核心頁面中線性位址被對映到相同數值的實體地址,核心中實體地址和線性位址可以混用,對於記憶體的管理相當方便。

linux0 11 記憶體結構

linux0.11,記憶體最多支援16m,其中0 1m是核心區,核心模組大約為520k,即end位址,即實際核心使用是從0 到end,之後到640k是高速緩衝區,從640k開始的區域,分別是視訊記憶體,bios區域,高速緩衝區,高速緩衝區之後是是主記憶體區域。在記憶體核心區域當中,從0開始,首先存放...

linux0 11記憶體管理之page s檔案

page.s包括頁異常處理程式,中斷14 主要分兩種情況處理.一是由於缺頁引起的 頁異常中斷,通過呼叫do no page err code,address 來處理,二是由頁寫保護引起 的頁異常,此時通過呼叫頁寫保護處理函式do wp page err code,address 處理哦 其中出錯碼 ...

linux 0 11 之訊號管理

1 概述 在 unix 系統中,訊號是一種 軟體中斷 處理機制。有許多較為複雜的程式會使用到訊號。訊號機制提供了一種處理非同步事件的方法。在核心 中通常使用乙個無符號長整數 32位 中的位元位來表示各種不同的訊號,因此最多可表示 32個不同的訊號。2 程序對訊號的三種處理或操作方式 a 忽略該訊號。...