Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: scales of justice am 22. July 2006, 15:48
-
diesmal hab ich ein wirklich merkwürdiges Problem mit dem A20-Gate:
wenn ich einfach nur das A20-Gate aktiviere, funktioniert alles so wie es soll
wenn ich aber bevor ich das A20-Gate aktiviere das Bios Interrupt 13h benutz (im Code mit "Todesint" gekennzeichnet),
um den Kernel zu laden, funktioniert die A20-Gate Aktivierung nicht mehr,
dann landet er während der Aktivierung an der mit "Endlosschleife" makierten Stelle in einer Endlosschleife
ich versteh nicht was es für einen Unterschied macht, dass ich davor den Kernel an 0x1000:0x0000 lade,
das kann doch dem A20-Gate egal sein
vielleicht hat jemand von euch ne Idee,
hier der Code:
http://scalesofjustice.sc.funpic.de/boot.txt
ich assembliers einfach direkt mit nasm zu einem flat binary image,
fülle das bis es so groß wie eine diskette ist mit nullen, und starts
auf Bochs und Qemu läuft das ganze übrigens problemlos,
nur auf VMware und einem echten Pc klappts nicht
(hängt wohl irgendwie damit zusammen, dass bei Bochs und Qemu das A20-Gate von anfang aktiviert ist)
-
1.) Da fehlt ein sti. Ich bin mir da gerade nicht sicher (ist schon ein Weilchen her bei mir), aber ohne das Ding wirst du glaub ich überhaupt keine Interrupts so, wie du sie haben möchtest durchbringen.
2.) Manche BIOSE laden dich nach 0x07C0:0x0000, andere nach 0x0000:0x7C00, das ist ein nicht zu unterschätzender Unterschied, verlass dich am Anfang lieber auf gar nichts und setz den Stack explizit dahin, wo du ihn haben möchtest.
-
1) deaktiviert cli auch die Bios Interrupts?
ich hab das nämlich absichtlich ausgelassen weil ich im Pmode ja noch keine Interrupts eingerichtet hab,
das würde ja dann beim ersten Interrupt im Chaos enden
2) Manche BIOSE laden dich nach 0x07C0:0x0000
wie macht man das denn dann am besten?
einfach am anfang "jmp 0x0000:0x7c00" ?
-
Ja CLI deaktiviert alle Ints und ja im PM würde ich diese zuerst mal sperren.
-
1) ich hab jetzt sti unter die initalisierung von den Segmentregistern geschrieben,
aber das Ergebnis ist immernoch das Gleiche
2) gut ich hab jetzt "jmp 0x0000:0x7c05 an den Anfang geschrieben, das läuft auf Qemu und Bochs auch wie gehabt,
nur auf Vmware und echten Pcs gehts immernoch nicht :?
(+5 übrigens weil der Befehl 5 Bytes lang ist, sonst wirds ja ne Endlosschleife)
ich hab jetzt den neuen Code hochgeladen:
http://scalesofjustice.sc.funpic.de/boot.txt
-
okay jetzt hab ich den Fehler:
während dem Diskettenlesen müssen Interrupts aktiviert sein,
wahrscheinlich macht das Bios das per IRQ
beim Aktivieren des A20-Gates müssen Interrupts deaktiviert sein,
keine Ahnugn warum, aber sonst gehts nicht
-
Hm, komisch - ich aktiviere A20 mit aktiven Interrupts und das geht sowohl mit Bochs als auch auf echten PCs gut.
-
wahrscheinlich benutzt du ne andere Variante um das zu aktivieren, gibt ja genug
-
Hab mir deinen Code zwar nicht anschauen können, dar er schon verschwunden ist. Aber wieso ein jmp 07C0:0005 ?. Das brauchst du nicht zu machen. Du brauchst nur die Datensegmentregister auf Null setzen und ss z.B. auf Null und sp auf 7C00h. Es ist doch sowas von egal ob du in 0000:7C00 oder 07C0:0000 bist. Da ist nur CS und IP anders. Wenn du ein org 7C00h an deinem Code setzt, musst du die Datensegmente auf Null setzen. Wenn du ein org 0 verwendest musst du die Datensegmente auf 7C0h setzen. CS und IP ist aber ganz egal.
bitmaster
-
aber ich schreib doch org 7c00 an den anfang,
also muss ich die Segmentregister alle auf 0 setzen,
da CS aber nun entweder 0 (0x0000:0x7c00), oder 7c0 (0x07c0:0x0000) ist,
muss ich auch CS auf 0 stellen, um sicher zu sein dass es auf 0 ist
wie soll das ohne jmp 0x0000:0x7c05 gehen?
-
Der Wert von CS und IP ist egal, solange du keine absoluten Sprünge (z.B. Far-Jumps oder indirekte Jumps) machst.
Genauso wäre der Wert von DS egal, wenn du nicht auf den Speicher zugreifen würdest.
-
Der Wert von CS und IP ist egal, solange du keine absoluten Sprünge (z.B. Far-Jumps oder indirekte Jumps) machst.
Hä? Wieso soll es dann nicht mehr egal sein? Ein near (und short) jump überspringt doch nur Bytes. Und bei einem far jump ist cs sowieso egal, da es geändert wird. Weiß jetzt nicht was du meinst. CS könnte beim kopieren evt. wichtig sein. Wenn du mov [cs:Byte(s)],Wert machst. Wenn cs dann unterschiedlich ist, kopiert der falsch. Aber wieso cs beim kopieren benutzen wenn es ds, es, fs und gs gibt?
bitmaster
-
Ups, bei Far-Jumps hab ich an Interrupt Handler gedacht. Hätte ich vielleicht hinschreiben sollen ;) Wenn man da einfach ein unbekanntes cs als Segment reinschreibt, gibts Probleme.
Von relativen Sprüngen (near und short) war nicht die Rede. Und bei dem Rest deines Post denke ich mal, dass wir sind gerade Zeugen eines Stream of Consciousness geworden sind. ;)
-
Und bei dem Rest deines Post denke ich mal, dass wir sind gerade Zeugen eines Stream of Consciousness geworden sind.
Was meinst du damit?
bitmaster
-
Das bei deinen Ausführungen sowiso keiner mehr nachkommt....Aber egal
-
Ich meine damit, dass du anscheinend deine Gedanken niedergeschrieben hast so wie sie dir in den Kopf gekommen sind, und dass sie bei weiterem Überlegen eigentlich nichts mit der Sache zu tun haben.
-
Wieso soll das damit nichts zu tun haben?
mov word [cs:Hallo],1
...
Hallo dw 0
Dies kopiert den Wert 1 nach cs:Hallo. Sagen wir Hallo ist an Adresse 72. Dann wäre cs*16+72 die Adresse. Also würde der Wert von cs berücksichtigt werden. Und wenn dieser bei einigen PCs anders ist als bei wieder anderen, würde das bedeuten: *nichtsmitfunktionieren*
cs=7C0h = 7C0h*16+72 = 1984*16+72 = 31816 = 7C48h
cs=NULL = 0*16+72 = 72 = 48h
48h ist doch eine andere Adresse als 7C48h, stimmts?
Oder habe ich da was durcheinander gebracht?
bitmaster
-
Oder habe ich da was durcheinander gebracht?
Eigentlich nicht... seh ich zumindest so.
-
Ich wollte nicht sagen, dass eine deiner Aussagen falsch ist, sondern ich habe mich lediglich darüber gewundert, warum du Near- und Short-Jumps, sowie die Nutzung der Segment Overrides ansprichst.