Eigenes OS?



  • Erhard Henkes schrieb:

    Es macht m.E. mehr Sinn, zunächst in der Historie anzuknüpfen und von dort aus neue Wege zu suchen.

    Meine Rede! 👍 Man muß sich nur trennen von der Ansicht, daß im RM nur 1 MB RAM adressierbar sind. Dann müssten die Ideen eigentlich nur so hervorsprudeln. Vorausgesetzt natürlich, das Ziel ist nicht, DOS einfach nur zu kopieren.


  • Mod

    Man muß sich nur trennen von der Ansicht, daß im RM nur 1 MB RAM adressierbar sind.

    Gibt es hierzu bereits ein stabiles Hobby-/Lehr-OS, das man sich mal anschauen könnte?

    Ich denke nicht, dass der Protected Mode das zentrale Problem ist, eher was daraus gemacht wurde. Die Adressierung ist beherrschbar (eine Zeigerebene mehr und Paging, dafür hat man flat Speicher-Adr.). Multitasking mit allen Problemen muss ja z.B. nicht sein. Es geht doch eher darum, die enorme Leistung eines heutigen PC, die unter Windows (und inzwischen auch Linux) verschüttet wird, frei zu legen und Programmen bereit zu stellen.

    perfection is reached not when there is no longer anything to add, but when there is no longer anything to take away.

    Antoine de St. Exupéry.

    Protected Mode has several advantages over Real Mode:
    1. Protected Mode has Protection, the ability to keep programs from messing around and crashing each other(this is how Proctected Mode got its name).
    2. You may only have several tasks (like Windows and Linux).
    3. You have 4GB of address space (A20-Gate enabled).
    4. You can use paging to access memory.

    http://www.osdever.net/tutorials/gettingstarted.php

    Wichtig ist nach Tanenbaum eine Abstraktionsidee, Beispiele:
    alles ist ein Tape (Fortran)
    alles ist ein File (Unix)
    alles ist ein Objekt (W2K)
    alles ist ein Dokument (www)

    A.S.Tanenbaum ist ja immer einer der Verfechter des aus seiner Sicht "eleganten" Microkernel-Prinzips gewesen, das er im OS Minix umsetzte.



  • Erhard Henkes schrieb:

    MS DOS hatte vier Bereiche und arbeitete nur im RM:
    ...
    Befehle:
    ...
    "intern":
    ...
    "extern":
    ...

    Vorsicht... vorsicht... MS-DOS hatte auch einige Systemaufrufe wie den berühmten int 21h... 😉


  • Mod

    @abc.w: ja, das ist richtig. Hat das mit dem Compilieren/Linken nun geklappt, oder gibt es da noch ein Grundsatzproblem?



  • Erhard Henkes schrieb:

    @abc.w: ja, das ist richtig. Hat das mit dem Compilieren/Linken nun geklappt, oder gibt es da noch ein Grundsatzproblem?

    Das habe ich noch nicht hingekriegt...


  • Mod

    @abc.w: Schade, dass wir nicht wissen, woran es exakt liegt. Probiere doch mal parallel den DJGPP: http://www.osdever.net/downloads/compilers/DJGPP-Installer-nocpp.exe

    Vielleicht erkennst Du dann, woran es genau liegt. Wenn ich es richtig verstanden habe, macht der Linker Probleme.
    http://www.henkessoft.de/OS_Dev/Bilder/make_process.PNG (gelb)

    Ich hatte hier noch einiges zusammen getragen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-236354-and-postdays-is-0-and-postorder-is-asc-and-start-is-130.html

    NASM has its -f win32 option,
    and Cygwin has the pei-i386 output format.

    For LD use the option --oformat=binary.
    http://lists.zerezo.com/mingw-users/msg00383.html

    Keine Ahnung, ob das die richtige Spur ist.

    Zur Erinnerung:
    bei abc.w: i386pe
    bei mir: i386go32

    Vielleicht kann jemand anderes hier zielgenau helfen.



  • Erhard Henkes schrieb:

    @+Fricky: danke für die Links, aber teilweise schon etwas weit in den Details, dafür aber wieder zu komplex und gleichzeitg theoretisch. Das verwirrt momentan mehr als es beim Design hilft.

    schau es dir einfach in ruhe an und lass dich davon inspirieren. du musst ja kein OS strikt nach lehrbuchmeinung basteln (das wäre auch langweilig), aber z.b. in den tanenbaum-slides sind prinzipien erwähnt, von denen man als os-designer mal was gehört haben sollte. was du davon verwertest und was nicht, bleibt dir überlassen. ich würde zumindest leichte erweiterbarkeit und austauschbarkeit von komponenten von vorn herein einplanen. nicht dass du später mal alles umbauen musst, wenn ausgaben statt auf dem bildschirm, in einer datei landen sollen.
    🙂


  • Mod

    ich würde zumindest leichte erweiterbarkeit und austauschbarkeit von komponenten von vorn herein einplanen. nicht dass du später mal alles umbauen musst, wenn ausgaben statt auf dem bildschirm, in einer datei landen sollen.

    Das ist richtig. Abstraktion ist der entscheidende Punkt.

    ..

    Folgende Punkte sehe ich bisher für mein "PrettyOS" (Deckname):
    - Common affordable hardware platform (Standard PC ab 80386)
    - Flat 32-Bit Virtual Memory Model (das bedeutet PM bei x86)
    - Easy programming
    - Simplicity (KISS Prinzip gilt in einer komplexen Welt immer mehr)



  • Habe mit mingw-Linker & Co ein wenig rumexperimentiert. Es funktioniert immer noch nicht und ich glaube nicht, dass es funktionieren wird...
    Der mingw-Linker unterstützt folgende Formate:

    C:\BochsMyOS\20090327_eh_os>ld --help
    Usage: ld [options] file...
    ...
    ld: supported targets: pe-i386 pei-i386 elf32-i386 elf32-little elf32-big srec symbolsrec tekhex binary ihex
    ld: supported emulations: i386pe
    ...
    

    Der nasm Assembler unterstützt folgende Formate:

    C:\BochsMyOS\20090327_eh_os>c:\nasm-2.06rc6\nasm -hf
    ...
    valid output formats for -f are (`*' denotes default):
      * bin       flat-form binary files (e.g. DOS .COM, .SYS)
        aout      Linux a.out object files
        aoutb     NetBSD/FreeBSD a.out object files
        coff      COFF (i386) object files (e.g. DJGPP for DOS)
        elf32     ELF32 (i386) object files (e.g. Linux)
        elf       ELF (short name for ELF32)
        elf64     ELF64 (x86_64) object files (e.g. Linux)
        as86      Linux as86 (bin86 version 0.3) object files
        obj       MS-DOS 16-bit/32-bit OMF object files
        win32     Microsoft Win32 (i386) object files
        win64     Microsoft Win64 (x86-64) object files
        rdf       Relocatable Dynamic Object File Format v2.0
        ieee      IEEE-695 (LADsoft variant) object file format
        macho     NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files
    

    D.h. der nasm Assembler kann Objektdateien erzeugen, die der mingw-Linker nicht kennt. Ausserdem scheint es problematisch zu sein, dass die Datei kernel.asm 16-Bit und 32-Bit Code enthält. Wenn man mit nasm versucht, z.B. win32 Format zu generieren, bekommt man zahlreiche Fehlermeldungen:

    C:\nasm-2.06rc6\nasm -O32 -f win32 kernel.asm -o kernel.o
    kernel.asm:21: error: COFF format does not support non-32-bit relocations
    kernel.asm:27: error: COFF format does not support non-32-bit relocations
    kernel.asm:35: error: COFF format does not support non-32-bit relocations
    kernel.asm:40: error: COFF format does not support non-32-bit relocations
    kernel.asm:45: error: COFF format does not support non-32-bit relocations
    kernel.asm:50: error: COFF format does not support non-32-bit relocations
    kernel.asm:55: error: COFF format does not support non-32-bit relocations
    kernel.asm:59: error: COFF format does not support non-32-bit relocations
    kernel.asm:64: error: COFF format does not support non-32-bit relocations
    kernel.asm:69: error: COFF format does not support non-32-bit relocations
    kernel.asm:74: error: COFF format does not support non-32-bit relocations
    kernel.asm:82: error: COFF format does not support non-32-bit relocations
    kernel.asm:88: error: COFF format does not support non-32-bit relocations
    kernel.asm:117: error: COFF format does not support non-32-bit relocations
    make: *** [all] Error 1
    

    Was COFF mit win32 Format zu tun hat, weiss ich jetzt nicht...
    Dann habe ich mit ELF Format ausprobiert (scheint der kleinste gemeinsame Nenner zu sein, mingw-Linker und nasm können es beide und man kann die ckernel.o mit objcopy nach ELF konvertieren). Es kommt ungefähr folgende Fehlermeldung:

    C:\BochsMyOS\20090327_eh_os>ld -T kernel.ld kernel32.o ckernel_elf.o
    ld: cannot perform PE operations on non PE output file 'a.exe'.
    

    Mit kernel32.o habe ich versucht, 16-Bit Code von 32-Bit Code zu trennen und die Datei ckernel_elf.o ist die ckernel.o konvertiert nach ELF.
    Wie es aussieht, es geht mit mingw Tools nicht. 😞 Oder ich mache irgendwas falsch.

    Werde mir wohl den weisshaarigen DJGPP runterladen...


  • Mod

    Werde mir wohl den weisshaarigen DJGPP runterladen...

    DJGPP (gcc 3.1, ld 2.13):
    ld.exe: supported targets: coff-go32 coff-go32-exe a.out-i386 srec symbolsrec tekhex binary ihex
    ld.exe: supported emulations: i386go32

    mingw (ld 2.17.50 20060824 )
    ld: supported targets: pe-i386 pei-i386 elf32-i386 elf32-little elf32-big srec symbolsrec tekhex binary ihex
    ld: supported emulations: i386pe

    Hat da jemand die Lösung für den ASM-Kernel (16 u. 32 Bit) bezüglich Kopplung von NASM output file und Linker (ld 2.17) input file?



  • Erhard Henkes schrieb:

    Momentan schmökere ich gerade im Buch von Richard A. Burgess "Developing Your Own 32 Bit Computer Operating System" (MMURTL V1.0). Er hatte sich bei seinem Operating System folgende Ziele gesetzt:

    ah, ich glaub' das hatte ich mal in den fingern. ist schon ziemlich alt und er hat sein OS komplett in asm programmiert, ne?

    Erhard Henkes schrieb:

    The name is an acronym for Message based MUltitasking, Real-Time, kerneL."

    'message based' bedeutet, dass kein timer-gesteuerter scheduler drin ist, sondern context-switches werden durch versenden von messages herbeigeführt, oder? finde ich gut. präemptives, gewaltsames multitasking nach zeitscheiben ist manchmal gar nicht so toll.

    Erhard Henkes schrieb:

    Folgende Punkte sehe ich bisher für mein "PrettyOS" (Deckname):
    - Flat 32-Bit Virtual Memory Model (das bedeutet PM bei x86)
    - Easy programming
    - Simplicity (KISS Prinzip gilt in einer komplexen Welt immer mehr)

    ja, pretty-OS hört sich auch besser an, als der bisherige name.
    flat memory model: was denn sonst? segment/offset-gedöns ist einfach nur übel.
    easy programming: muss schon sein. keine übertriebenen schutzmechanismen, vertrau dem programmierer, denn er weiss, was er tut.
    KISS: sehr vernünftig.
    🙂


  • Mod

    PrettyOS nicht pretty-os oder pretty-OS 😃

    Zunächst müssen wir erstmal das NASM/Linker-Problem bei mingw (siehe post von abc.w) lösen, damit wir niemanden verlieren.

    Multitasking/Singletasking? Da bin ich mir noch nicht sicher, ob Multitasking am Anfang nicht zuviel des Guten ist. Vorbereitet sind wir ja via PM. Mal sehen.



  • Erhard Henkes schrieb:

    Da bin ich mir noch nicht sicher, ob Multitasking am Anfang nicht zuviel des Guten ist. Vorbereitet sind wir ja via PM. Mal sehen.

    multitasking oder nicht, hängt nicht davon ab, ob du den protected mode verwendest.
    🙂


  • Mod

    Ja, das ist richtig. 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?

    Prinzipiell ist task switching / context switching unabhängig von der Adressierungstechnik (direkt gekoppelt mit der physikalischen Adresse oder indirekt über Zeigertabellen). Auch Protected oder Unprotected hängt damit nicht zwingend zusammen.

    Kannst Du mir Beispiele nennen für folgende Kombinationen:

    Real Address Mode (0)    Unprotected (0) Singletasking (0)  Example
    Virtual Address Mode (1) Protected (1)   Multitasking  (1)  Operating System
    ---------------------------------------------------------------------------------------------
              0                  0                  0          MS-DOS
              0                  0                  1            ?
              0                  1                  0            ?
              0                  1                  1            ?
              1                  0                  0            ?
              1                  0                  1            ?  
              1                  1                  0            ?
              1                  1                  1          Linux, MS Windows NT, ...
    

    Ist die Systematik so richtig? Alles wirklich unabhängig voneinander?



  • Habe mir DJGPP heruntergeladen und konnte 20090327_eh_os erfolgreich kompilieren, linken, zusammenkopieren. Ein ähnliches Problem wie mit copy wieder gehabt, diesmal mit rename:

    C:\BochsMyOS\20090327_eh_os>make
    C:\nasm-2.06rc6\nasm -O32 -f bin boot.asm -o boot.bin
    C:\nasm-2.06rc6\nasm -O32 -f aout kernel.asm -o kernel.o
    c:\djgpp\bin\gcc -c ckernel.c -o ckernel.o
    c:\djgpp\bin\ld -T kernel.ld kernel.o ckernel.o
    rename a.out ckernel.bin
    process_begin: CreateProcess(NULL, rename a.out ckernel.bin, ...) failed.
    make (e=2): Das System kann die angegebene Datei nicht finden.
    make: *** [all] Error 2
    

    Dann habe ich mein Makefile umgebaut:

    all:
    	...
    	cmd /c rename a.out ckernel.bin
    	...
    

    Und so funktioniert es bei mir wieder...
    Eine Sache vielleicht noch: Die Funktion outportb() im C-Kernel ist ja als inline gekennzeichnet, "inlinen" tut der GCC anscheinend aber ab Optimierungsstufe -O1:

    all: 
    	...
    	gcc -c ckernel.c -o ckernel.o -O1
    	...
    

    Man kann sich die Objektdatei ckernel.o mit objdump anschauen, einmal ohne Optimierungsstufe und einmal mit, z.B. so:

    c:\djgpp\bin\objdump.exe -D ckernel.o
    

    Wofür steht eigentlich -O32 beim Aufruf von nasm? -O steht für Optimierung, aber 32... finde grade nichts über Optimierungsstufe 32 in der nasm Doku...

    C:\nasm-2.06rc6\nasm -O32 -f bin boot.asm -o boot.bin
    

    Erhard Henkes schrieb:

    Zunächst müssen wir erstmal das NASM/Linker-Problem bei mingw (siehe post von abc.w) lösen, damit wir niemanden verlieren.

    Nur aus Neugier, wie viele Leute sind noch dabei ? 🙂 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 😉


  • Mod

    Habe mir DJGPP heruntergeladen und konnte 20090327_eh_os erfolgreich kompilieren, linken, zusammenkopieren.

    Super! Freut mich, dass es bei Dir nun auch klappt. Eigentlich ein Hammer, dass das alte Teil mehr kann als das neue 😉 Allerdings hätte mich auch die wirkliche Lösung für den mingw interessiert, aber Hauptsache es geht. Kann man den alten ld vom DJGPP bei den Dateien vom neueren mingw einsetzen?

    Ein ähnliches Problem wie mit copy wieder gehabt, diesmal mit rename

    Das habe ich inzwischen über Bord geworfen, weil es das ckernel.bin nicht überschrieben hat, hätte man aber vorher mit del löschen können. So sieht es momentan aus (video.c ausgelagert), es wird einfach die Option -o ckernel.bin beim Linker ld angegeben:
    http://www.henkessoft.de/OS_Dev/Bilder/make_process.PNG

    all:
        nasmw -O32 -f bin boot.asm -o boot.bin            
        nasmw -O32 -f aout kernel.asm -o kernel.o         
        gcc -c ckernel.c -o ckernel.o                     
        gcc -c video.c -o video.o            
        ld -T kernel.ld kernel.o ckernel.o video.o -o ckernel.bin --verbose
        cmd /c copy /b boot.bin + ckernel.bin MyOS.bin    
        del video.o
        del kernel.o
        del ckernel.o
        del ckernel.bin
        del boot.bin   
        partcopy MyOS.bin 0 800 -f0
    

    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 😃 ).

    Gibt man "-O32" nasm (das habe ich von Nobuo T übernommen) bei Google ein, so kommen wir hier mit diesem Thread auf Platz eins heraus. 🙂

    namsw -help liefert Folgendes:

    -O<digit> optimize branch offsets (-O0 disables, default)

    Danke für den Hinweis mit der Optimierungsstufe und den Tipp bezüglich objdump (man kann die Leser eines solchen OS-Tutorials bezüglich Tools gar nicht genug fit machen). 😉 Das werde ich ins Tutorial einbauen.

    Ohne Optimierung:

    000000be <_outportb>:
      be:    55                       push   %ebp
      bf:    89 e5                    mov    %esp,%ebp
      c1:    83 ec 04                 sub    $0x4,%esp
      c4:    8b 45 0c                 mov    0xc(%ebp),%eax
      c7:    88 45 ff                 mov    %al,0xffffffff(%ebp)
      ca:    8b 55 08                 mov    0x8(%ebp),%edx
      cd:    8a 45 ff                 mov    0xffffffff(%ebp),%al
      d0:    ee                       out    %al,(%dx)
      d1:    c9                       leave 
      d2:    c3                       ret
    

    Mit Optimierung -O1:

    000000ac <_outportb>:
      ac:    55                       push   %ebp
      ad:    89 e5                    mov    %esp,%ebp
      af:    8b 55 08                 mov    0x8(%ebp),%edx
      b2:    8a 45 0c                 mov    0xc(%ebp),%al
      b5:    ee                       out    %al,(%dx)
      b6:    5d                       pop    %ebp
      b7:    c3                       ret
    

  • Mod

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



  • 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
    🙂


Anmelden zum Antworten