之前也写了关于内存初始化的文章,但是可能是我理解不够透彻,或者写出的文章不容易理解,接下来的几篇中我将配上图片辅助理解,尽量只讲一个知识点。
linux0.11内核默认支持的最大内存容量是16MB,先把1M到16M的地址,也就是15M空间划分成页,一页大小是4KB,15MB的空间就会有15MB >> 4KB 也就是 15*1024*1024 >> 12
个页数量。然后把mem_map
数组清零,数组值为0表示该页没有被使用,程序申请就可以获取。
#define LOW_MEM 0x100000 // 内存低端(1MB)
#define PAGING_MEMORY (15*1024*1024) // 分页内存15 MB,主内存区最多15M.
#define PAGING_PAGES (PAGING_MEMORY>>12) // 分页后的物理内存页面数(3840)
#define MAP_NR(addr) (((addr)-LOW_MEM)>>12) // 指定地址映射为页号
#define USED 100 // 页面被占用标志
void mem_init(long start_mem, long end_mem)
{
int i;
HIGH_MEMORY = end_mem; // 设置内存最高端(16MB)
for (i=0 ; i<PAGING_PAGES ; i++)
mem_map[i] = USED;
i = MAP_NR(start_mem); // 内存地址转页号
end_mem -= start_mem;
end_mem >>= 12; // 主内存区中的总页面数
while (end_mem-->0)
mem_map[i++]=0; // mem_map数组清零
}