Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cool-Andy am 11. November 2009, 16:04
-
Hi!
Ich wollte grade bei meinem OS eine Art Floppytreiber einbauen. Da habe ich mir gedacht, warum springt man eigentlich nicht in den Real Mode zurück, benutzt den Floppy-Interrupt springt in den PM zurück, und springt dann in die jeweilige RAM-Adresse?
Könntet ihr mir sagen, wie ich vom PM in den RM komme, anders rum kenn ich es ja!
Vielen Dank schon mal im Vorraus! 8-)
-
Geht das überhaupt andersherum? Aber das würde dir auch nichts bringen, dann müsstest du ja alles, was du im PM gemacht hast, weckwerfen. Stichwort: Speichermanager, Multitasking
-
Das geht.
1. der Einfachheit halber an eine Adresse < 0xffff springen (eigentliche Anforderungen: Code muss identity gemappt sein, und du darfst mit den Segmentdeskriptoren bzw. -basen nicht durcheinanderkommen.)
2. Paging deaktivieren (bit 31 in cr0 löschen)
3. IDT laden mit Basis 0, Limit 1023
4. 16 Bit Code/Daten Segmente in alle Segmentregister laden (Basis 0, wenn du in den ersten 64 KB bist)
5. Protected Mode deaktivieren (bit 0 in cr0 löschen)
Das ganze natürlich bei deaktivierten Interrupts.
Ich hoffe ich hab nix vergessen^^
-
In einen PM-Diskettentreiber würde ich das aber nicht einbauen. Da lohnt es sich dann, über vm86 nachzudenken.
-
OK,
ich glaub ich überlege mir doch noch mal einen Diskettentreiber zu schreiben. :-D
Könntet ihr vielleicht so einen Ablauf wie PorkChicken es gemacht hat posten?
Es würde mir wirklich eine große Hilfe sein.
EDIT: Ich habe mal den Titel geändert. :wink:
-
Ich hab vor Ewigkeiten mal einen Code dafür geschrieben. Der macht einige Sachen etwas zu kompliziert, und ich hoffe der wirkt abschreckend.
http://jidder.de/stuff/asm-execute-rm-int-from-pm.html <--- nicht klicken, nicht lesen, nicht kopieren, UND NICHT FRAGEN WENN DER NICHT FUNKTIONIERT
Ich beantworte dazu keine Fragen. Kein Witz.
Edit: Willst du eigentlich einen Diskettentreiber oder dich mit esoterischem Code rumschlagen?
-
Hu! :? :? :? :? :? :? :? :? :? :?
Ich versteh nur Bahnhof!
Edit: Willst du eigentlich einen Diskettentreiber oder dich mit esoterischem Code rumschlagen?
Eigentlich wollte ich den schon selber schreiben (deshalb esoterischer Code).
Wenn jemand aber zufällig einen rumliegen hat (am Besten in C :-D) nehme ich den natürlich gerne! :wink:
-
Ich glaub es ging eher darum dass diese Art von "Treiber" als esoterischer Code zu bezeichnen ist, Weniger dass was dabei rumkommt wenn du selber einen schreibst.
Fertige Floppytreiber gibt es z.b. bei tyndur, afaik sogar einen als CDI ;)
-
Dann schreibst du am besten einfach einen Diskettentreiber statt dich mit dem Real Mode herumzuschlagen. ;)
CDI hat auch einen, falls du was vorgefertigtes nehmen willst. Aber ich bin mir nicht sicher, ob deine libc dazu weit genug ist.
-
Ach, du wolltest so eine 5-Punkte-Liste für einen Diskettentreiber? Da hab ich dich falsch verstanden.
Auf jeden Fall existiert so eine Liste nicht ^^
-
Falls euch noch was dazu einfällt - bitte hier posten! Ich probier mich jetzt mal ein bisschen an so einem Diskettentreiber rum! :mrgreen:
-
OK,
ich habe jetzt ein bisschen rum gegoogelt und mich in der Wiki umgeschaut. Für was welches Register was ist weiß ich ja jetzt, und ansprechen kann ich die auch.
Aber: Ich will das ohne DMA machen, also direkt über Ports.
Könntet ihr mir erklären wie ich das initalisiere?
Ich blicks grade gar nicht! :?
-
Ich hab vor Ewigkeiten mal einen Code dafür geschrieben. Der macht einige Sachen etwas zu kompliziert, und ich hoffe der wirkt abschreckend.
http://jidder.de/stuff/asm-execute-rm-int-from-pm.html <--- nicht klicken, nicht lesen, nicht kopieren, UND NICHT FRAGEN WENN DER NICHT FUNKTIONIERT
Ich beantworte dazu keine Fragen. Kein Witz.
Edit: Willst du eigentlich einen Diskettentreiber oder dich mit esoterischem Code rumschlagen?
So etwas wollte ich auch mal schreiben. *g*
Aufgrund des unnützen Aufwands habe ich das aber dann gelassen (es gibt ja den virtual mode). :D
-
Hat den keiner eine Idee? :?
-
Korrigiert mich wenn ich falsch liege, aber ist DMA nicht nur quasi eine optimierte Variante von in/out? Demnach müsstest du alles was du via DMA an daten rausschickst auch via in/out liefern können.
Ist aber nicht zu empfehlen - die CPU-Last die dabei entsteht ist beachtlich. Bei Floppys zwar noch fast vernachlässigbar, aber spätestens für Platten machst du dir das System so unbenutzbar.
-
Ok,
könnte mir jemand dann erklären, wie ich das mit DMA mache?
Es kommt jetzt vielleicht ein bisschen doof rüber, aber irgendwie versteh ich weder den Wiki-Artikel, noch mit Google gefundene Seiten.
-
Ok,
könnte mir jemand dann erklären, wie ich das mit DMA mache?
Es kommt jetzt vielleicht ein bisschen doof rüber, aber irgendwie versteh ich weder den Wiki-Artikel, noch mit Google gefundene Seiten.
Naja es geht ja gerade mal "nur" um das Diskettenlaufwerk. Ich denke in so einer frühen Phase sollte man zusehen dass man sich durch den Stoff durchboxt. Ich musste auch ca. ne Woche lang den Paging Artikel (und externe Quellen) anstarren, bis ich das soweit verstanden hatte, dass ich es programmieren konnte. Ich denke so ist das nunmal.
-
Ok,
könnte mir jemand dann erklären, wie ich das mit DMA mache?
Es kommt jetzt vielleicht ein bisschen doof rüber, aber irgendwie versteh ich weder den Wiki-Artikel, noch mit Google gefundene Seiten.
Naja es geht ja gerade mal "nur" um das Diskettenlaufwerk. Ich denke in so einer frühen Phase sollte man zusehen dass man sich durch den Stoff durchboxt. Ich musste auch ca. ne Woche lang den Paging Artikel (und externe Quellen) anstarren, bis ich das soweit verstanden hatte, dass ich es programmieren konnte. Ich denke so ist das nunmal.
Danke für den Tipp! Ich starrs jetzt auch seit Freitag an und versteh es immer noch nicht! :-(
-
Verzeih wenn ich mich mal eben so einmische - aber mir fällt auf dass Du dann doch recht oft bei auch sehr einfachen Sachen erst mal fragst und dann denkst (zumindest scheint mir das so).
Wenn Du wirklich ernsthaft mit der Programmierung (und im speziellen der OS-Entwicklung) weitermachen willst solltest Du lernen so Dinge wie zum Beispiel FDD per DMA anzusprechen über die bereits vorhandenen Tuts zu verstehen.
Das ganze ist an sich von der Theorie (und dann auch der Praxis) wirklich noch sehr einfach. Da gibt es ganz andere Baustellen die sich Dir auftun werden und da wirst Du dann auch ganz schnell die Lust verlieren weil es dann nicht mehr mit mal kurz Nachfragen getan ist.
Versteh mich ned falsch, fragen hat man immer mal, die hatte ich auch schon weil ich nachm 10ten mal lesen und denken immer noch nicht wirklich die Lösung hatte (man wird manchmal blind wenn man sich wo hinklammert) - nur fällt mir wie gesagt die Häufigkeit auf...
-
Ich versteh was damit sagen willst! :-P
Wenn dich das beruhigt werde ich mir den Artikel über den DMA nochmal durchlesen, vllt. schaff ich es ja innerhalb der nächsten 2 Wochen zu versthen, wie ich das mit dem DMA hinkriege
Achja: Danke für die Kritik, ist mir gar nicht so aufgefallen! :roll:
-
Na mich musste ned beruhigen :-D
Und ich bin auch sicher dass Du es schneller kapierst ;)
-
Und ich bin auch sicher dass Du es schneller kapierst
Da wäre ich mir jetzt nicht so sicher! :wink:
-
Und ich bin auch sicher dass Du es schneller kapierst
Da wäre ich mir jetzt nicht so sicher! :wink:
Zwei Dinge sind wichtig, wenn man es verstehen will:
1. Lies 1 Satz, überleg ob du ihn wirklich komplett verstanden hast. Wenn nicht, dann lies ihn nochmal und denk drüber nach.
2. Vorallem in der OS Entwicklung gibt es viele Dinge die man nur schwer durch reine Theorie richtig verstehen kann. Als ich mit FAT12 und Ext2 zu tun hatte, habe ich mir einerseits die Artikel und Dokumentationen angeschaut und dann aber auch gleichzeitig ein FAT12/Ext2 Image im Hexeditor geöffnet und versucht das gelesene im Hexeditor nachzuvollziehen. Ein Hexeditor bringt natürlich nicht bei jedem Thema was. Aber mir geht es darum, dass man sich die Dinge mal praktisch anschauen oder sogar tun muss, um sie zu verstehen. Und wenns nur auf nem Blatt Papier ist.
Diese 2 Schritte wendest du so lange an bis du alles oder zumindest genug verstanden hast.