bootloader.c

来自「原创作品」· C语言 代码 · 共 72 行

C
72
字号
/* *bootloader.c * * *Loads an ELF kernel from flash memory. * *auther:hegs * *mail:sammhe@tom.com  */#include "bootloader.h" void main(void){	static char *mem = (char *)FLASH_MEM0_BASEADDR;	Elf32_Ehdr *elf;        //elf file header	Elf32_Phdr *elf_phdr;	/* program segment header */	unsigned long e_entry,  	              e_phoff,  //program head offset (at file)	              e_phnum;  //phdr number	                int i;      while(1)  {	 elf = (Elf32_Ehdr *) mem;		 if (elf->e_ident[0] !=0x7f ||  	    elf->e_ident[1] !='E' ||	    elf->e_ident[2] !='L' ||	    elf->e_ident[3] !='F' )	 {		print("not an ELF file\n");		continue; //??flash ??	}	if (elf->e_type != ET_EXEC) {		print("not an ELF executable\n");		continue;	}	e_entry = elf->e_entry;	e_phnum = elf->e_phnum;	e_phoff = elf->e_phoff;	for (i = 0; i < e_phnum; ++i)	{		elf_phdr = (Elf32_Phdr *) (e_phoff+mem);				e_phoff += sizeof(*elf_phdr);		if (elf_phdr->p_type != PT_LOAD)			continue;		memcpy((void *)(elf_phdr->p_vaddr), (void*)(elf_phdr->p_offset+mem), elf_phdr->p_filesz);		memset((char*)(elf_phdr->p_vaddr+elf_phdr->p_filesz), 0, elf_phdr->p_memsz - elf_phdr->p_filesz);	}	print("starting kernel...\n");	void (*boot)();	boot=(void*)e_entry;  	boot();	//???????????	#ifdef LED_BASEADDR	XIo_Out32(LED_BASEADDR, 0x55);	XIo_Out32(LED_BASEADDR, 0xaa);	#endif }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?