/*! * Init memory layout: using variables "from" linker script and multiboot info */ void k_memory_init ( unsigned long magic, unsigned long addr ) { extern char kernel_code, k_kernel_end; multiboot_info_t *mbi; /* implicitly from kernel linker script */ k_kernel.start = &kernel_code; k_kernel.size = ( (uint) &k_kernel_end ) - (uint) &kernel_code; /* Am I booted by a Multiboot-compliant boot loader? */ if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { kprint ( "Boot loader is not multiboot-compliant!\n" ); halt(); } /* from multiboot info */ multiboot = addr; mbi = (void *) addr; k_heap.start = (void *) &k_kernel_end; k_heap.size = ( mbi->mem_upper - 1024 ) * 1024 - (size_t) &k_kernel_end; /* initialize dynamic memory allocation subsystem (needed for boot) */ k_mpool = k_mem_init ( k_heap.start, k_heap.size ); }
/*! Initial memory layout created in arch layer */ void k_memory_init () { int i, j; kprog_t *prog; char *name; mseg = arch_memory_init (); /* initialize dynamic memory allocation subsystem */ for ( i = 0; mseg[i].type != MS_END && !k_mpool; i++ ) { if ( mseg[i].type == MS_KHEAP ) { k_mpool = k_mem_init ( mseg[i].start, mseg[i].size ); break; } } ASSERT ( k_mpool ); list_init ( &progs ); /* look into each segment marked as module, add programs to 'progs' */ for ( i = 0; mseg[i].type != MS_END; i++ ) { if ( mseg[i].type != MS_MODULE ) continue; /* * Is this segment a program? * Programs have 'prog_name' in command line */ name = strstr ( mseg[i].name, PNAME ); if ( name ) { prog = kmalloc ( sizeof (kprog_t) ); name += strlen ( PNAME ); for(j = 0; j < MAX_PROG_NAME_LEN && name[j] != ' '; j++) prog->prog_name[j] = name[j]; prog->prog_name[j] = 0; prog->pi = (void *) mseg[i].start; prog->m = &mseg[i]; prog->started = FALSE; list_append ( &progs, prog, &prog->list ); } } }
/*! Initial memory layout created in arch layer */ void k_memory_init () { int i; k_mpool = NULL; mseg = arch_memory_init (); /* find kernel heap */ for ( i = 0; mseg[i].type != MS_END && !k_mpool; i++ ) { if ( mseg[i].type == MS_KHEAP ) { k_mpool = k_mem_init ( mseg[i].start, mseg[i].size ); break; } } ASSERT ( k_mpool ); }
/*! * Init memory layout: using variables "from" linker script and multiboot info */ void k_memory_init ( unsigned long magic, unsigned long addr ) { extern char kernel_code, k_kernel_end; multiboot_info_t *mbi; multiboot_module_t *mod; prog_info_t *pi; uint max; int i; char *name, *pos; /* implicitly from kernel linker script */ k_kernel.start = &kernel_code; k_kernel.size = ( (uint) &k_kernel_end ) - (uint) &kernel_code; /* Am I booted by a Multiboot-compliant boot loader? */ if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { kprint ( "Boot loader is not multiboot-compliant!\n" ); halt(); } /* from multiboot info */ multiboot = addr; mbi = (void *) addr; max = (uint) &k_kernel_end; prog.pi = NULL; /* initialize modules */ if ( mbi->flags & MULTIBOOT_INFO_MODS ) { mod = (void *) mbi->mods_addr; for ( i = 0; i < mbi->mods_count; i++, mod++ ) { if ( max < mod->mod_end ) max = mod->mod_end + 1; /* Is this module a program? Programs must have 'prog_name' in command line */ name = strstr ( (char *) mod->cmdline, PNAME ); if ( name && !prog.pi ) { name += strlen ( PNAME ); pos = strchr ( name, ' ' ); if ( pos ) *pos++ = 0; prog.prog_name = name; pi = (void *) mod->mod_start; prog.pi = pi->start_adr; prog.m.start = prog.pi; prog.m.size = (size_t) pi->end_adr - (size_t) pi->start_adr + 1; prog.started = FALSE; memcpy ( prog.pi, pi, prog.m.size ); if ( max < (uint) pi->end_adr ) max = (uint) pi->end_adr + 1; } } } if ( max % ALIGN_TO ) max += ALIGN_TO - ( max % ALIGN_TO ); k_heap.start = (void *) max; k_heap.size = ( mbi->mem_upper - 1024 ) * 1024 - max; /* initialize dynamic memory allocation subsystem (needed for boot) */ k_mpool = k_mem_init ( k_heap.start, k_heap.size ); }