歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux內存管理

Linux內存管理

日期:2017/2/28 14:53:49   编辑:Linux教程

Linux 0.11的內存管理總結。。。許多其它內容參見“地址翻譯”部分

1、分頁相關的頁目錄表和頁表

Linux 0.11中的內存管理是分頁式的內存管理。程序中的邏輯地址,在經過地址翻譯後會被轉成線性地址。內存管理部分所接觸的地址,基本上都以線性地址為主。

在分頁式的內存管理中,將物理內存看成是一個個的連續的頁組成。在Linux 0.11中,這個頁的大小是4KB。因此,每個頁的起始地址是4KB對齊的,也就是說在進行尋址內存頁時,物理地址的低12位是沒有幫助的。所以,這地址的低12位被用於其它特殊的作用。

頁目錄表中存放著頁表所在頁的物理起始地址,頁表中存放著物理頁的起始地址。簡單來說,就是線性地址通過高10位,在頁目錄表中找到頁表地址。然後使用頁表和中間10位找到頁的地址。最後使用頁的地址和低12位找到字節地址。

頁目錄表在Linux 0.11中只有一個,它在物理地址為0的內存頁上。所以,要計算頁目錄表中某一個項的地址就很容易,用這個項在頁目錄表中的索引乘以4即可。頁目錄項在頁目錄表中的索引由線性地址的高10位可以得到。如果這裡有線性地址addr,那麼計算這個線性地址在頁目錄表中的項的索引為addr>>22。最後,計算這個項的地址為(addr>>22)*4,也就是addr>>20。(在Linux 0.11中所有的進程共用一個頁目錄表,因為各個進程的線性地址之間沒有重復)。

2、相關的變量數據

在memory.c中定義了與內存管理相關的變量和常量。

#define LOW_MEM 0x100000 進程可用的物理內存的最低地址,0x100000=1M。低於1M的物理地址,供系統使用

#define PAGING_MEMORY (15*1024*1024) 分頁的內存大小,共15M

#define PAGING_PAGES (PAGING_MEMORY>>12) ,PAGING_PAGES內存分頁之後全部的頁數,總大小15M/每頁大小4K

#define MAP_NR(addr) (((addr)-LOW_MEM)>>12) 物理地址addr對應的內存頁的編號。物理地址addr與分頁編號nr之間的關系為addr=LOW_MEM+nr*4K

static unsigned char mem_map [ PAGING_PAGES ] = {0,}; mem_map數組用來標識內存頁的使用情況。對於編號為nr的內存頁,如果mem_map[nr]為0,則表示這個內存頁未被占用。如果mem_map[nr]大於0,則表示這個內存頁被占用,並且mem_map[nr]的值為這個內存頁被引用的次數

static long HIGH_MEMORY = 0; HIGH_MEMORY表示可用物理內存地址的最大值

Copyright © Linux教程網 All Rights Reserved