Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Paul am 12. August 2005, 14:12
-
Moin,
nach langer Zeit hab ich wieder mein OS rausgekramt um daran weiter zu machen. Aber nun soll das ganze endlich im PMode laufen. Tut es aber nicht.
Ich habe den Code aus dem PM Tuto als Kernel genommen, der auszuführende Code nachdem in den PM geschaltet werden soll ist einfach nur JMP $. Bochs liefert mir aber immer diesen Fehler:
prefetch: getHostMemAddr vetoed direct read, pAddr=0x000a0000
Habt ihr ne Ahnung was ich falsch mache ? Der Kernelcode ist 1:1 die Kernel16.asm - File aus dem Tut.
Irgendwie hab ich bislang noch kein Glück mit den PM Geschichten gehabt :(
-
Ich würde sagen Speicherschutzfehler.
-
aha. das hilft mir jetzt net wirklich weiter. ich mein ich hab den code 1:1 übernommen. woran liegt es dass es net funzt ?
-
check mal die konfigurationsdatei von bochs und schau da mal ob du das für die größe des speichers was korrektes angegeben hast. oder nimm gleich eine fertige config. war da keine bei dem tutorial bei?
-
Hast du alles übernommen?
-
Beim Tuto war keine Config dabei. Glaube auch nicht dass es daran liegt, wenn ich die Disk ins Laufwerk lege und neu starte lädt er kurz meinen Bootloader, gibt irgendeinen Müll auf dem Bildschirm aus und startet wieder neu.
@joachim_neu: Ja.
-
Mensch nu lasst einen armen verwahrlosten Coder doch net so hängen :cry: :wink:
Der Bootloader lädt den Kernel an 0x0190 in den Speicher. Der Kernel prüft dann nur noch schnell ob ein 386 vorhanden ist, aktiviert A20 und dann kommt der PM ins Spiel (soll er zumindest :( )
-
Sag mal, hast du auch schon eine IDT? Sonst kannst du mit PM ja nicht viel anfangen, außer vielleicht dem UnReal Mode...
Ansonsten ist es nicht mehr schwer:
- Interrupts disablen
- GDT laden
- Bit 0 in CR0 setzen
- FAR-Jump mit dem Code-Deskriptor
- DS, ES, FS, GS mit Daten-Deskriptor laden
Da du die GDT schon stehen hast, sollte das kein großes Problem sein. Hoffe ich zumindest - ich drück dir die Daumen!
-
Moin, erstmal danke für die Tips, jetzt funktioniert es.
Aber nur wenn ich es direkt im Bootloader mache. Hat jemand ne Ahnung warum ? Weil jetzt weiß ich net weiter, wie ich den Kernel laden soll, so ganz ohne Interrupts :P und ich glaub für nen Floppydrive is der bootsektor n bissel zu klein, oder ?!
achja es gab mal so ne seite, hab leider vergessen wie die heißt, die war ziemlich farbenfroh, da gabs so linuxkram und ein paar tutos wie man z.B. nen floppydriver schreibt. weiß evtl. wer welche seite ich meine ? kann er mir den link dafür geben ?
-
Ganz einfach, indem man den Kernel läd, bevor man die Interrupts ausschaltet.
-
hmm aber ich wollte den kernel gerne überhalb bzw. genau auf die 1MB-Marke laden. irgendwelche vorschläge ?
-
Naja, dazu wirst du wohl einen Floppy Treiber brauchen.
Mein üblicher Vorschlag wäre es, GRUB zu benutzen :D
-
näääh wenn schon denn schon :P
mh ich weiß dass hier im forum mal die adresse einer website gepostet wurde wo was über FDD controller und dessen programmierung etc. stand. hat keiner ne ahnung welche seite ich meine ?! ich hab meinen pc formatiert, daher mussten die meisten links aus meiner liste weichen
-
http://www.lowlevel.brainsware.org/forum/viewtopic.php?t=778&highlight=fdc
Da findest du FDC Tutorials^^
-
rofl ey da will man mal nen FDC treiber coden und dann pisst sich NASM bereits bei den OUT-Befehlen an:
;general FDC setup
out 0x3F2, 00000000b ;floppy drive A:
out 0x3F7, 0x00 ;1.44" floppy disk
;read sector
out 0x3F5, 01010110b ;command: read sector; read, MFM
out 0x3F5, 00000000b ;floppy drive A:
mov al, byte [Track]
out 0x3F5, al ;track
mov al, byte [Head]
out 0x3F5, al ;head
mov al, byte [Sector]
out 0x3F5, al ;sector
out 0x3F5, 2 ;sector size = 128 * 2² = 512
out 0x3F5, 18 ;sectors per track
out 0x3F5, 0x1B ;GAP3 length
out 0x3F5, 0xFF ;unused
argh!
ERROR: invalid combination of opcode and operand
heut klappt ech garnix :-({|=
-
der Out-Befehl kann nur dann direkt mit Portadressen gefüttert werden, wenn diese innerhalb der 0 - 255 liegen. Wenn du Ports darüber ansprichst, musst du die Portadresse in DX laden und dann DX im out-Befehl angeben.
-
ja, das kam mir nach dem studieren der NASM referenz auch in den sinn ;) danke, jetzt funzt der code. das FDD reagiert, mal sehen ob ich nun meine sektoren ausgelesen bekomme. ich meld mich wieder wenns klappt.
werd mich mal kurz in den DMA kram einarbeiten dann sehen wa weiter
-
näääh wenn schon denn schon :P
Nimm's mir nicht übel, aber du solltest prüfen, wo das Problem genau liegt. Ich schalte meinen PM erst im Kernel ein, weil ich im Bootsektor FAT12 unterstütze, um "ganz normale" Disketten verwenden zu können. Und es macht auch sehr viel mehr Sinn, dem PM erst im Kernel zu verwenden!
Gruß!
-
kein problem, genau so wollte ich es ja auch machen. aber der exakt gleiche pm code funzt im bootloader, aber nicht im kernel. und um das problem rauszufinden poste ich ja hier :roll:
€dit: alter!!! ich habs doch tatsächlich geschafft nen floppydriver zu schreiben! DMA umd FDC kram sind garnet mal so schwer wie ich gedacht habe. also erstmal danke für eure hilfe, ich denke jetzt kommt mein projekt wieder etwas voran!
*cheers*
-
HA!!!
Ich weiß jetzt warum ich im Kernel nicht in den PM wechseln konnte.
Ich habe die Segentregister DS, ES etc. an CS angeglichen. Aber die sind dem PM-Loader egal, ich muss DS, ES etc. auf 0 setzen und den Kram per ORG regeln.
Nun gehts! \:D/
-
Du solltest die Segmentregister DS, ES, FS und GS auf den Datendescriptor in der GDT setzen und CS per far jump auf den Codesegmentdescriptor.
Wenn du alle Segmentregister auf 0 setzt, kannst du keine Daten mehr Addressieren.
-
das ist klar.. :roll:
ich rede von VOR dem initialisieren des PM