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.

_start.s

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

linker.ld

ENTRY(_start)
SECTIONS {
 /* 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) }
STACK_BASE = .;
 . += 0x10000;
 STACK_TOP = .;
 }

start.c

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

Makefile

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 : https://balau82.wordpress.com/2010/02/14/simplest-bare-metal-program-for-arm/ , http://wiki.osdev.org/ARMv7-A_Bare_Bones

Laisser un commentaire

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

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. 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