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内核设计的艺术