Ejemplo n.º 1
0
/*!
 * 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 );
}
Ejemplo n.º 2
0
/*! 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 );
		}
	}
}
Ejemplo n.º 3
0
/*! 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 );
}