Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Ein Stück ASM-Code an bestimmter Stelle in FB...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 08.01.2009, 06:36    Titel: Ein Stück ASM-Code an bestimmter Stelle in FB... Antworten mit Zitat

Hi,
ich arbeite ja seit längerer Zeit an meinem Kernel namens FROST (http://frostkernel.sourceforge.net). Bis zur Version 0.1.3 war der Kernel noch klein genug, das GRUB es nicht interessierte wo der Multiboot-Header steht. Jetzt ist er aber so groß geworden, das GRUB den Multiboot-Header nicht mehr findet. Wenn ich aber den Teil ASM-Code an den Anfang stelle, steht er in der Ausgabedatei hinter den ganzen Funktionen, und damit wieder zu weit hinten. Im Moment helfe ich mir damit, das ich den ASM-source erzeugen lasse und den Multiboot-Header per Hand an den Anfang befördere. Das ist mir auf Dauer aber ein bisschen zu umständlich, daher suche ich eine Möglichkeit, wie ich FBC mitteilen kann, das dieses Stück ASM-Code ganz an den Anfang soll.

Vielen Dank für Antworten.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 08.01.2009, 20:23    Titel: Antworten mit Zitat

Ich würde den FB-Teil nur compilieren lassen (-c Switch) und den Linker selbst aufrufen. Damit kannst du dir sicher sein, dass Multiboot-Header auch wirklich in den ersten 8KB liegt. Makefile o.ä. würde sich hier anbieten.
Ein sprachliches Konstrukt fällt mir jetzt nicht ein.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 08.01.2009, 21:29    Titel: Antworten mit Zitat

Hi,
@Mao, ich glaube das macht er schon
buildFROST.sh hat Folgendes geschrieben:
echo "compiling kernel..."
fbc -c FROSTmain.bas
echo "linking kernel..."
ld -Ttext=0x100000 FROSTmain.o -melf_i386 -o frost.krn
echo "done."

Aber ich werde auch nicht klug daraus was da passiert?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 09.01.2009, 19:53    Titel: Antworten mit Zitat

Naja, dann hat er doch kein Problem mehr. Die Multiboot-Structure in eine externe Assembler-Datei einsiedeln und dem Linker als erste Datei übergeben. Die Datei, in der der Multiboot-Header steht kann er ja dann gleich mit als Pre-Boot-Loader verwenden, der zumindest den FB-Part callt. Von da aus dann alles wie gehabt.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 13.01.2009, 12:40    Titel: Antworten mit Zitat

ok, erstmal vielen Dank.
Mein Problem ist jetzt: Was muss ich genau machen um den FB-Teil von der andern Datei aus zu callen? Meine Versuche mit "extern" haben nicht funktioniert.

@volta: Der Kernel wird von FBC kompiliert (-c parameter), die enstandene FROSTmain.o wird dann im 32bit-elf format gelinkt und die enstandene Datei ist frost.krn. das "-Ttext=0x100000" brauch ich, soweit ich weis, weil GRUB den Kernel ab 1MB ablegt.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 13.01.2009, 16:33    Titel: Antworten mit Zitat

Habe das nie mit FB versucht, wenn ich mir aber das vom FBC erzeugte Assembler-Listing anschaue würd ich meinen, nicht anders als wenn du deinen Kernel in C schreibst.
_main als extern bekannt geben und callen. NASM?
Code:

extern _main
call _main


sts hat Folgendes geschrieben:

das "-Ttext=0x100000" brauch ich, soweit ich weis, weil GRUB den Kernel ab 1MB ablegt.

Wohin dein Kernel-Image geladen werden soll, bestimmst du im Multiboot Header. 1MB bietet sich da natürlich an, da du dann erstmal aus dem unteren Speicherbereich raus bist - wo vielleicht noch was liegen könnte, was für dich von Interesse ist (ich weiß gar nicht mehr, wo GRUB z.B. die Multiboot Information Struktur ablegt). Auf langfristige Sicht solltest du - sofern möglich - zumindest einen Teil der unteren 16MB freilassen, da der DMA-Controller nur mit physikalischen Speicheradressen in den ersten 16MB umgehen kann.
Mit "-Ttext=0x100000" sagst du dem Linker (vermute, ld?), wo dein "Programm" später hingeladen wird. Du arbeitest zum Ladezeitpunkt des Kernels schließlich noch nicht mit virtuellen Adressen, der Linker muss also dafür sorgen, dass alle relevanten Pointer im Programm richtig "umgebogen" werden.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 14.01.2009, 11:53    Titel: Antworten mit Zitat

du kannst das eindeuting besser erklären als ich happy
muss ich in der FB-datei noch etwas einfügen oder reicht das? Weißt du auch wie das lauten muss wenn ich den GNU assembler benutze (wie FB)?
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 14.01.2009, 15:30    Titel: Antworten mit Zitat

Gesondert etwas einfügen müsstest du, wenn ich das mal von C nach FB adaptiere, nicht. Die Main-Funktion ist in FB einfach das, was so im Code steht, also außerhalb jeglicher Subs und Functions. Du könntest dort also sofort loslegen. Natürlich beachten, dass du dir auch selbst einen passenden Ersatz für die FBRTL schreiben müsstest, aber ich denk mal, das weißt du schon.
Mit as hab ich mich nicht wirklich beschäftigt, aber laut Manual gibts dort ein extern so nicht. Das heißt, es gibt zwar die Direktive ".extern", befindet sich allerdings nur aus Kompatibilitätsgründen drin. as sollte alle undefinierten Symbole als extern behandeln. Müsstest also nur _main callen.

Quelle: http://sources.redhat.com/binutils/docs-2.12/as.info/Extern.html#Extern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 15.01.2009, 11:50    Titel: Antworten mit Zitat

hm, das macht er bei mir nicht. wenigstens weiß ich jetzt das ich mir das .extern sparen kann. Dann werd ich wohl NASM nutzen.
Vielen Dank!
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 16.01.2009, 12:43    Titel: Antworten mit Zitat

so, ich hab rausgefunden, warum deine lösung bei mir nicht klappt: Wenn man dem linker mit extern mitteilt, das er das symbol in einer anderen datei suchen muss, muss diese datei das symbol dann mit global definieren. Wenn ich genau das mit "ASM - .global fb_ctor__FROSTmain - END ASM" mache, rutscht aber das .global wieder zu weit nach unten (d.h. das symbol wird schon verwendet ist aber noch nicht global) und somit habe ich das gleiche problem wieder.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 16.01.2009, 18:10    Titel: Antworten mit Zitat

Hm, dann könntest du evtl. ein kleines bisschen rumtricksen, indem du den FBC das Assembler-File ausspucken lässt (-r), dir ein kleines Programm schreibst, das im Build-Prozess nach dem Compilieren main im ASM-Code als global definiert und das dann nochmal durch den Assembler schicken. Was weniger umständliches fällt mir ehrlich gesagt im Moment nicht ein.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 22.01.2009, 12:16    Titel: Antworten mit Zitat

dann werd ich das wohl so machen. Auch wenn ich hoffe das die FB-Entwickler noch was einbauen, damit das bequemer geht lächeln
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz