ARMv7-A Bare Bones: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
mNo edit summary
No edit summary
Line 1: Line 1:
{{Rating|1}}{{Kernel designs}}
{{Rating|1}}{{Kernel designs}}


In this tutorial, we will write a basic ARM kernel and boot it. We target the ARM
In this tutorial, you will write a basic ARM kernel and boot it. You will target the ARM
Versatile Express development board for the Cortex-A15.
Versatile Express development board for the Cortex-A15.


Line 9: Line 9:
== Rationale ==
== Rationale ==


* <b>Why ARMv7-A?</b>
=== Why ARMv7-A? ===
ARMv7 is likely the last purely 32-bit iteration of the ARM architecture, so
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
processors based on it are likely to be supported the longest. The 'A' profile is
Line 15: Line 15:
most interest to OS developers.
most interest to OS developers.


* <b>Why the Cortex-A15?</b>
=== Why the Cortex-A15? ===
Largely because it's the most powerful ARMv7-A processor supported by QEMU, and it
Largely because it's the most powerful ARMv7-A processor supported by QEMU, and it
also has its own development board.
also has its own development board.


* <b>Why the Versatile Express?</b>
=== Why the Versatile Express? ===
This board was designed by ARM Holdings as a prototyping board, so it makes sense
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.
to target a relatively neutral platform built with the Cortex-A15 in mind.
Line 25: Line 25:
== Toolchain ==
== Toolchain ==


We'll be using the GNU toolchain for this, so go read [[GCC Cross-Compiler]] if you
You will 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>. You will need at
haven't already. The target platform is <code>arm-none-eabi</code>. You will need at
least [[GAS]], [[GCC]], and [[LD]], but it is also suggested to have [[GDB]], [[Objcopy]], and [[Objdump]].
least <code>as</code>, <code>gcc</code>, and <code>ld</code>, but I suggest also
having <code>gdb</code>, <code>objcopy</code>, and <code>objdump</code>.


== Code ==
== Code ==
Line 34: Line 33:
_start.arm:
_start.arm:


<source lang="asm">
<pre>
.global _start
.global _start
_start:
_start:
Line 42: Line 41:
b 1b
b 1b
.size _start, . - _start
.size _start, . - _start
</pre>
</source>


start.c:
start.c:


<syntaxhighlight lang="c">
<source lang="c">
#include <stdint.h>
#include <stdint.h>

#define UART0_BASE 0x1c090000
#define UART0_BASE 0x1c090000

void start()
void start() {
{
*(volatile uint32_t *)(UART0_BASE) = 'A';
*(volatile uint32_t *)(UART0_BASE) = 'A';
}
}
</source>
</syntaxhighlight>


linker.ld:
linker.ld:


<source lang="c">
<pre>
ENTRY(_start)
ENTRY(_start)


Line 78: Line 76:
STACK_TOP = .;
STACK_TOP = .;
}
}
</pre>
</source>


== Building and Running ==
== Building and Running ==


<source lang="bash">
<pre>
$ arm-none-eabi-as -march=armv7-a -mcpu=cortex-a15 _start.arm -o _start.o
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-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
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.elf -nographic
qemu-system-arm -M vexpress-a15 -cpu cortex-a15 -kernel kernel.elf -nographic
</pre>
</source>

== Resources ==

It's a lot of material, but these are invaluable references for developing on ARM platforms.


== See Also ==
=== External Links ===
* [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.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]

Revision as of 23:10, 9 September 2018

Difficulty level

Beginner
Kernel Designs
Models
Other Concepts

In this tutorial, you will write a basic ARM kernel and boot it. You will 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

You will 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 GAS, GCC, and LD, but it is also suggested to have GDB, Objcopy, and Objdump.

Code

_start.arm:

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

start.c:

#include <stdint.h>
#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.elf -nographic

See Also

External Links