Sourcecode Fortschritt
-
Version 33:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=33Auf mancher Hardware klappt das Auslesen von Floppy-Inhalten nur jedes zweite Mal (Grund noch nicht klar). Work-around:
- User-Funktion floppy_dir() und Kernel-Funktion flpydsk_read_directory() erhielten einen Rückgabewert. fdir liest nun noch ein zweites Mal, wenn der Rückgabewert keine Inhalte anzeigt.
- DMA-Puffer wird vor dem Auslesen der root dir gelöscht, damit man die echten gelesenen Inhalte und keine alten Daten sieht.
- Timeout wurde von 5 auf 2 Sekunden verkürzt.
-
Version 34:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=34- time.h/time.c ergänzt, Datum/Zeit aus cmos.h/c in dieses Modul überführt
- Statusleiste: Datum und Zeit, zusätzlich vergangene Sekunden seit dem Start
- aktuelles FloppyImage.bin
- einiges wurde ausgeblendet (Ausdruck nach 'Diagnose' verlagert)FloppyImage (im Verzeichnis 'kernel') wurde mitgeliefert, damit man die neuesten Features sofort ansehen kann, z.B. mit Qemu (batch-Datei für Windows):
qemu-system-x86_64.exe -usbdevice mouse -fda FloppyImage.bin -boot a -localtime
-
Version 35:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=35- NULL als (void*) 0 redefiniert, wie in C üblich (vorher nur 0)
- NULL in paging.c ausgetauscht gegen 0 (wegen error: cast pointer to integer)
- itoa und reverse von K&R (siehe wikipedia), strcpy von wikipedia
- Rotierender ASCII Stern wurde umgefärbt und nach unten rechts in Statusleiste verschoben
- 2-Klausel-BSD-Lizenz und Disclaimer in os.h und ckernel.c für weitere Diskussionen erstmalig eingefügt, aber ganz unten wie abgesprochen (einmalig!)Offenes Problem:
In char* getCurrentDateAndTime(char* pStr) muss wie folgtint i; for(i=0;i<80;++i){pStr[i] = 0;}
der als Zeiger übergebene DateAndTime-String gelöscht werden. Ansonsten geht die Ausgabe schief und das OS stürzt wegen buffer overflow ab. Der Fehler liegt nicht in strcpy oder itoa, soweit ich das bisher sehe, also entweder in der Funktion selbst oder in strcat.
Der work-around funktioniert aber gut.
-
Version 36:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=36- Kleiner Bug beim Auslesen von Root Dir behoben (Punkt zwischen Name und Extension wurde immer beim ersten Mal nicht gesetzt, jetzt dann, wenn Eintrag nicht Volume Label ist)
Lob an unseren Chef-Tester Cuervo, dem aufgefallen ist, dass da BOOT2SYS steht anstelle BOOT2.SYS, wenn das Label leer war
Screenshot: http://www.henkessoft.de/OS_Dev/Bilder/PrettyOS_rev36.PNG
-
Version 37:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=37- Fehlerhaftes strcat ausgetauscht gegen Variante aus wikipedia, die strcpy und strlen einsetzt. Nun kann die for-Schleife am Anfang von getCurrentDateAndTime entfallen, die den ganzen String auf 0 setzte.
-
Version 38:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=38Heute ist mal wieder Spaß angesagt:
- Modul gags.h/c mit fahrendem Zug (aus wikipedia) <--- unbedingt ansehen!Dass dieses Modul nichts in einem "bare bone" Kernel zu suchen hat, ist mir selbstverständlich klar! Das war nur ein Test für das Feature Laufband. Ich habe eine einfache Idee - ohne großen API-Aufwand - gesucht für ein Programm, das man von der Floppy Disk laden und im User-Space laufen lassen kann. Das kam dabei heraus.
Screenshot: http://www.henkessoft.de/OS_Dev/Bilder/FahrenderZug.PNG
#include "os.h" #include "gags.h" // Zug als Beispiel übernommen aus // http://de.wikipedia.org/wiki/ASCII-Art#Allgemeine_Beispiele // TODO: eigene ASCII-Art erzeugen char* line1 = " _______ _______ <>_<> " ; char* line2 = " (_______) |_|_|_|_|_|_|| [] [] | .---|'\"`|---. " ; char* line3 = "`-oo---oo-'`-oo-----oo-'`-o---o-'`o\"O-OO-OO-O\"o' " ; void showTrain(int8_t val) { int i; char temp1,temp2,temp3; switch(val) { case 1: temp1 = line1[79]; temp2 = line2[79]; temp3 = line3[79]; for(i=79;i>0;--i) { line1[i] = line1[i-1]; line2[i] = line2[i-1]; line3[i] = line3[i-1]; } line1[0] = temp1; line2[0] = temp2; line3[0] = temp3; k_printf(line1,46,0xE); k_printf(line2,47,0xE); k_printf(line3,48,0xE); break; default: break; } }
-----------------------------------------------
Version 39:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=39
- Laufband ("fahrender Zug") im Kernel aus Effizienzgründen entfernt (auskommentiert) :xmas1:
// showTrain(1); // TODO: transfer to user space as elf exec format; k_printf as syscall
-----------------------------------------------
Version 40:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=40
- gags.h/c im Kernel entfernt
- syscalls ergänzt
- showInfo(val) testweise im User-Bereich eingebaut; Laufband-Funktion noch nicht vorhanden (TODO: separate Task)
- makefile korrigiert im User-Bereich
-
Der Zug ist mega cool!
Version 41: Unterstriche in den Ordnernamen und das Präfix "k_" in Funktionsnamen entfernt.
-
Version 42:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=42- getCurrentSeconds() in userlib.h/c nachgerüstet (program.c wird jetzt kompiliert) <--- Dank an Cuervo für das Auffinden dieses Fehlers
- gags.h/c im Kernel gelöscht (Funktion ist in program.c)Der Zug ist mega cool!
Thanks!
-
Version 43:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=43- In start.asm aus user/user_program_c das Ausnullen der BSS entfernt, ist afaik sowieso schon auf 0 und ergab bei mir wegen Integer-Underflow in ecx 'nen fiesen Fehler.
- Noch zwei oder drei Funktionen mit "k_"-Präfix gefunden und korrigiert.
- kernel/gdt.inc gelöscht, da anscheinend ungenutzt (dann auch stage2_bootloader/gdt2.inc wieder in gdt.inc umbenannt)
- mingw32-make.exe, nasmw.exe, CreateFloppyImage.exe, BootDisk2BootStick.exe, dd.exe und bochs.bxrc in Ordner "tools"
- Das Erstellen des Images, Entfernen aller .o-Dateien jetzt in globalem makefile
- Aufrufen von Bochs, Qemu oder das Bauen der Diskette in Batch-File. Die Batch-Datei kann "einfach so" aufgerufen werden, dann kompiliert alles. Wird als Parameter "bochs" übergeben, wird das Image in Bochs ausgeführt. Wird (evtl zusätzlich) "disc" übergeben, wird alles auf die Diskette geschrieben. Für Qemu und anderes können wir auch noch was basteln. Und das ganze noch als Shellskript für die Linuxer schreiben, ist bisher nur als Stub vorhanden.
TODO:
Der Stack der User-Prozesse muss vom Kernel gesetzt werden, jeder braucht auch seinen eigenen Stack. In unserem User-Programm zumindest wird der Stack händisch auf 0x60000 gesetzt. Erhard, du kennst dich in dem Tasking-Modul doch aus, magst du mal probieren, jedem Prozess seinen eigenen Stack zu geben? Irgendwo unter 0xC0000000 oder so..@Erhard: Wird "quickformat_Floppy_A.bat" noch gebraucht?
-
Version 44 & 45: Minimale Änderungen. U.a. die Linux-Version von CreateFloppyImage hinzugefügt. Ging aber nicht so einfach, weil einmal ein Ordner mit demselben Namen existiert hatte, schien SVN zu stören. Egal, es heißt jetzt CreateFloppyImage2.
-
Version 45 baut so nicht auf:
G:\OSDev\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
nasmw -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader/boot.bin
nasmw -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage1_bootloader/boot2.bin
rm .o -f
i586-elf-gcc user/user_program_c/.c -c -Iuser/user_program_c -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
i586-elf-ld *.o -T user/user_program_c/user.ld -Map user/user_program_c/kernel.map -nostdinc -o user/user_program_c/program.elf
c:\crosstools\bin\i586-elf-ld.exe: warning: cannot find entry symbol _start; defaulting to 01400000
rm *.o -f
tools/make_initrd user/init_rd_img/test1.txt file1 user/init_rd_img/test2.txt file2 user/init_rd_img/test3.txt file3 user/user_program_c/program.elf shell
writing file user/init_rd_img/test1.txt->file1 at 0x1304
writing file user/init_rd_img/test2.txt->file2 at 0x1327
writing file user/init_rd_img/test3.txt->file3 at 0x134a
writing file user/user_program_c/program.elf->shell at 0x1910
mv initrd.dat kernel/initrd.dat
rm .o -f
i586-elf-gcc kernel/.c -c -Ikernel/include -std=c99 -march=i386 -mtune=i386 -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude
nasmw -O32 -f elf kernel/data.asm -Ikernel/ -o data.o
nasmw -O32 -f elf kernel/flush.asm -Ikernel/ -o flush.o
nasmw -O32 -f elf kernel/interrupts.asm -Ikernel/ -o interrupts.o
nasmw -O32 -f elf kernel/kernel.asm -Ikernel/ -o kernel.o
nasmw -O32 -f elf kernel/process.asm -Ikernel/ -o process.o
i586-elf-ld *.o -T kernel/kernel.ld -Map kernel/kernel.map -nostdinc -o kernel/kernel.bin
rm *.o -f
tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin stage2_bootloader/boot2.bin kernel/kernel.bin
Cannot open the file 'stage2_bootloader/boot2.bin'
mingw32-make: *** [ckernel] Error -1Wenn ich build.bat disc in der Konsole eingebe, wird boot2.sys nicht kopiert.
boot2.bin landet in stage1_bootloader :xmas2:
---------------------------------------------------------
Notwendige Korrektur:
makefile, , Zeile 26/27:
boot2: $(wildcard $(STAGE2DIR)/*.asm $(STAGE2DIR)/*.inc) $(NASM) -f bin $(STAGE2DIR)/boot2.asm -I$(STAGE2DIR)/ -o $(STAGE2DIR)/boot2.bin
boot.asm, Zeile 264:
ImageName db "BOOT2 BIN"
boot.asm, Zeile 268:
msgFailure db 0x0D, 0x0A, "BOOT2.BIN MISSING", 0x0D, 0x0A, 0
boot2.asm, Zeile 26:
msgFailure db 0x0D, 0x0A, "Missing KERNEL.BIN", 0x0D, 0x0A, 0x0A, 0
Dann startet aber der Kernel immer noch nicht!
-
Version 46:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=46Die neuen Bezeichnungen boot2.bin und kernel.bin wurden überall eingebaut und der Fehler im Makefile behoben.
Der Kernel wird aber noch nicht gestartet!
-
Version 47:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=47Nun überall Großschrift in den asm für die Dateinamen (BL1, BL2)
Alles auf BIN gesetzt (nicht mehr SYS)
Fehler im makefile berichtigt: start.asm (user) wurde nicht assembliertNun gibt es einen ASSERTION Fehler:
ASSERTION FAILED((const void*)(header->entry) == USERCODE_VADDR) at kernel/elf.c
:153OPERATING SYSTEM HALTED
-
Sorry für die Verwirrung! Bin auch gerade online gegangen weil ich die Fehler bemerkt hatte, beim Übertragen auf den INet-Rechner ist wohl was schief gelaufen.
Die meisten Sachen hast du ja erfolgreich behoben, die start.asm aus dem User-Prozess muss noch mitkompiliert werden (ist irgendwie aus dem Makefile rausgeflutscht) und ein assert muss aus elf.c raus:
ASSERT( (const void*)(header->entry) == USERCODE_VADDR );
Das User-Programm startet nämlich nicht bei 0x01400000, sondern 0x200 Bytes später. Warum auch immer. Funktioniert aber trotzdem.
=> Version 48
-
Folgendes geht bei mir lokal:
- ASSERTION in Zeile 153 auskommentiert, damit die shell startet (Grund für diese Maßnahme momentan unklar)
- readelf und batch-Datei in User
- floppy_build.bat für direktes Starten des Build-Prozesses im ExplorersMomentan kann ich nicht committen wegen Konflikt
Super! Badestrand und ich haben das gleiche gemacht. Ich schieb mal meine Luxusklasse-Ausführung für faule Windows-Anwender hinterher:
Version 49
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=49In bochs bevorzuge ich übrigens
floppya: 1_44=a:, status=inserted
Vielleicht sollte man auf Dauer zwei verschiedene versionen anbieten.
-
Version 50:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=50Nun ist BOOT2.BIN und KERNEL.BIN im makefile groß geschrieben, damit es auch unter Linux problemlos läuft.
elf.c:
Zeile 129: ASSERT( header->phnum == 1 );
Zeile 152: ASSERT( (const void*)(ph->vaddr) == USERCODE_VADDR );
müssen evtl. unter Linux noch auskommentiert werden.In Windows klappt das mit dem Cross-Compiler auch mit den ASSERTs.
-
Version 51: (badestrand)
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=51
- Run the build.bat file with qemufloppy or qemuimage as parameter to start qemu.Version 52: (Erhard Henkes)
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=52
- Systemfrequenz auf 1000 Hz erhöht
- getCurrentMilliseconds() ergänzt (syscall)
- "Zug" bewegt sich alle 20 Millisekunden flüssig nach vorneEs war mir ein Bedürfnis den "Zug" (Beispielanwendung für das dreizeilige Laufband) zu :xmas1: Weihnachten :xmas2: betriebsbereit zu haben. Er läuft im User-Bereich (z.Z. noch in der Shell) lässt sich durch den neuen Millisekunden-Timer und die neue System-Frequenz von 1000 Hz ziemlich rasant über den Bildschirm bewegen. Leider ist er noch keine eigene Task. Daher kann man ihn z.B. mit langwierigen Aktionen wie 'fdir' ausstoppen.
Anstelle des Zuges könnte auch Ihre Werbung stehen.
-
Version 53:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=53- Folgendes auskommentiert in elf.c:
Zeile 11: static const void* USERCODE_VADDR = (void*)0x01400000;
Zeile 129: ASSERT( header->phnum == 1 );
Zeile 152: ASSERT( (const void*)(ph->vaddr) == USERCODE_VADDR );- Folgendes ergänzt:
Zu den CFLAGS noch "-m32" hinzufügen
In die Linkerscripte (kernel.ld, user.ld) "OUTPUT_ARCH(i386)" hinzufügenNun sollte es von Seiten Linux und 64-Bit keine Barrieren geben. Erste Tests bestätigen dies!
http://www.cyberciti.biz/tips/compile-32bit-application-using-gcc-64-bit-linux.html
-
Version 54:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=54- build.sh für Linux ergänzt
- tools/bochsrc ergänzt
- Zug auf vielfachen Wunsch etwas ausgebremst (40 Zeichen/sec) :xmas1:Der "Zug" steht nur stellvertretend für das zukünftige Informationsband, in dem Diagnosedaten angegeben werden. Wir wollen ja ein Lehr-OS schaffen.
-
Version 55:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=55
-fno-pic im makefile ergänzt
in userlib.c __asm__ anstelle asmScreenshot: http://www.henkessoft.de/OS_Dev/Bilder/Rev55.PNG