ARM bare metal example

Here is the simplest example of bare metal program I know. This is a mix of examples I found, because for some obscure reasons, none of these sources provided a working example with a recent GNU GCC. I’ll only give the source for each file and a makefile.


.globl _start
 .extern STACK_TOP
 ldr sp, =STACK_TOP
 bl start
 b 1b
 .size _start, . - _start


 /* QEMU loads the kernel in Flash here. I strongly suggest you look at the
 * memory map provided in the CoreTile TRM (see below).
 . = 0x80010000 ;
/* Make sure our entry stub goes first */
 .stub : { _start.o(.text) }
 .text : { *(.text) }
 .rodata : { *(.rodata) }
 .data : { *(.data) }
 .bss : { *(.bss COMMON) }
 . += 0x10000;


#define UART0_BASE 0x1c090000
 void start()
 *(volatile long int *)(UART0_BASE) = 'A';


all : kernel.elf
test : kernel.elf
 qemu-system-arm -M vexpress-a15 -cpu cortex-a15 -kernel kernel.elf -nographic
_start.o : _start.arm
 $(CROSS_COMPILE)as -march=armv7-a -mcpu=cortex-a15 $^ -o $@
 start.o : start.c
 $(CROSS_COMPILE)gcc -ffreestanding -Wall -Wextra -Werror -c $^ -o $@
 kernel.elf : linker.ld _start.o start.o
 $(CROSS_COMPILE)ld -T $^ -o $@

Then make elf will build the binary, and make test should launch Qemu🙂

Sources : ,

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:


Vous commentez à l'aide de votre compte Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s