Autor Thema: Wer hat hier den Bug  (Gelesen 4979 mal)

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« am: 15. August 2005, 00:44 »
Ich werd hier nochmal wahnsinnig^^
Folgendes Problem: Mein Bootloader prüft ob n 80386er vorhanden ist, lädt den Kernel in den speicher und startet ihn. nebenbei werden ein paar bildschirmausgaben getätigt (über den int 0x10, funk. 0x0E).
aber als der bootloader nach und nach immer noch ein wenig mehr code bekommen hat, hat irgendwann begonnen, die stringausgabefunktion zu streiken. ich hab den code überprüft, es liegt NICHT am code, da bin ich mir zu 99.periode9% sicher.
die stringausgabefunktion steht ganz hinten im bootloader, hinter ihr stehen nur noch ein paar strings.
also wie gesagt, die stringausgabefunktion hat entweder gestreikt, also einfach den auszugebenden string abgeschnitten oder ein paar zeichen buchstabenmüll ausgegeben.
ich hab das von NASM erzeugte image überprüft, alles richtig. ich habe die diskette mit winhex angeschaut, alles ordentlich. ich habe das os auf 2 anderen PCs laufen lassen, auch dort nur zeichenmüll. in bochs natürlich genauso.

dann habe die stringausgabefunktion an eine andere stelle im code verschoben. dann ging der code der nun an der stelle war nicht mehr.

da witzige: vor ein paar jahren habe ich schonmal nen bootloader geschrieben bei dem ich das gleiche problem hatte, allerdings auf nem anderen rechner, mit ner anderen diskette, mit nem anderen prozessor, und anderem code.

also, woran könnte das liegen ?!?! das ist doch net normal dass einfach mein code nicht mehr richtig funzt, wenn er in einem bestimmten bereich liegt!!
ich schätze dass dieser bereich ca. 20 bytes oder so groß ist.

ich weiß, mein text ^ ist net so einfach zu verstehen aber ich weiß auch net so recht wie ich dieses dämliche problem beschreiben soll...

und hier natürlich der code (einfach ne floppy einlegen und compile.bat aufrufen): www.icc-software.de/files/asm/BlitzOS.zip
In meinem Code reißt die Stringausgabe nach dem wort "Protected" ab.
Die Strings werden über &include "LNG\boot.asm" eingebunden.

bitte, nehmt euch kurz zeit und ne diskette um euch das problem anzusehen!

das ist alles andere als normal und ich bin garantiert nicht der einzige mit so einem problem.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 15. August 2005, 10:51 »
Du musst evt. beachten, das der Bootloader nur 512 Byte groß sein kann. Wenn dein Bootloader größer ist, musst du in den ersten 512 Bytes noch den Rest des Bootloaders laden.

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #2 am: 15. August 2005, 11:35 »
Nur so eine kleine Randbemerkung *besserwisserisch sein muss*: In der Mathematik ist 99.periode9 gleich 100. Wenn du also eine Zahl hinter dem Komma Periode Null hat kannst du die Periode weglassen und 1 hinzu zählen :?

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. August 2005, 15:21 »
stack.
DER STACK, NATÜRLICH!!
Danke blueXseven, daran lag es. :D
Das erklärt natürlich einiges...

@SSJ7Gohan: Is klar, so der totale n00b bin ich nun auch net :wink:
@jeb: öh...ja kann sein. :P


€dit:
Bitte, kann mir jemand kurz eine Auskunft geben, in welcher Reihenfolge mein Kernel die unterschiedlichen Sachen ausführen soll;

-A20 enablen
-PM (GDT, IDT)
-PIC programmieren
-interrupts einschalten
usw.

weil das verträgt sich noch net so

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #4 am: 15. August 2005, 21:07 »
erstens einmal es gibt keine PERFEKTE reihenfolge...

aber ich würds so machen:

1. a20
2. kernel laden
3. gdt
4. pmode
5. pic
6. idt
7. timer
8. kbd
-> minimaler standard kernel

(siehe bKernDev)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. August 2005, 08:26 »
Er will ja den Kernel an eine Addresse über der 1 MB Marke laden ;)
Deshalb braucht er einen FDC Treiber und schaltet zuerst in den PMode und läd danach den Kernel wenn ich das richtig verstanden habe^^

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #6 am: 16. August 2005, 09:18 »
Wenn der Kernel nicht zu gross ist, kann man den ja im Rmode irgendwo unter der 1MB Marke hinladen, und dann im Pmode hochkopieren, aber dann könnte man den auch fast direkt unter die 1MB Grenze laden.
*post*

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 16. August 2005, 10:55 »
mensch das is ja net alles so einfach hier^^

ich hab meinen kernel gestern (bze. heut nacht *g*) auf C umgeschrieben. nun ist das alles sehr viel bequemer. der bootloader lädt den kernel-entrypoint, da wird auf PM umgeschaltet und dann wird die kontrolle an den C-Kernel abgegeben.

Frage (das lohnt nicht extra nen Thread dazu aufzumachen): Wie kann ich externe Assemblerprogramme in C-Code benutzen? Also kein Inline ASM..

wie muss ich die ganze geschichte linken, wo kommt was hin, bin leider noch nicht so ganz super mit C vertraut.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 16. August 2005, 11:02 »
Du kannst sie direkt aus C aufrufen. Beachte jedoch, dass C Funktionen unter Windows immer mit einem Unterstrich beginnen:

Beispiel:
Asm Code
[global _do_something]
_do_something:
ret


C Code:
//Funktionsdeklaration:
void do_something();

void main() {
do_something();
}

Der GCC erwartet die Rückgabe einer Funktion in EAX, falls du also einen Wert zurück gibst, kannst du sowas verwenden:
[global _sample]
_sample:
mov eax, 5
ret


// C Code
unsigned long sample();
unsigned long x = sample(); // in x steht jetzt 5


Die Objektfiles erstellst du einfach mit:
nasm -f elf -o objektfile.o sourcefile.c
Für elf musst du natürlich ein anderes Format einsetzen, wenn du ein anderes nutzen willst.

Du linkst die Assemblerobjektdatei dann einfach zu den C Dateien hinzu und fertig:
ld -o executeable.bin assemblerobjekt.o cobjekt.o [... andere Linkerflags]

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 16. August 2005, 11:19 »
hey danke!
gleich mal ausprobieren

muss ich da nix pushen oder poppen in meinen ASM subroutinen ? hab mal irgendwo gelesen dass man noch DS, BP und SP POPen muss oder so.
naja

edit: kann ich auch labels aus meinem asm-code public machen (oder wie das heißt)? also dass ich z.B. in meiner asm-datei
Text db "Hallo", 0
schreibe und Text dann auch im C-prog benutzen kann.
wie würde sowas funktionieren ?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 16. August 2005, 11:54 »
Zitat von: ICC
muss ich da nix pushen oder poppen in meinen ASM subroutinen ? hab mal irgendwo gelesen dass man noch DS, BP und SP POPen muss oder so.


du musst alle register, die du änderst, sichern (PUSHen/POPen). ausnahmen gibt es je nach compiler. (e)ax und (e)dx kannst du fast überall ohne sichern ändern, weil die für rückgabewerte genutzt werden. ecx kannst du unter dem gcc auch ohne sichern ändern. die register eax, edx und ecx werden beim gcc auch "caller save" genannt. ebx, ebp, esi und edi sind hingegen sogenannte "callee save" registers. das heisst, wenn du sie in deiner assemblerfunktion änderst, _musst_ du sie vorher sichern und danach wiederherstellen.


Zitat von: ICC
edit: kann ich auch labels aus meinem asm-code public machen (oder wie das heißt)? also dass ich z.B. in meiner asm-datei
Text db "Hallo", 0
schreibe und Text dann auch im C-prog benutzen kann.
wie würde sowas funktionieren ?

es kommt auf die plattform an, unter der du dein system compilierst.

unter windows/dos:
global _Text
_Text db "Hallo", 0


andere systeme (linux und andere *nix):
global Text
Text db "Hallo", 0
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen