ARMv7-A Bare Bones: Difference between revisions
[unchecked revision] | [unchecked revision] |
Created page with "{{Rating|1}}{{Kernel designs}} In this tutorial, we will write a basic ARM kernel and boot it. We target the ARM Versatile Express development board for the Cortex-A15. <b>Y..." |
No edit summary |
||
Line 26: | Line 26: | ||
We'll be using the GNU toolchain for this, so go read [[GCC Cross-Compiler]] if you |
We'll be using the GNU toolchain for this, so go read [[GCC Cross-Compiler]] if you |
||
haven't already. The target platform is <code>arm-none-eabi</code>. |
haven't already. The target platform is <code>arm-none-eabi</code>. You will need at |
||
least <code>as</code>, <code>gcc</code>, and <code>ld</code>, but I suggest also |
|||
compiling GDB for this architecture, as you can hook it up to QEMU and step through |
|||
having <code>gdb</code>, <code>objcopy</code>, and <code>objdump</code>. |
|||
broken code. |
|||
== Code == |
== Code == |
||
_start.arm: |
|||
<pre> |
<pre> |
||
Line 37: | Line 39: | ||
mov sp, =STACK_TOP |
mov sp, =STACK_TOP |
||
bl start |
bl start |
||
1: |
|||
b |
b 1b |
||
.size _start, . - _start |
|||
</pre> |
</pre> |
||
start.c: |
|||
<syntaxhighlight lang="c"> |
<syntaxhighlight lang="c"> |
||
Line 47: | Line 53: | ||
} |
} |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
linker.ld: |
|||
<pre> |
|||
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 = . |
|||
} |
|||
</pre> |
|||
== Building and Running == |
|||
<pre> |
|||
$ arm-none-eabi-as -march=armv7-a -mcpu=cortex-a15 _start.arm -o _start.o |
|||
$ arm-none-eabi-gcc -ffreestanding -Wall -Wextra -Werror -c start.c -o start.o |
|||
$ arm-none-eabi-ld -T linker.ld _start.o start.o -o kernel.elf |
|||
$ qemu-system-arm -M vexpress-a15 -cpu cortex-a15 -kernel kernel.bin -nographic |
|||
</pre> |
|||
== Resources == |
== Resources == |
||
It's a lot of material, but these are invaluable references for developing on ARM platforms. |
|||
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.boards.express/index.html ARMv7 Cortex-A Series Programmer's Guide] |
|||
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html ARMv7-A Architecture Reference Manual] |
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html ARMv7-A Architecture Reference Manual] |
||
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html ARM Cortex-A15 Technical Reference Manual] |
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html ARM Cortex-A15 Technical Reference Manual] |
||
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.boards.express/index.html CoreTile Express A-15 Technical Reference Manual] |
|||
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.boards.express/index.html Motherboard Express μATX Technical Reference Manual] |
Revision as of 22:57, 15 June 2015
Difficulty level |
---|
Beginner |
Kernel Designs |
---|
Models |
Other Concepts |
In this tutorial, we will write a basic ARM kernel and boot it. We target the ARM Versatile Express development board for the Cortex-A15.
You should read Getting Started and Beginner Mistakes before starting this tutorial.
Rationale
- Why ARMv7-A?
ARMv7 is likely the last purely 32-bit iteration of the ARM architecture, so processors based on it are likely to be supported the longest. The 'A' profile is targeted at complex computing devices like smartphones, and is therefore of the most interest to OS developers.
- Why the Cortex-A15?
Largely because it's the most powerful ARMv7-A processor supported by QEMU, and it also has its own development board.
- Why the Versatile Express?
This board was designed by ARM Holdings as a prototyping board, so it makes sense to target a relatively neutral platform built with the Cortex-A15 in mind.
Toolchain
We'll be using the GNU toolchain for this, so go read GCC Cross-Compiler if you
haven't already. The target platform is arm-none-eabi
. You will need at
least as
, gcc
, and ld
, but I suggest also
having gdb
, objcopy
, and objdump
.
Code
_start.arm:
.global _start _start: mov sp, =STACK_TOP bl start 1: b 1b .size _start, . - _start
start.c:
#define UART0_BASE 0x1c090000
void start()
{
*(volatile uint32_t *)(UART0_BASE) = 'A';
}
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 = . }
Building and Running
$ arm-none-eabi-as -march=armv7-a -mcpu=cortex-a15 _start.arm -o _start.o $ arm-none-eabi-gcc -ffreestanding -Wall -Wextra -Werror -c start.c -o start.o $ arm-none-eabi-ld -T linker.ld _start.o start.o -o kernel.elf $ qemu-system-arm -M vexpress-a15 -cpu cortex-a15 -kernel kernel.bin -nographic
Resources
It's a lot of material, but these are invaluable references for developing on ARM platforms.