1. 程式人生 > 實用技巧 >linux0.12核心---關於記憶體定址與4k邊界對齊

linux0.12核心---關於記憶體定址與4k邊界對齊

  1. 以4G大小的實體記憶體為例,其可以儲存4G(4,294,967,296)個位元組(每個位元組8bit(位)),每個位元組在記憶體中可以看做是按照陣列樣式向下排列,因此要想對所有位元組進行定址,那麼就需要對每個位元組進行編址,類似於陣列的下標,通過下標來對記憶體的每個位元組進行訪問,這就是定址。
  2. 由於2^32=4,294,967,296,所以想要定址4G的記憶體,就需要一個32位的二進位制數來對記憶體就行定址,通常用16進位制數來表示地址,1位十六進位制數需要4位二進位制數表示,因此32位的二進位制數就可以轉化為8位的十六進位制來表示,也即下圖的0x00000000、0x00000001。
    在這裡插入圖片描述
  3. 再來看4k對齊,記憶體進行分頁機制時,會找到每一個4k地址的邊界處,進行分頁操作,一頁的大小是4k,頁表中的頁表項儲存的是每一頁實體記憶體的起始地址,佔4個位元組,共32位,如下圖所示。
    在這裡插入圖片描述
    但是實際使用中32位的物理頁基址的低12位全為0,所以會將其挪作他用,作為地址使用時再與上0xfffff000即可。那為什麼物理頁基址的低12位會為0呢?我們再來看下圖。
    在這裡插入圖片描述
    看明白了嗎,如果我們繼續往下對記憶體進行編址,在第4096個位元組處,正好是4k的頁面大小,其對應的地址是0x00000FFF,在此處進行4k分頁,第4097個位元組作為下一個4k頁的起始處,其地址恰為0x00001000,低12位正好為0,是不是很奇妙,這樣再往下分4k的頁面到第8192個位元組,其地址是0x00001FFF,第8193個位元組對應的地址正好是0x00002000。這樣只要是4k頁面的分界處,其32位地址的低12總是0,以此類推下去。因此在進行記憶體分頁時,系統會自動檢測4k頁面的邊界處,進行分頁,實現邊界對齊。