Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cool-Andy am 11. November 2009, 16:04

Titel: Diskettentreiber
Beitrag 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-)
Titel: Re: von PM in RM?
Beitrag von: Hobby Programmiere am 11. November 2009, 18:01
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
Titel: Re: von PM in RM?
Beitrag von: Jidder am 11. November 2009, 18:12
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^^
Titel: Re: von PM in RM?
Beitrag von: XanClic am 11. November 2009, 18:23
In einen PM-Diskettentreiber würde ich das aber nicht einbauen. Da lohnt es sich dann, über vm86 nachzudenken.
Titel: Re: von PM in RM?
Beitrag von: Cool-Andy am 11. November 2009, 18:27
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:
Titel: Re: Diskettentreiber
Beitrag von: Jidder am 11. November 2009, 19:49
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?
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 11. November 2009, 20:00
Hu!  :? :? :? :? :? :? :? :? :? :?
Ich versteh nur Bahnhof!

Zitat
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:
Titel: Re: Diskettentreiber
Beitrag von: stultus am 11. November 2009, 20:03
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 ;)
Titel: Re: Diskettentreiber
Beitrag von: kevin am 11. November 2009, 20:04
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.
Titel: Re: Diskettentreiber
Beitrag von: Jidder am 11. November 2009, 20:06
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 ^^
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 11. November 2009, 20:39
Falls euch noch was dazu einfällt - bitte hier posten! Ich probier mich jetzt mal ein bisschen an so einem Diskettentreiber rum!  :mrgreen:
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 06:13
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!  :?
Titel: Re: Diskettentreiber
Beitrag von: ChristianF am 12. November 2009, 08:03
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
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 16:38
Hat den keiner eine Idee?  :?
Titel: Re: Diskettentreiber
Beitrag von: stultus am 12. November 2009, 17:44
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.
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 18:40
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.
Titel: Re: Diskettentreiber
Beitrag von: Cjreek am 12. November 2009, 19:46
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.
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 20:12
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!  :-(
Titel: Re: Diskettentreiber
Beitrag von: DeepDancer am 12. November 2009, 20:15
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...

Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 20:36
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:
Titel: Re: Diskettentreiber
Beitrag von: DeepDancer am 12. November 2009, 20:46
Na mich musste ned beruhigen  :-D

Und ich bin auch sicher dass Du es schneller kapierst ;)
Titel: Re: Diskettentreiber
Beitrag von: Cool-Andy am 12. November 2009, 21:06
Zitat
Und ich bin auch sicher dass Du es schneller kapierst

Da wäre ich mir jetzt nicht so sicher!  :wink:
Titel: Re: Diskettentreiber
Beitrag von: Cjreek am 13. November 2009, 19:00
Zitat
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.