Hey,
ich weiß nicht ob ich hier eine Chance auf eine Antwort habe,
aber ich versuche es dennoch.
Leider googlet man sich zu diesem Thema einfach "tod".
Es gibt gefühlt tausende Ansätze für die versch. Prozessrorarchitekturen,
mit oder ohne OS, versch. fertige Bootloader (grub, ..) usw. und so fort.
So aber nun mal "back to scratch"
Ich möchte für ein proof of concept projekt ein kleines OS schreiben.
Natürlich, sowie wahrscheinlich fast die meisten nicht gern in Assembler.
Die Entwicklung findet auf einem Linux-System statt.
Ein funktionierender Bootloader in Assembler x86_64 existiert bereits.
Compiliert wird die asm Datei mit nasm (binary output).
Die CPU Emulation erfolgt mit qemu-system x86_64.
Nun habe ich mehrmals gelesen, dass in Assembler via call eine "Funktion"
aufgerufen werden kann.
Also habe ich folgendes versucht (und auch oft im Internet gelesen):
kernel.cpp
boot_sect.asm
Beim Compilieren kommt dann natürlich der Fehler "symbol start_kernel undefined"...Dann habe ich oft gelesen, man muss Assemmbler vorher mitteilen, dass s ein externer Funktionsaufruf ist, sprich mit extern start_kernel gekennzeichnet werden müsste. Nun kann ich aber in Assembler kein extern verwendet bei einem binary output (benötigt wegen bootloader, magic number) sondern müsste beispielsweise elf64 verwendet, womit ich aber "keinen Bootloader" mehr hätte... Oh man!
Habe auch einiges über das "linking" gelesen, allerdings meist spezifisch
für andere vorgefertigte Bootloader wie grub oder mit Verwendung von Linux oder windows...
Also meine gründsätzliche Frage ist nun:
Man muss doch sicherlich die c++ funktion irgendwo aus dem Speicher herraus über Assembler ansprechen oder? Wie genau klappt das, bzw erfolgt das nicht bei der compilierung der asm Datei oder beim Linking? Wie genau dieses Linking funktioniert weiß ich teilweise..zu mindestens wie ich mit gcc eine C++ "linke"... :S
Ich trete seit 2 Tagen nun einfach nur noch auf einem Punkt herum und komm nicht wirklich dahinter, wie ich nun vorgehen muss... Kann mir also evt. jemand sagen wie ich "möglichst primitiv" über Assembler x86_64 eine C++ Funktion ansprechen kann? Dabei ist zu beachten das das aufzurufende Assemblerscript gleichzeitig der Bootloader ist. Das ich in C++ dann sowas wie iostream oder fstream nicht verwenden kann ist mir bereits klar. Trotzdem ist es wenigstens lesbarere Code als Assembler. Denke auch das ein Kernel bzw OS in C++ deutlich schneller zu programmieren ist als eins mit Assembler :D
Hoffe mir kann dabei vielleicht jemand helfen.
Und bitte tut mir einen Gefallen, bevor ihr mir Links zu Google-Seiten schickt.
Lest sie euch bitte selber erst kurz durch ob das zu dieser Problematik passt.
Denn ich habe schon mehrere hundert Seiten offen gehabt :)
Eine Titelseite zu einem Problem sagt diesbezüglich leider meist wenig aus.
lg, frohe Weihnachten und schon mal frohes West.
Ist ja nicht mehr lang .. :handsdown:
ich weiß nicht ob ich hier eine Chance auf eine Antwort habe,
aber ich versuche es dennoch.
Leider googlet man sich zu diesem Thema einfach "tod".
Es gibt gefühlt tausende Ansätze für die versch. Prozessrorarchitekturen,
mit oder ohne OS, versch. fertige Bootloader (grub, ..) usw. und so fort.
So aber nun mal "back to scratch"
Ich möchte für ein proof of concept projekt ein kleines OS schreiben.
Natürlich, sowie wahrscheinlich fast die meisten nicht gern in Assembler.
Die Entwicklung findet auf einem Linux-System statt.
Ein funktionierender Bootloader in Assembler x86_64 existiert bereits.
Compiliert wird die asm Datei mit nasm (binary output).
Die CPU Emulation erfolgt mit qemu-system x86_64.
Nun habe ich mehrmals gelesen, dass in Assembler via call eine "Funktion"
aufgerufen werden kann.
Also habe ich folgendes versucht (und auch oft im Internet gelesen):
kernel.cpp
Code:
void start_kernel() {
// ...
}
Code:
call start_kernel ; boot-loader loop: jmp loop times 510-($-$$) db 0 ;magic number dw 0xaa55
Habe auch einiges über das "linking" gelesen, allerdings meist spezifisch
für andere vorgefertigte Bootloader wie grub oder mit Verwendung von Linux oder windows...
Also meine gründsätzliche Frage ist nun:
Man muss doch sicherlich die c++ funktion irgendwo aus dem Speicher herraus über Assembler ansprechen oder? Wie genau klappt das, bzw erfolgt das nicht bei der compilierung der asm Datei oder beim Linking? Wie genau dieses Linking funktioniert weiß ich teilweise..zu mindestens wie ich mit gcc eine C++ "linke"... :S
Ich trete seit 2 Tagen nun einfach nur noch auf einem Punkt herum und komm nicht wirklich dahinter, wie ich nun vorgehen muss... Kann mir also evt. jemand sagen wie ich "möglichst primitiv" über Assembler x86_64 eine C++ Funktion ansprechen kann? Dabei ist zu beachten das das aufzurufende Assemblerscript gleichzeitig der Bootloader ist. Das ich in C++ dann sowas wie iostream oder fstream nicht verwenden kann ist mir bereits klar. Trotzdem ist es wenigstens lesbarere Code als Assembler. Denke auch das ein Kernel bzw OS in C++ deutlich schneller zu programmieren ist als eins mit Assembler :D
Hoffe mir kann dabei vielleicht jemand helfen.
Und bitte tut mir einen Gefallen, bevor ihr mir Links zu Google-Seiten schickt.
Lest sie euch bitte selber erst kurz durch ob das zu dieser Problematik passt.
Denn ich habe schon mehrere hundert Seiten offen gehabt :)
Eine Titelseite zu einem Problem sagt diesbezüglich leider meist wenig aus.
lg, frohe Weihnachten und schon mal frohes West.
Ist ja nicht mehr lang .. :handsdown: