Eigenes OS?


  • Mod

    Wichtiger Meilenstein:
    User-Programme in C mit userlib.h/.c anstelle Assembler-User-Programme. Echt gutes Gefühl, wenn so etwas endlich läuft. 😃 👍
    Hier sollte sogar C++ möglich sein. 😉

    http://www.henkessoft.de/OS_Dev/Downloads/20090705_66.zip

    // userlib.h
    
    #ifndef USERLIB_H
    #define USERLIB_H
    
    void settextcolor(unsigned int foreground, unsigned int background);
    void putch(unsigned char val);
    
    #endif
    
    // userlib.c
    
    #include "userlib.h"
    
    void settextcolor(unsigned int foreground, unsigned int background)
    {
        asm volatile( "int $0x7F" : : "a"(2), "b"(foreground), "c"(background) );
    }
    
    void putch(unsigned char val)
    {
        asm volatile( "int $0x7F" : : "a"(1), "b"(val) );
    }
    
    // program.c
    
    #include "userlib.h"
    
    int main()
    {
      settextcolor(14,1);
      putch('T');
      putch('e');
      putch('s');
      putch('t');
      return 0;
    }
    


  • Mit was für einem Dateisystem arbeitest du?
    bzw. hast du schon eins?



  • Wenn du dur mal das Tut zum OS ansehen würdest, oder dir das OS ansiehst, würdest du feststellen, dass dort noch gar kein Festplattenzugriff ist.



  • Ich meine gar keinen Festplatten sondern Diskettenzugriff.
    Außerdem kann es ja sein, dass schon etwas ins Auge gefasst wurde.


  • Mod

    Mit was für einem Dateisystem arbeitest du? bzw. hast du schon eins?

    Bei User-Programmen wird mit dem ELF-executable-Format gearbeitet. In der RAM disk wird ein von James Molloy selbst gestricktes Format eingesetzt (Quellcode für Erzeuger-Programm liegt bei). Bezüglich der "Datenträger" weiß ich noch nicht wie ich vorgehen soll. Diskettenlaufwerke sind sicher nicht mehr der Hit und an vielen PCs nicht mehr vorhanden. Alle Programme werden bisher via "incbin" innerhalb initrd.img in den Kernel transportiert und dort über das VFS und selbst gestrickte Dateisystem gefunden und "geladen".



  • Ah ok.
    Das hilft mir doch schonmal weiter.
    Da ich nicht denke, das Diskettenlaufwerke untergehen sollten und da mein OS die Massen nicht interessieren wird, habe ich ein ext2-System auf der Floppy mit dem OS.
    Ich hab gehofft du benutzt das auch und wüsstest einen Treiber dafür.
    Aber scheint ja nicht der Fall zu sein.


  • Mod

    Da ich nicht denke, das Diskettenlaufwerke untergehen sollten

    Da stehst Du wohl nicht völlig alleine da mit dieser Meinung, aber aufhalten kann den Niedergang niemand mehr. Das Ende der drehenden Scheiben ist nahe.

    ext2-System auf der Floppy mit dem OS

    Da ich MS Windows als Host-System mit Cross-Compiler/-Linker für die OS-Entwicklung verwende, wollte ich mich - wenn überhaupt - eher auf ELF und FAT konzentrieren.


  • Mod

    Die bisherige Begrenzung für den Kernel im Bootloader ist endlich gefallen:
    http://www.henkessoft.de/OS_Dev/OS_Dev3.htm#mozTocId882541

    Der Bootloader und zugehörige Aufgaben vor dem Start der C-Datei ist bisher noch ein gehöriger Schwachpunkt. Die Ratschläge, endlich GRUB einzusetzen, verstummen nicht.

    Musste allerdings noch die bss section nullen, das hat noch gefehlt.
    Ich könnte echt einen BIOS / Bootloader / ... -Spezialisten brauchen.

    Instabiler Code, der auf mehreren PCs getestet wurde und in einigen Fällen zu "Datenverlusten" in der RAM Disk führte, was dann teilweise #PF oder fehlendes User-Programm zur Folge hatte.
    http://www.henkessoft.de/OS_Dev/Downloads/20090720_83.zip
    (Fehler in fs.h/fs.c muss noch exakt lokalisiert und behoben/abgefangen werden)

    Da das Problem eindeutig in dem verwendeten Code von James Molloy für VFS/RAM Disk liegt, wurde das in nachfoglendem Code einfach umgangen:
    Hier ist ein stabiler Code, der VFS umgeht, solange der Fehler nicht exakt lokalisiert und behoben wurde: http://www.henkessoft.de/OS_Dev/Downloads/85.zip 🙂


  • Mod

    Ich möchte auf eine hervorragende, bisher 20-teilige Serie (BrokenThorn Entertainment, "Mike") aufmerksam machen: http://www.brokenthorn.com/Resources/OSDev1.html
    (didaktisch wirklich gut, da von Grund auf mit eigenem Bootloader und FAT12 System gearbeitet wird; leider noch einige kleine Fehler enthalten, Author wurde von mir über diese informiert)

    Ich hab gehofft du benutzt das auch und wüsstest einen Treiber dafür.

    Vielleicht sind die ersten Teile des obigen Tutorials für Dich das richtige, verwendet allerdings FAT12 anstelle ext2.


  • Mod

    Das Thema Analyse des physikalischen Speichers wurde nun auch erfolgreich umgesetzt: http://www.henkessoft.de/OS_Dev/OS_Dev3.htm#mozTocId584885
    Allerdings haben wir mit int 15h eax = 820h die 80er verlassen und sind auf neuere Zeiten (spätestens ab 2002, funktioniert aber vielfach bereits bei früheren PCs) umgestiegen. 😉

    Der Bootloader ist nun allerdings voll gestopft. Platz für FAT12 ist dort nun nicht. Wir verwenden ja noch "raw format". Die Frage ist, ob man sich überhaupt noch Gedanken über Floppy Disk machen soll.



  • Erhard Henkes schrieb:

    Mich würde mal interessieren, wer alleine oder mit anderen an einem eigenen OS entwickelt, zu welchem Zweck und in welcher Sprache (ASS, C oder C++)? Links?

    Für meine Studienarbeit habe ich einen Echtzeit-fähigen Mikrokernel entwickelt mit einem EDF Scheduler. Während der Diplomarbeit erweitere ich den um energieeffiziente Schedulingalgorithmen. Das ganze läuft auf einem gumstix connex400 mit einem Intel PXA255 (ARMvt5). Code darf ich noch nicht veröffentlichen 😞


  • Mod

    @supertux: Klingt echt toll! Davon musst Du hier berichten, sobald Du dies darfst. Aber vielleicht kannst Du mit Deinen Erkenntnissen hier einige wichtige Weichenstellungen kommentieren und beeinflussen. PrettyOS soll ja vor allem ein Experimentier-OS werden und Einsteiger in diese Materie ansprechen und ermuntern.

    Das Bild von einem OS, das man vor Augen hat, wird entscheidend geprägt durch das Interface. Daher habe ich nun auch begonnen die "Shell" (in Ring 3) zu entwickeln:
    http://www.henkessoft.de/OS_Dev/OS_Dev3.htm#mozTocId29082

    Ich stelle mir momentan vor allem die Frage: Was gehört in die syscall-API (teuer) und was in die user-API (bläht User-Programm auf)? 😕



  • Erhard Henkes schrieb:

    @supertux: Klingt echt toll! Davon musst Du hier berichten, sobald Du dies darfst. Aber vielleicht kannst Du mit Deinen Erkenntnissen hier einige wichtige Weichenstellungen kommentieren und beeinflussen. PrettyOS soll ja vor allem ein Experimentier-OS werden und Einsteiger in diese Materie ansprechen und ermuntern.

    das hörst sich sehr interessant an, hab ein bisschem im Code nachgeschaut. Leider kenne ich mich mit x86 überhaupt nicht aus, also verstehe ich den Code und viele (für x86) Notwendige Sache gar nicht.

    Ich muss meine Ausarbeitung in ca. 2 1/2 Wochen abgeben, dann Vortrag halten und so. Also erst danach werde ich wahrscheinlich meine Sachen (plus Sources) veröffentlichen können.


  • Mod

    ARM ist für einige interessant. Vielleicht kannst Du auch einen passenden Emulator verlinken. 🙂


  • Mod

    Ich habe PrettyOS nun auch unabhängiger und stabiler gemacht. Da hatten sich nach dem Umstieg von DJGPP nach Cross-Tools doch einige unbehobene Schwachpunkte angesammelt. Nun kann man Kernel und User-Programme mit CFLAGS= -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin kompilieren.
    Physikalischer Speicher wird nun auch automatisch bestimmt und für das Paging (Anzahl der Frames = Phys. Memory / Pagesize) übernommen.

    Das ist die bisher stabilste und beste Version: http://www.henkessoft.de/OS_Dev/Downloads/88.zip (läuft inzwischen mit -Werror und -Wall und benötigt keine Header der Cross-Tools)

    Hier habe ich wieder initrd und VFS verwendet, um die shell zu finden/laden:
    http://www.henkessoft.de/OS_Dev/Downloads/90.zip
    (dabei gibt es aber auf bestimmten PC noch Probleme, die ich bisher nicht lokalisieren und beheben kann):
    Die Shell wurde als ELF-Programm via incbin (data.asm) über die Paarung RAM Disk / VFS lokalisiert und gestartet. Der visuelle Eindruck beginnt sich zu entwickeln.

    Ich stelle mir für die Zukunft die Fragen:
    - wie sollen die syscalls aussehen?
    - was gehört in die user-lib?
    - Sollte man Standards einsetzen? (POSIX, standardisierte C-userlib)
    - Sollte man letztendlich doch GRUB einsetzen oder stur den eigenen Bootloader ausbauen? (niemand hetzt mich)



  • Wenn du mich fragst, ich würde auf jeden Fall einmal das Thema GRUB anschneiden.
    Es soll immerhin ein OS- und kein Bootloader-Tutorial bleiben / werden.



  • Ich würde Standards einsetzen, weil es dann einfacher ist Programme zu entwickeln bzw. zu portieren.



  • Als erstes vorweg: ich beobachte die Entwicklung des Tutorials jetzt schon einige Zeit und bin echt begeistert! Mach auf jeden Fall weiter.

    Zum Thema GRUB: Ich fände es schade um die viele Arbeit, die jetzt schon in den eigenen Bootloader investiert wurde. Außerdem find ich es gut, dass man so von Anfang an gut erklärt bekommt, wie so ein Betriebssystem von Grund auf aufgebaut ist. Wenn man den Anfang jetzt GRUB machen lässt, werden wieder Fragen wie "Wie läuft das denn eigentlich mit GRUB ab?" aufgeworfen. Es ist zwar viel Arbeit, doch ist der Lerneffekt zumindest für mich größer, wenn mit dem jetzigen Bootloader weitergearbeitet wird. 🙂

    Übrigens habe ich festgestellt, dass der Bootloader sich im Bochs-Emulator bei folgenden IPS folgendermaßen verhält (Näherungswerte):

    400.000 -> Bootloader wird garnicht erst geladen
    400.050 -> Bootloader startet verzögert (ca. 7 Sekunden)
    400.100 -> Bootloader startet verzögert (ca. 5 Sekunden)
    400.500 -> Bootloader startet verzögert (ca. 1 Sekunde)
    402.000 -> Bootloader startet vollkommen normal

    Getestet wurde übrigens mit jeweils 8 MB RAM (das Niedrigste, ohne eine Fehlermeldung von alloc_frame() zu bekommen, dass es keine freien Frames mehr gebe, um anschließend (außer bei 7MB RAM) im "Page Fault >>> Exception. System Halted! <<<" zu enden ;))

    Woran liegt das genau, warum sind so kleine Werte hierbei so entscheidend?


  • Mod

    ich beobachte die Entwicklung des Tutorials jetzt schon einige Zeit und bin echt begeistert! Mach auf jeden Fall weiter.

    Ich plane im Hintergrund bereits ein neues völlig eigenes OS, muss aber erst noch mehr Erfahrung sammeln. Bei OSDEV zählt Erfahrung mehr als jede noch so tolle Theorie. Jeder baut hier auf den anderen auf. MSDOS auf CP/M, Linux auf Minix, ...

    Zum Thema GRUB: Ich fände es schade um die viele Arbeit, die jetzt schon in den eigenen Bootloader investiert wurde. Außerdem find ich es gut, dass man so von Anfang an gut erklärt bekommt, wie so ein Betriebssystem von Grund auf aufgebaut ist.

    Sehe ich genau so! Ich war nur deutlich verunsichert, weil ich bei seltsamen Fehlern jedes Mal mühsam belegen muss, das es nicht am Bootloader hängt. Seit ich diesen Schwachpunkt in initrd (buffer overflow durch strcpy; behoben durch Einbau von strncpy in Version 0.1.0090, die läuft schon sehr stabil, aber ich weiß noch nicht, warum manche PC da Blödsinn machen) behoben habe, geht es mir besser. Der Bootloader ist schon echt klasse. Jetzt ist ja auch die Speichererkennung mit dabei. Man könnte noch ein FAT12 einbauen, dann könnte man den kernel als kernel.sys von Floppy laden. Aber das macht die Sache auch nicht besser.


  • Mod

    400.000 -> Bootloader wird garnicht erst geladen
    400.050 -> Bootloader startet verzögert (ca. 7 Sekunden)
    400.100 -> Bootloader startet verzögert (ca. 5 Sekunden)
    400.500 -> Bootloader startet verzögert (ca. 1 Sekunde)
    402.000 -> Bootloader startet vollkommen normal

    Getestet wurde übrigens mit jeweils 8 MB RAM (das Niedrigste, ohne eine Fehlermeldung von alloc_frame() zu bekommen, dass es keine freien Frames mehr gebe, um anschließend (außer bei 7MB RAM) im "Page Fault >>> Exception. System Halted! <<<" zu enden ;))

    Interessante Untersuchung, mach weiter so! 🙂
    Der minimalistische Denkansatz gefällt mir!

    Bei mir sieht das wie folgt aus:

    romimage: file=$BXSHARE/BIOS-bochs-latest

    cpu: count=1, ips=10000000, reset_on_triple_fault=1

    megs: 1024

    vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

    vga: extension=vbe

    floppya: 1_44=G:\OSDev\User\MyOS.img, status=inserted

    ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
    ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
    ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
    ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

    boot: floppy

    floppy_bootsig_check: disabled=0

    log: bochsout.txt

    panic: action=ask
    error: action=report
    info: action=report
    debug: action=ignore

    debugger_log: -

    parport1: enabled=1, file="parport.out"

    vga_update_interval: 300000

    keyboard_serial_delay: 250

    keyboard_paste_delay: 100000

    mouse: enabled=0

    private_colormap: enabled=0

    keyboard_mapping: enabled=0, map=

    i440fxsupport: enabled=0

    Momentan bin ich guter Dinge, weil sich das OS die letzten Tage gewaltig stabilisiert hat, sogar die Version mit initrd/VFS läuft jetzt stabil:
    ..

    Ich sehe aus praktischer Sicht vier Komponenten eines OS:

    1. PC/BIOS
    2. Bootloader
    3. Kernel
    4. Userspace

Anmelden zum Antworten