| Zeile 16: | Zeile 16: | ||
Für die Konstruktoren: | Für die Konstruktoren: | ||
| − | < | + | <asm> |
static_ctors_loop: | static_ctors_loop: | ||
mov ebx, start_ctors | mov ebx, start_ctors | ||
| Zeile 26: | Zeile 26: | ||
cmp ebx, end_ctors | cmp ebx, end_ctors | ||
jb .body | jb .body | ||
| − | </ | + | </asm> |
start_ctors ist dabei im Linker-Script angegeben. | start_ctors ist dabei im Linker-Script angegeben. | ||
Für die Destruktoren: | Für die Destruktoren: | ||
| − | < | + | <asm> |
static_dtors_loop: | static_dtors_loop: | ||
mov ebx, start_dtors | mov ebx, start_dtors | ||
| Zeile 41: | Zeile 41: | ||
cmp ebx, end_dtors | cmp ebx, end_dtors | ||
jb .body | jb .body | ||
| − | </ | + | </asm> |
end_dtors ist hier auch im Linker-Script angegeben. | end_dtors ist hier auch im Linker-Script angegeben. | ||
| Zeile 92: | Zeile 92: | ||
Um diesen Fehler vorzubeugen, sollte also zumindest eine Stub-Funktion erstellt werden: | Um diesen Fehler vorzubeugen, sollte also zumindest eine Stub-Funktion erstellt werden: | ||
| − | < | + | <c> |
extern(C) void _d_array_bounds(char filename, uint line) {} | extern(C) void _d_array_bounds(char filename, uint line) {} | ||
| − | </ | + | </c> |
Zu Debugging-Zwecken kann hier natürlich auch eine echt Überprüfung gemacht werden. | Zu Debugging-Zwecken kann hier natürlich auch eine echt Überprüfung gemacht werden. | ||
| Zeile 102: | Zeile 102: | ||
Nichts weltbewegendes, wir geben ein einfaches 'D' auf dem Bildschirm aus: | Nichts weltbewegendes, wir geben ein einfaches 'D' auf dem Bildschirm aus: | ||
| − | < | + | <c> |
module kernel.main; | module kernel.main; | ||
| Zeile 124: | Zeile 124: | ||
} | } | ||
} | } | ||
| − | </ | + | </c> |
Man beachte das 'module kernel.main', wobei kernel der Name des Verzeichnisses ist, wo sich die Datei befindet. | Man beachte das 'module kernel.main', wobei kernel der Name des Verzeichnisses ist, wo sich die Datei befindet. | ||
| Zeile 132: | Zeile 132: | ||
Und hier der Start-Code mit Multiboot-Signatur und dem Konstruktor/Destruktor-Code von oben: | Und hier der Start-Code mit Multiboot-Signatur und dem Konstruktor/Destruktor-Code von oben: | ||
| − | < | + | <asm> |
global start | global start | ||
extern main | extern main | ||
| Zeile 191: | Zeile 191: | ||
stack: | stack: | ||
resb STACKSIZE | resb STACKSIZE | ||
| − | </ | + | </asm> |
=== Erstellung === | === Erstellung === | ||
Erstellt wird das Ganze per | Erstellt wird das Ganze per | ||
| − | + | $ nasm -f elf -o ./obj/start.o ./src/kernel/start.asm | |
| − | nasm -f elf -o ./obj/start.o ./src/kernel/start.asm | ||
| − | |||
und | und | ||
| − | + | $ gdc -nostdlib -nodefaultlibs -g -c -o ./obj/kernel.main.o ./src/kernel/kernel.main.d | |
| − | gdc -nostdlib -nodefaultlibs -g -c -o ./obj/kernel.main.o ./src/kernel/kernel.main.d | ||
| − | |||
gelinkt wird's so: | gelinkt wird's so: | ||
| − | + | $ ld -T link.d -o dkernel ./obj/start.o ./obj/kernel.main.o | |
| − | ld -T link.d -o dkernel ./obj/start.o ./obj/kernel.main.o | ||