Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: scales of justice am 22. July 2006, 15:48

Titel: merkwürdiges Problem mit A20-Gate
Beitrag 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)
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Thoth am 23. July 2006, 00:18
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.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: scales of justice am 23. July 2006, 10:40
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)
Zitat
Manche BIOSE laden dich nach 0x07C0:0x0000


wie macht man das denn dann am besten?
einfach am anfang "jmp 0x0000:0x7c00" ?
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: nooooooooos am 23. July 2006, 10:52
Ja CLI deaktiviert alle Ints und ja im PM würde ich diese zuerst mal sperren.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: scales of justice am 23. July 2006, 10:54
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: scales of justice am 23. July 2006, 12:00
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Thoth am 23. July 2006, 14:01
Hm, komisch - ich aktiviere A20 mit aktiven Interrupts und das geht sowohl mit Bochs als auch auf echten PCs gut.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: scales of justice am 23. July 2006, 16:31
wahrscheinlich benutzt du ne andere Variante um das zu aktivieren, gibt ja genug
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: bitmaster am 24. July 2006, 11:03
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: scales of justice am 24. July 2006, 13:44
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?
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Jidder am 24. July 2006, 14:08
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.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: bitmaster am 24. July 2006, 16:43
Zitat von: PorkChicken
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Jidder am 24. July 2006, 17:14
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. ;)
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: bitmaster am 24. July 2006, 18:00
Zitat
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: nooooooooos am 24. July 2006, 18:06
Das bei deinen Ausführungen sowiso keiner mehr nachkommt....Aber egal
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Jidder am 24. July 2006, 18:20
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.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: bitmaster am 24. July 2006, 18:55
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
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: bluecode am 24. July 2006, 19:08
Zitat von: bitmaster
Oder habe ich da was durcheinander gebracht?

Eigentlich nicht... seh ich zumindest so.
Titel: merkwürdiges Problem mit A20-Gate
Beitrag von: Jidder am 24. July 2006, 20:48
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.