{{Navigation
|Zurück = [[ARM-OS-Dev Teil 7 – Physische Speicherverwaltung]]
|Vor = [[ARM-OS-Dev Teil 9 – Paging]]
}}
== Ein erstes Testprogramm ==
Wie in der [[Teil 8 - Ein_erstes_Programm#Ein kleines Testprogramm|x86-Reihe]] auch soll das erste Testprogramm einfach die Zahlen 0 bis 2 ausgeben. Auch hier geschieht das durch direkten Hardwarezugriff:
arm-elf-objcopy -O binary usertest usertest.binDiese muss nun wieder in eine Objektdatei umgewandelt werden, damit wir sie in den Kernel linken können:
arm-elf-objcopy -I binary -O elf32-littlearm -B armv5t --rename-section .data=.rodata,alloc,load,readonly,data,contents usertest.bin usertest.incelfDas Ergebnis ist eine Datei namens ''usertest.incelf'', die die ursprüngliche Binary in einer .rodata-Section enthält. Den Anfang der Daten markiert ein Symbol namens ''_binary_usertest_bin_start'', das Ende ''_binary_usertest_bin_end''. Um die Binärdaten im Kernel zu laden, müssen diese Symbole also lediglich als ''extern const void'' (oder ähnlich) definiert werden und dann genügen folgende zwei Zeilen, um die Datei nach 0x00200000 zu laden und auszuführen:
.arm
.extern syscall
.global asm_handle_swi
asm_handle_swi:
push {r14}
bl syscall
pop {r14}
movs r15, r14
Nun wird noch die ''syscall''-Funktion benötigt. Deren erste vier Parameter sind ''r0'' bis ''r3'', also die Syscallparameter aus dem Userspace. Wir lassen sie allerdings noch einen fünften Parameter nehmen. Dieser wird nach der ARM-Calling-Convention vom Stack genommen, wo ''r14'' liegt. Dies ist dann unsere Möglichkeit, die Nummer des Syscalls herauszufinden, da der SWI-Opcode an der Adresse ''r14 - 4'' liegt und wir ihn damit auslesen können: