- 论坛徽章:
- 0
|
这个是linux1.0版,内存管理中,内核页目录,页表,以及管理主内存得主要数据结构mem_map和free_page_list得初始化。
unsigned long paging_init(unsigned long start_mem, unsigned long end_mem) //页目录和页表得初始化,这里主要是内核可用主内存得初始化
{
unsigned long * pg_dir;
unsigned long * pg_table;
unsigned long tmp;
unsigned long address;
/*
* Physical page 0 is special; it's not touched by Linux since BIOS
* and SMM (for laptops with [34]86/SL chips) may need it. It is read
* and write protected to detect null pointer references in the
* kernel.
*/
#if 0
memset((void *) 0, 0, PAGE_SIZE);
#endif
start_mem = PAGE_ALIGN(start_mem);
address = 0;
pg_dir = swapper_pg_dir;
while (address mem_map)
*--p = MAP_PAGE_RESERVED; //都初始化为保留页面
start_low_mem = PAGE_ALIGN(start_low_mem);
start_mem = PAGE_ALIGN(start_mem); //字节对齐
while (start_low_mem = 0xA0000 && tmp > 10,
end_mem >> 10,
codepages << (PAGE_SHIFT-10),
reservedpages << (PAGE_SHIFT-10),
datapages << (PAGE_SHIFT-10));
/* test if the WP bit is honoured in supervisor mode */
wp_works_ok = -1;
pg0[0] = PAGE_READONLY;
invalidate();
__asm__ __volatile__("movb 0,%%al ; movb %%al,0": : :"ax", "memory");
pg0[0] = 0;
invalidate();
if (wp_works_ok < 0)
wp_works_ok = 0;
return;
}
可以看到linux对内存的使用,首先是保留内核空间,在最低端保留0xA0000内存空间,但不知道这个空间干吗用的,然后是主内存空间从start_mem开始到end_mem这是系统要进行管理的空间,然后把这个空见映射到内核线性地址0xc0000000开始的空间,所以看见现在的linux可知持最大内存是1g,可见内核可以访问内核的任意地址。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11234/showart_59820.html |
|