mem_map初始化

mem_map初始化

Content #

//代码路径:mm/memory.c:


#define LOW_MEM 0x100000                       //1 MB
#define PAGING_MEMORY (15*1024*1024)           //只管理1MB以上的空间,只有15MB
#define PAGING_PAGES (PAGING_MEMORY>>12)       //15 MB的页数
#define MAP_NR(addr) (((addr)-LOW_MEM)>>12)
#define USED 100

static long HIGH_MEMORY= 0;

static unsigned char mem_map [PAGING_PAGES]= {0,};  //注意每个元素一个字节

void mem_init(long start_mem, long end_mem)  //start_mem传进来的值为buffer_memory_end
{
    int i;
    HIGH_MEMORY= end_mem;
    for (i=0;i<PAGING_PAGES;i++)
        mem_map[i]= USED;
    i= MAP_NR(start_mem);                        //start_mem为6 MB(虚拟盘之后)
    end_mem -= start_mem;
    end_mem >>= 12;                              //16 MB的页数
    while (end_mem-->0)
        mem_map[i++]=0;
}

系统通过mem_map[]对1 MB以上的内存分页进行管理,记录一个页面的使用次数。 mem_init()函数先将所有的内存页面使用计数均设置成USED(100,即被使用),然后再将主内存中的所有页面使用计数全部清零,系统以后只把使用计数为0的页面视为空闲页面。

From #

Linux内核设计的艺术