Tag: bootloader

从我的启动加载程序加载elf-i386

我正在做操作系统项目,直到现在我的bootloader都在运行。 我可以使用bios interuppt加载二进制文件,但我无法从ELF文件格式加载和调用C函数: 这是我想要最终执行的C程序: //build :: cc -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o kmain.o kmain.c void kmain(){ int a = 5; for(;;); } 这是调用kmain()的汇编代码 ; build :: nasm -f elf loader.asm [BITS 32] [GLOBAL start] [EXTERN kmain] section .text start: mov eax, 0 call kmain 这是我的链接器脚本 ENTRY(start) 这就是我如何把所有东西连在一起 ld -m elf_i386 -T link.ld -o […]

GDB跨越命令

我有以下C代码: #include #include #define SECTSIZE 512 #define ELFHDR ((struct Elf *)0x10000) // scratch space void readsect(void*, unit32_t); void readsec(uint32_t, uint32_t, uint32_t); void bootmain(void) { struct Proghdr *ph, *eph; // read 1st page off disk readseg((uint32_t) ELFHDR, SECTSIZE*8, 0); . . // REST OF CODE . } 我正在使用gdb介入我的代码,看看发生了什么。 我找到了bootmain 0x7d0a的地址,我在那里放了一个断点。 b *0x7d0a c 以上2个命令: b放置断点, c运行直到达到断点。 […]

编译时的加载地址是在RAM中复制可执行文件的地方吗?

我正在尝试编写自己的装载机。 在这个程序中,我将程序复制到RAM中的特定地址,并通过读取精灵的入口点跳转到入口点地址。 但是,我无法理解装载程序地址是什么? 这是否意味着只需要在编译时指定的加载器地址复制二进制文件。 我不能在其他位置加载程序而不是在编译时指定的加载地址? 我的基本问题是:“我不能在其他位置加载程序而不是在编译时指定的加载地址吗?”

Cortex M3的Bootloader

我正在使用mbed的LPC 1768板(带有cortex M3 cpu),我正在尝试在这里实现一些function,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是一个bootloader / nano-kernel,以及一个用户应用程序(helloworld将开始): 在0x00地址运行的Bootloader / nano-kernel,它会做一些检查并最终获取SD卡上的二进制文件 Bootloader / nano-kernel会将这个二进制文件复制到地址0x9000(以后可能需要更改,但bootloader / nano-kernel不会使用此空间,所以应该没问题) Bootloader跳转到0x9000 + 4的用户应用程序 Sd卡很容易解决,我遇到了跳跃部分的问题。 这是跳跃函数的代码。 void run(void) { void (*user_code_entry)(void); unsigned *p; SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80); // Load contents of second word of user flash – the reset handler address // in the applications vector table p = (unsigned *)(USER_FLASH_START […]

如何在Stellaris中的程序之间跳转

我正在为Stellaris LM3S1607芯片开发一个引导加载程序。 我正在使用Keil MicroVision4 C编译器。 我们的想法是创建2个独立的固件,一个将更新另一个。 在firmware1中,我下载了firmware2文件并将其写入地址0x3200的闪存中。 直到这里它才有效。 我还validation了数据写入闪存是否正确。 现在我在flash中有两个应用程序。 一个是我的uip引导装载程序,而seoncd就是我的主要项目。 我想知道如何从第一个程序跳转到位于0x3200的第二个程序。 如果有人能帮我跳,那就太好了。 谢谢