Autor Thema: merkwürdiges Problem mit A20-Gate  (Gelesen 9634 mal)

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« 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)

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #1 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.
Madness isn't a bug - it's a feature

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #2 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" ?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. July 2006, 10:52 »
Ja CLI deaktiviert alle Ints und ja im PM würde ich diese zuerst mal sperren.

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #4 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

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #5 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

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #6 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.
Madness isn't a bug - it's a feature

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. July 2006, 16:31 »
wahrscheinlich benutzt du ne andere Variante um das zu aktivieren, gibt ja genug

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 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
In the Future everyone will need OS-64!!!

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #9 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?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #10 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.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 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
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 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. ;)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 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
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 24. July 2006, 18:06 »
Das bei deinen Ausführungen sowiso keiner mehr nachkommt....Aber egal

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 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.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 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
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #17 am: 24. July 2006, 19:08 »
Zitat von: bitmaster
Oder habe ich da was durcheinander gebracht?

Eigentlich nicht... seh ich zumindest so.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #18 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.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen