/* * set up the free-area data structures: * - mark all pages reserved * - mark all memory queues empty * - clear the memory bitmaps */ static unsigned long init_free_area(unsigned long start_mem, unsigned long end_mem) { page_struct_t *p; unsigned long mask = PAGE_MASK; unsigned long i; unsigned long start_addrspace = KADDRSPACE_START; int size; /* * Select nr of pages we try to keep free for important stuff * with a minimum of 10 pages and a maximum of 256 pages, so * that we don't waste too much memory on large systems. * This is fairly arbitrary, but based on some behaviour * analysis. */ INIT_LOG(" init_free_area start_mem: %x endmem:%x \n",start_mem,end_mem); i = (end_mem - start_addrspace) >> (PAGE_SHIFT+7); if (i < 10) i = 10; if (i > 256) i = 256; /*TODO freepages.min = i; freepages.low = i * 2; freepages.high = i * 3;*/ g_mem_map = (page_struct_t *) LONG_ALIGN(start_mem+8); INIT_LOG(" g_mem_map :%x size:%x \n",g_mem_map,MAP_NR(end_mem)); p = g_mem_map + MAP_NR(end_mem); start_mem = LONG_ALIGN((unsigned long) p); size=(start_mem -(unsigned long) g_mem_map); INIT_LOG(" freearemap setup map: %x diff:%x(%dM) \n",g_mem_map,(start_mem -(unsigned long) g_mem_map),size/(1024*1024)); //while(1); ut_memset((unsigned char *)g_mem_map, 0, start_mem -(unsigned long) g_mem_map); do { --p; atomic_set(&p->count, 0); p->flags = (1 << PG_DMA) | (1 << PG_reserved) ; } while (p > g_mem_map); for (i = 0 ; i < NR_MEM_LISTS ; i++) { unsigned long bitmap_size; init_mem_queue(free_mem_area+i); mask += mask; end_mem = (end_mem + ~mask) & mask; bitmap_size = (end_mem - start_addrspace) >> (PAGE_SHIFT + i); bitmap_size = (bitmap_size + 7) >> 3; bitmap_size = LONG_ALIGN(bitmap_size); free_mem_area[i].map = (unsigned int *) start_mem; ut_memset((void *) start_mem, 0, bitmap_size); start_mem += bitmap_size; INIT_LOG(" %d : bitmapsize:%x end_mem:%x \n",i,bitmap_size,end_mem); } return start_mem; }
char* kmem_t::init() { int start_mem = PGALIGN((int)end); pages = (page_t*)LONG_ALIGN(start_mem); int maxpfn = (PHYSTOP) >> PGSHIFT; epages = pages + maxpfn; return (char*)(epages); }