Eigenes OS?



  • Hallo Erhard,

    finde ich sehr cool, wie du hier eine mini-OS bastelst, habe ich auch mal versucht und bin irgendwann bis zu einer minigrafischen Oberfäche gekommen.
    Ich werde das noch mal rauskramen.

    Ich finde, dass du, bevor du den Keyboardtreiber schreibst, dir ein geeignetes Konzept zur Interruptbehandlung zulegst und das auch schon mal Schablonenartig implementierst.

    Ich finde diese Prolog/Epilog Konzept sehr gut. Mit entsprechenden Tricks und Hirnschmalz kann man es dann auch schaffen, dass die Interrupts _nie_ ausgestellt werden müssen.

    http://www-ivs.cs.uni-magdeburg.de/bs/lehre/sose97/bs1/seminare/seminar8.shtml

    Viel Erfolg noch.
    Jens



  • Erhard Henkes schrieb:

    Als PC-Betriebssystem kenne ich bisher noch kein Multitasking OS im Real Address Mode (=Real Mode), muss irgendwie an mir vorbei gegangen sein. Kannst Du mir da mal auf die Sprünge helfen?

    z.b. von cmx-rtx, embOS, freeRTOS, proc, usw, gibts auch versionen für x86-boards (das sind systeme für den embedded-bereich, machen alle timer-gesteuertes multitasking). die meisten davon laufen im real mode.
    🙂



  • Erhard Henkes schrieb:

    Zur Zeit schlage ich mich in C mit dem Keyboard Driver herum. Nicht gerade einfach die ganze Thematik, auch didaktisch.

    http://www.computer-engineering.org/ps2protocol/
    http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH20/CH20-1.html
    🙂


  • Mod

    Ein ganz anderer Punkt sind die mathematischen und sonstigen Routinen, die man ständig benötigt, und die aber nicht von einer library abhängig sein dürfen.
    Beispiel: Will man eine char-, integer- oder float-Zahl auf dem Bildschirm ausgeben, so muss man zunächst diese in einen "string" umwandeln. Man benötigt also ein "frei schwebendes" k_itoa ohne Routinen aus string.h etc. Selbst im alten K&R wurde ich da nicht fündig, da verweist ständig eine Funktion auf die nächste, wie bei einem russischen Püppchen 😃

    ..


  • Mod

    Ich finde, dass du, bevor du den Keyboardtreiber schreibst, dir ein geeignetes Konzept zur Interruptbehandlung zulegst und das auch schon mal Schablonenartig implementierst.

    Ich möchte es zunächst erstmal ohne Interrupts probieren, bin nicht sicher, ob das vernünftig geht, wird dann aber logischerweise der nächste Schritt.

    Ich finde diese Prolog/Epilog Konzept sehr gut. Mit entsprechenden Tricks und Hirnschmalz kann man es dann auch schaffen, dass die Interrupts _nie_ ausgestellt werden müssen.

    Danke an alle für die tollen Links. Das hilft mir sehr.

    Momentan ist mein Hauptproblem, dass ich zwei Rechner benötige, weil ich nicht ständig Windows booten will, wenn das liebe PrettyOS selbst "aus Bochs heraus" meine Tastatur abgeschossen hat. 😃

    EDIT:
    Problem gelöst, Keyboard-Treiber funktioniert, zur Zeit noch ohne Interrupts, wie ich es wollte.
    OS fragt die Tastatur in einer Schleife ab, löscht den Bildschirm und druckt in Zeile 0 das ASCII-Zeichen und in Zeile 1 den ASCII-Code (dank k_itoa). Zur Zeichendarstellung benötigt man bereits zwei Keymaps (eine mit und eine ohne Shift-Taste, zur Zeit International US-Tastatur).
    http://www.henkessoft.de/OS_Dev/Bilder/KeyboardDriver_funktioniert.PNG 👍
    Gefällt mir didaktisch gut, vor allem noch alles in C außer den Funktionen outportb(...) und inportb(...).

    Nun muss ich den Sourcecode noch didaktisch optimieren, sieht teilweise improvisiert ziemlich unordentlich aus, kann man so nicht uploaden. 🙄

    Module:

    ckernel.c:
    main()

    video.c:
    k_clear_screen()
    k_printf(char* message, unsigned int line, char attribute)
    void update_cursor(int row, int col)

    util.c (wollte es nicht stdlib nennen):
    void k_itoa(int value, char* valuestring)
    void k_i2hex(unsigned int val, unsigned char* dest, int len)
    void float2string(float value, int decimal, char* valuestring)

    math.c:
    int power(int base,int n)

    keyboard.c:
    ...
    ...
    k_getch()

    Wohin gehören outportb, inportb?
    Wie würdet ihr überhaupt die Module anordnen?



  • Erhard Henkes schrieb:

    Ich bin aus persönlichem Interesse dabei, weil ich u.a. vorhabe, hobbymässig einen echten 80386 auf einer Lochrasterplatine zum Laufen zu bekommen. Ein PC ist mir zu langweilig 😉 Überlege gerade, wie ich die RAM Bausteine 8 Stück je 32 kByte anschliesse. Eins weiss ich inzwischen genau: Auf keinen Fall A20 Gate 😉

    👍
    Falls Du das nicht selbst auf einer Homepage verarbeiten willst, sollten wir ein Kapitel über dein Projekt einbauen (natürlich mit Fotos deines Konstrukts, bitte denke an die VDE und Funkabschirmung 😃 ).

    Eine Homepage habe ich nicht... und hätte auch nichts gegen ein Kapitel mit ein Paar Fotos von meinem Board 😉 Ein Kapitel, der heissen soll "So nicht" 😉 Es ist nämlich so, dass ich inzwischen 20 ICs auf der Platine habe und wenn ich so überlege, noch ziemlich am Anfang stehe. Diese 20 ICs habe ich nicht draufgemacht, weil ich mir Gedanken gemacht habe, wie die Schaltung optimal oder am Besten wäre, sondern, ich hatte sie zufällig in meiner Bastelkiste... Meine Idee ist, vom PC aus ein binäres Programm auf die Platine "runterladen" und dieses Programm vom 80386 ausführen lassen. Die Kommunikation mit dem PC soll über eine UART gehen und die Steuerung soll ein ATmega644 übernehmen. Sprich, ein 8-Bit Mikrocontroller soll volle Kontrolle über eine 32-Bit CPU haben. Der ATmega soll den 80386 im Reset halten, wenn ein Programm über UART gesendet wird und, dieses Programm ins RAM schreiben. Danach soll der 80386 "freigelassen" werden 🙂 Also nicht gerage sinnvoll das Ganze. Nicht, dass jemand denkt, boah, der baut einen PC nach... Ich habe noch nicht mal irgendwelche I/O Bausteine für den 386er. Mein Ziel ist also wirklich "nur" 386er soll ein Programm aus dem RAM ausführen und wenn die Spannung weg ist, dann ist auch das Programm weg. Das Programm könnte natürlich alles Mögliche sein, auch ein kleines OS... nur man müsste dann irgendeine Form von I/O dazubauen und Platz dafür wäre auf der Platine da.
    Ich kann Dir gerne ein Paar Fotos von dem Board im jetzigen Stand zuschicken, die RAM Bausteine und der 386er sind aber noch nicht drauf...


  • Mod

    man müsste dann irgendeine Form von I/O dazubauen

    Irgendwie erinnert mich das an diese Robotik-/Elektronik-Boards mit ihren Interfaces nach außen, z.B. I2C-Bus. Vielleicht erhältst Du dort Anregungen.
    http://www.roboternetz.de/wissen/index.php/RN-Control



  • Erhard Henkes schrieb:

    Irgendwie erinnert mich das an diese Robotik-/Elektronik-Boards mit ihren Interfaces nach außen, z.B. I2C-Bus. Vielleicht erhältst Du dort Anregungen. http://www.roboternetz.de/wissen/index.php/RN-Control

    Dazu ist noch ein weiter Weg, zuerst muss RAM mit seinem 32-Bit Datenbus funktionieren. Die Funktion der 19 ICs besteht im Prinzip darinm, dass der 20. IC, der ATmega, wie ein Master mit 20-Bit Adressbus und 32-Bit Datenbus erscheint plus ein Paar Steuersignale... Die Funktion dieser 19 ICs muss ich noch überprüfen 🙂
    PS: Ups, die UART realisiert mit MAX232 läuft bereits, also sind es nur noch 18 ICs... 🙂



  • Erhard Henkes schrieb:

    Ein ganz anderer Punkt sind die mathematischen und sonstigen Routinen, die man ständig benötigt, und die aber nicht von einer library abhängig sein dürfen.

    such dir was aus: http://penguinppc.org/embedded/howto/library.html

    abc.w schrieb:

    Es ist nämlich so, dass ich inzwischen 20 ICs auf der Platine habe und wenn ich so überlege, noch ziemlich am Anfang stehe. Diese 20 ICs habe ich nicht draufgemacht, weil ich mir Gedanken gemacht habe, wie die Schaltung optimal oder am Besten wäre, sondern, ich hatte sie zufällig in meiner Bastelkiste...

    das ist nicht dein ernst?!

    abc.w schrieb:

    Meine Idee ist, vom PC aus ein binäres Programm auf die Platine "runterladen" und dieses Programm vom 80386 ausführen lassen.

    na, dann wäre vielleicht das hier was für dich: http://www.amd.com/epd/processors/4.32bitcont/14.lan5xxfam/24.lansc520/index.html
    (x86-kompatibel und so)

    aber wenn du mehr auf basteln stehst (was ich vermute, siehe oben), dann vielleicht doch eher sowas: http://www.mycpu.eu/
    🙂



  • +fricky schrieb:

    abc.w schrieb:

    Es ist nämlich so, dass ich inzwischen 20 ICs auf der Platine habe und wenn ich so überlege, noch ziemlich am Anfang stehe. Diese 20 ICs habe ich nicht draufgemacht, weil ich mir Gedanken gemacht habe, wie die Schaltung optimal oder am Besten wäre, sondern, ich hatte sie zufällig in meiner Bastelkiste...

    das ist nicht dein ernst?!

    Also, es ist nicht so kompliziert, 12 davon sind 74HC244, Tristate Treiber, ein ATmega, ein Paar Schieberegister, Zähler, 3zu8 Dekoder... Würde sagen, lauter Standard-Bausteine.

    +fricky schrieb:

    na, dann wäre vielleicht das hier was für dich: http://www.amd.com/epd/processors/4.32bitcont/14.lan5xxfam/24.lansc520/index.html
    (x86-kompatibel und so)

    Package Pin Count and Type 388 PBGA
    das ist nicht dein ernst?! 🙂 Nix für meinen "Schlitz"-Lötkolben. 🙂

    +fricky schrieb:

    aber wenn du mehr auf basteln stehst (was ich vermute, siehe oben), dann vielleicht doch eher sowas: http://www.mycpu.eu/
    🙂

    Genau, ich stehe auf Basteln. MyCPU ist interessant, wenn man aber bereits mal mit FPGAs in Berührung gekommen ist und zufällig ein FPGA-Board besitzt, dann, nun ja, 8-Bit CPU, hm, hm... 🙂
    Und wenn man zufällig ein Paar alte 80386 CPUs besitzt, wo man an die Pins auch noch mit nem "Schlitz"-Lötkolben drankommt, warum nicht irgendwas damit bauen. x86 Assembler-Programmierung kann man zwar am PC schön erlernen und vielleicht sogar irgendwie irgendwo anwenden, aber so richtiges Verständnis für die "Physik" fehlt einem irgendwo. Wie ist es mit dem Datenbus, mit dem Adressbus, wie sieht Adressbus aus, welche Steuersignale sind da, was bedeuten sie, was kann man damit machen usw. Eine selbstgebastelte funktioniernde Platine wäre für mich, dass ich u.a. auch diese "Physik"-Ebene verstanden habe...


  • Mod

    Ich sehe es schon vor mir: Anleitung von abc.w und mir: "Do-it-yourself-PC&OS": Wir basteln uns unseren PC und anschließend coden wir unser OS. 😃 😉


  • Mod

    Mit der Bitte um Feedback bezüglich Design:

    http://www.henkessoft.de/OS_Dev/Downloads/13 C.zip
    

    (enthält eine Testvariante mit funktionierendem keyboard driver in C, noch nicht im Tutorial veröffentlicht)



  • abc.w schrieb:

    Package Pin Count and Type 388 PBGA
    das ist nicht dein ernst?! 🙂 Nix für meinen "Schlitz"-Lötkolben. 🙂

    ach, du hast doch bestimmt irgendwo 'nen backofen rumstehen.

    abc.w schrieb:

    Genau, ich stehe auf Basteln. MyCPU ist interessant, wenn man aber bereits mal mit FPGAs in Berührung gekommen ist und zufällig ein FPGA-Board besitzt, dann, nun ja, 8-Bit CPU, hm, hm... 🙂
    Und wenn man zufällig ein Paar alte 80386 CPUs besitzt, wo man an die Pins auch noch mit nem "Schlitz"-Lötkolben drankommt, warum nicht irgendwas damit bauen.

    datenbusbreite ist doch nicht wichtig. 8-bitter können auch schnell sein. wenn du sowieso mit FPGA's rumfummelst, musste dir auch keine schaltung aus alten schrott-ICs basteln. mach dir 'nen x86-core und etwas peripherie in deinen FPGA rein, und fertig.
    🙂



  • was ist eigentlich aus f-cpu geworden ?



  • Hab die 13 C.zip bei mir mal ausprobiert und hatte schon wieder diese komische Fehlermeldung von mingw make (möchte aus welchen Gründen auch immer MinGW Tools verwenden :), habe auch noch die Verzeichnisse in PATH für nasm und DJGPP gar nicht angepasst und benutze im Makefile absolute Pfadangaben):

    del kernel.o
    process_begin: CreateProcess(NULL, del kernel.o, ...) failed.
    make (e=2): Das System kann die angegebene Datei nicht finden.
    make: *** [all] Error 2
    

    Dann im makefile die Aufrufe von del wie den Aufruf von copy geändert:

    cmd /c del kernel.o
    
    	cmd /c del ckernel.o
    	cmd /c del video.o
    	cmd /c del keyboard.o
    	cmd /c del math.o
    	cmd /c del util.o
    
    	cmd /c del ckernel.bin
    	cmd /c del boot.bin
    

    Und es funktioniert auch mit dem mingw make...
    Mit der make.exe, die in der zip-Datei mit dabei ist, funktioniert es auch ohne zusätzliches "cmd /c ". Ich sehe grade, dass die make.exe aus der zip-Datei die gleiche ist wie die c:\djgpp\bin\make.exe.
    Hm, mingw scheint irgendwie eigenwilliger als DJGPP zu sein. Kleine Inkompatibilitäten und so was...



  • +fricky schrieb:

    datenbusbreite ist doch nicht wichtig. 8-bitter können auch schnell sein. wenn du sowieso mit FPGA's rumfummelst, musste dir auch keine schaltung aus alten schrott-ICs basteln. mach dir 'nen x86-core und etwas peripherie in deinen FPGA rein, und fertig.

    Bezüglich x86 Core habe ich mir mal echt darüber Gedanken gemacht, einen in VHDL zu implementieren. Die "Komplexität" hat mich abgeschreckt, Real Mode, Protected Mode, elf Adressierungsarten, Anzahl der Befehle, Codierung der Befehle wie irgendwelche Präfixe, die mal auf die Berechnung der Adresse, mal auf die Operandenbitbreite Auswirkung haben usw... Ich habe auch mal darüber nachgedacht, eine Art Untermenge von 386 zu "implementieren", einen Core, der bereits im Protected Mode ist, nur wenige Befehle kann usw. Und dann ist noch die Sache bezüglich "lad mal nen Core", man muss ja noch das Programm irgendwie mitladen, wenn denn auf dem FPGA Platz dafür ist...
    Gibt es irgendwo einen freien x86 IP ab 80386, am Besten in VHDL?


  • Mod

    @abc.w: danke für deine Tests mit mingw. Geht denn jetzt auch das Linken? Wie hast Du das geschafft?

    Den Code zum Keyboard Driver habe ich hoffentlich noch etwas klarer gemacht. Vielleicht schaffe ich noch eine vereinfachte Variante mit nur einer Keymap und ohne Shift-Abfrage. Muss mir mal andere keymaps anschauen, ob diese einem allgemeinen Standard folgen, denn wir wollen ja auch unsere deutsche Tastatur durch einfaches Übernehmen anderer keymaps nutzen.

    Kapitel zum Keyboard Driver im Tutorial:
    http://www.henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId185043
    (dort ist auch der Sourcecode zum Download bereit)

    Ich hoffe, dass man es noch versteht, was ich da von mir gebe.
    Die Grundideen sind ziemlich einfach:
    Man holt den Scancode von Port 0x60, analysiert Bit7 (key pressed or released?),
    filtriert (=unterdrückt) den Shift-Tasten Scancode, speichert das Ergebnis in einer Variable ShiftKeyDown
    und gibt dann den Scancode der nachfolgenden Taste zurück.
    Damit steigt man dann in die richtige Keymap (Shift oder Non-Shift) und gibt mittels k_getch() das zum Scancode passende Zeichen zurück.
    Das ganze geht sicher auch einfacher, aber ich möchte die Bildung des Scancodes aus Pressed/Released-Bit und 7-Bit-Tasten-Nummerierung klar machen. Da fehlt noch ein Bild.

    Dieser kleine ohne Schnörkel daher kommende Text im Internet hat mir am besten geholfen, das Thema Scancode zu verstehen: 🙂
    http://www.qzx.com/pc-gpe/keyboard.txt

    Das nächste logische Thema wären dann wohl Interrupts, was denkt ihr? 😕

    @abc.w:

    Ich habe mich auch mal mit einem eigenen OS in Assembler beschäftigt zwecks endlich mal den Protected Mode der Intel CPUs zu verstehen. Habe aber diesbezüglich versagt und daraus wurde nichts. Hm, vertane Lebenszeit... hätte lieber in was anderes und sinnvolleres investieren sollen.

    Ich hoffe, Du bist dem Protected Mode schon etwas näher gekommen. 😉



  • abc.w schrieb:

    Gibt es irgendwo einen freien x86 IP ab 80386, am Besten in VHDL?

    http://www.opencores.org/?do=project&who=zet86
    🙂


  • Mod

    Beim Recherchieren habe ich eine ausführliche neue Tutorial-Serie (bisher 19 Teile) gefunden, didaktisch allerdings nicht geschickt gemacht, dafür in englisch und vollgestopft mit Detail-Infos:
    http://brokenthorn.com/Resources/OSDev1.html



  • @Erhard: Bezüglich Linken mit mingw hab ich es leider nicht hingegriegt. Benutze nun DJGPP. Es ist nur so, dass meine Pfade auf mingw Verzeichnisse eingestellt sind und wenn ich make in der Eingabeaufforderung aufrufe, mingw make ausgeführt wird. Und da kamen wieder die komischen Fehlermeldungen. Und ich wollte wissen, woran es liegt...

    Bezüglich des nächsten logischen Themas über Interrupts: Ich halte grade ein älteres Buch von Klaus-Dieter Thies "Die Innovativen 80286/80386 Architekturen" Teil 2. Im ersten Kapitel Basis-Programmier-Modell gibt es einen Unterkapitel "Ausnahmen und Interrupts". Vielleicht wäre das nächste logische Thema nicht nur über Interrupts alleine (als asynchrone Ereignisse), sondern auch über Ausnahmen (als synchrone Ereignisse) sinnvoll...

    Erhard Henkes schrieb:

    @abc.w:

    Ich habe mich auch mal mit einem eigenen OS in Assembler beschäftigt zwecks endlich mal den Protected Mode der Intel CPUs zu verstehen. Habe aber diesbezüglich versagt und daraus wurde nichts. Hm, vertane Lebenszeit... hätte lieber in was anderes und sinnvolleres investieren sollen.

    Ich hoffe, Du bist dem Protected Mode schon etwas näher gekommen. 😉

    Hm, ja, bisschen 🙂 Aber noch weit davon entfernt, mal aus dem Stegreif eigene Tasks anlegen zu können, die sich nicht gegenseitig kaputtmachen könnten 🙂

    +fricky schrieb:

    abc.w schrieb:

    Gibt es irgendwo einen freien x86 IP ab 80386, am Besten in VHDL?

    http://www.opencores.org/?do=project&who=zet86

    16 bit Zet processor equivalent to an Intel 80186. Ich hätte gerne einen ab 80386... 🙂 Ich hatte auch mal danach recherchiert, es gibt irgendwie keine, nicht mal "kostenpflichtige", warum auch immer.


Anmelden zum Antworten