PrettyOS Fehler-/Testthread
-
zu 1) das liegt an der in Paging neu eingebauten Funktion, die momentan nur ab 0xF0000000 funktioniert. Badestrand untersucht diesen Punkt bereits.
zu 3) MS VPC läuft ok; Sun VB wirklich merkwürdig mit den Sekunden.
Man schafft es auch eher, bei Sun VB durch heftiges Drücken der Backspace-Taste in die obere Zeile zu geraten. Bei MS VPC gelingt mir das nicht.
MS VPC ist für Tests offenbar gar nicht so schlecht geeignet.
-
An gets(...) wird immer noch herum gemeckert.
Bei mir klappt es soweit. Grund für Probleme liegt vermutlich an anderer Stelle. Eingegebener String kommt sauber an. Rücksprung auf obere Zeile nur selten (muss mit dem Taskwechsel zusammen hängen, den man ja ausschalten kann in der Funktion <--- wurde von MrX getestet: brachte nichts). Mysteriös.
-
Ich hab PrettyOS mal durch cppcheck gejagt. Folgendes Ergebnis kam raus (Irrelevantes à la "use fgets instead of gets" entfernt):
[elf.c:74]: (style) struct or union member 'elf_header_t::shoff' is never used [elf.c:75]: (style) struct or union member 'elf_header_t::flags' is never used [elf.c:76]: (style) struct or union member 'elf_header_t::ehsize' is never used [elf.c:79]: (style) struct or union member 'elf_header_t::shentrysize' is never used [elf.c:80]: (style) struct or union member 'elf_header_t::shnum' is never used [elf.c:81]: (style) struct or union member 'elf_header_t::shstrndx' is never used [elf.c:101]: (style) struct or union member 'program_header_t::paddr' is never used [elf.c:104]: (style) struct or union member 'program_header_t::flags' is never used [elf.c:105]: (style) struct or union member 'program_header_t::align' is never used [fat12.c:676]: (style) The scope of the variable j can be reduced [paging.c:33]: (style) struct or union member '__attribute__::ext' is never used [video.c:177]: (style) The scope of the variable temp can be reduced [../tools/src/CreateFloppyImage.cpp:30]: (style) struct or union member 'BootSector::ignore1' is never used [../tools/src/CreateFloppyImage.cpp:31]: (style) struct or union member 'BootSector::oem_name' is never used [../tools/src/CreateFloppyImage.cpp:38]: (style) struct or union member 'BootSector::media_destriptor_byte' is never used [../tools/src/CreateFloppyImage.cpp:40]: (style) struct or union member 'BootSector::sectors_per_track' is never used [../tools/src/CreateFloppyImage.cpp:41]: (style) struct or union member 'BootSector::head_count' is never used [../tools/src/CreateFloppyImage.cpp:42]: (style) struct or union member 'BootSector::hidden_sectors' is never used [../tools/src/CreateFloppyImage.cpp:43]: (style) struct or union member 'BootSector::sector_count_ex' is never used [../tools/src/CreateFloppyImage.cpp:44]: (style) struct or union member 'BootSector::drive_number' is never used [../tools/src/CreateFloppyImage.cpp:45]: (style) struct or union member 'BootSector::ignore2' is never used [../tools/src/CreateFloppyImage.cpp:46]: (style) struct or union member 'BootSector::boot_signature' is never used [../tools/src/CreateFloppyImage.cpp:47]: (style) struct or union member 'BootSector::volume_serial' is never used [../tools/src/CreateFloppyImage.cpp:48]: (style) struct or union member 'BootSector::fs_name' is never used [../tools/src/CreateFloppyImage.cpp:50]: (style) struct or union member 'BootSector::bootloader' is never used [../tools/src/CreateFloppyImage.cpp:51]: (style) struct or union member 'BootSector::bootloader_sig' is never used [../user/user_program_c/userlib.c:418]: (style) The scope of the variable i can be reduced [../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced [../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced [../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced [../user/user_test_c/userlib.c:418]: (style) The scope of the variable i can be reduced [../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced [../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced [../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
Die Scope-Warnungen hab ich schonmal gefixt:
fat12.c:void parse_dir(uint8_t* a, int32_t in, struct dir_entry* rs) { int32_t i = (in %DIR_ENTRIES) * 32; for(int32_t j=0;j<8;j++,i++) { rs->Filename[j] = a[i]; } for(int32_t j=0;j<3;j++,i++) { rs->Extension[j] = a[i]; } //...
video.c:
void scroll() { uint32_t blank = 0x20 | (attrib << 8); if(csr_y >= SCROLL_LINE) { uint32_t temp = csr_y - SCROLL_LINE + 1; memcpy (vidmem, vidmem + temp * COLUMNS, (SCROLL_LINE - temp) * COLUMNS * 2); memsetw (vidmem + (SCROLL_LINE - temp) * COLUMNS, blank, COLUMNS); csr_y = SCROLL_LINE - 1; } }
userlib.c:
void showInfo(signed char val) { static char* line1 = " _______ _______ <>_<> " ; static char* line2 = " (_______) |_|_|_|_|_|_|| [] [] | .---|'\"`|---. " ; static char* line3 = " `-oo---oo-'`-oo-----oo-'`-o---o-'`o\"O-OO-OO-O\"o' " ; if(val==1) { char temp1 = line1[79]; char temp2 = line2[79]; char temp3 = line3[79]; for(int 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; printLine(line1,46,0xE); printLine(line2,47,0xE); printLine(line3,48,0xE); } }
-
Danke! Wird demnächst implementiert.
Irrelevantes à la "use fgets instead of gets" entfernt
Ist schon berechtigt, denn momentan kann man locker über den Puffer hinaus schreiben. Damit kann man sich in unser OS "hinein hacken". Das gets sollten wir wirklich implizit in ein "fgets" mit stdin als file verwandeln.
-
Revision 151
Ja, hallo erstmal!
Die "FloppyImage.bin" funktioniert unter/auf "MS Virtual-PC" einigermaßen perfekt. Allerdings gibt es ein Problem in der "ckernel.c" bzw. in der "time.c":
// ckernel.c Revision 151 if (CurrentSeconds!=CurrentSecondsOld) { itoa(CurrentSeconds, timeBuffer); getCurrentDateAndTime(DateAndTime); // <- arbeitet nicht korrekt strcat(DateAndTime, " "); strcat(DateAndTime, timeBuffer); strcat(DateAndTime, " seconds since start."); // output in status bar printf(DateAndTime, 49, 0xC); }
"getCurrentDateAndTime" arbeitet wie ein "strcat". Darum wird der String pro Aufruf immer länger. Nach spätestens drei Aufrufen blockiert die VM, was heißt, daß "nichts mehr geht".
Leider bin ich zu doof dafür um mir ein PrettyOS selbst zu kompilieren. Deshalb mußte ich die "FloppyImage.bin" reversen.
-
+gjm+ schrieb:
Leider bin ich zu doof dafür um mir ein PrettyOS selbst zu kompilieren. Deshalb mußte ich die "FloppyImage.bin" reversen.
Woran hapert's denn? Wir können da bestimmt helfen
-
Das könnte inzwischen auch einfacher geworden sein: Wir haben ein neues makefile. Das hilft, wenn Du es unter Windows versuchst, da msys nicht mehr nötig ist.
-
"getCurrentDateAndTime" arbeitet wie ein "strcat". Darum wird der String pro Aufruf immer länger. Nach spätestens drei Aufrufen blockiert die VM, was heißt, daß "nichts mehr geht".
Danke für den Hinweis. Sehr wichtig, da wir Sun VB für USB EHCI Tests brauchen!
-
"doof" ist bei mir ein Synonym für "faul". Außerdem bin ich als "Windowser" nun mal verwöhnt (und verweichlicht).
Revision 146
Die Revision 146 läuft unter/auf "MS Virtual-PC" auch, sofern man die o.g. if-Abfrage in der ckernel.c "rauswirft":
// FloppyImage.bin Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000049B0 00 00 89 C3 39 C7 [b]74[/b] 62 83 EC 08 8D 45 D4 50 53 Offset 49B6: 74 (JE) ersetzen durch EB (JMP)
Allerdings wundert es mich, warum die Revision 146 auf "realen" PCs gelaufen sein soll. Eigentlich hätte es eine Art "Buffer Overflow" geben müssen.
-
Das kompilieren unter Windows sollte eig. auch nicht mehr so schwer sein
Das Problem mit dem Absturz unter VPC und VB hat ehenkes übrigens soeben behoben.
Dafür hab ich folgendes entdeckt:
Wir haben einen Schreibcursor. Dies hab ich erst jetzt gemerkt, da er bei mir nur unter Microsoft Virtual PC funktioniert (Nutze ich selten). Qemu und Virtual Box zeigen ihn schlichtweg nicht an.
Das dürfte ein Fehler sein.Die zu schnelle Uhr unter Virtual Box besteht auch weiterhin.
-
So, hier alle meine Test-PCs für PrettyOS:
-
D:\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS nasmw -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloade r/boot.bin nasmw -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootload er/BOOT2.BIN del *.o nasmw -O32 -f elf user/user_program_c/start.asm -Iuser/user_program_c/ -o start. o i586-elf-gcc user/user_tools/userlib.c -c -Iuser/user_tools -m32 -std=c99 -Wshad ow -march=i386 -mtune=i386 -m32 -fno-pic -Werror -Wall -O -ffreestanding -fleadi ng-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude process_begin: CreateProcess(NULL, i586-elf-gcc user/user_tools/userlib.c -c -Iu ser/user_tools -m32 -std=c99 -Wshadow -march=i386 -mtune=i386 -m32 -fno-pic -Wer ror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builti n -fno-stack-protector -Iinclude, ...) failed. make (e=2): Das System kann die angegebene Datei nicht finden. mingw32-make: *** [initrd] Error 2
Kann jemand damit was anfangen???
Cygwin ist aus dem Pfad herausgenommen.
-
Nochmal ich: Revision 163 läuft unter VBox mehr oder wenige in einer Endlosschleife. Ständig wiederholt sich der USB-Status. Befehle scheinen aber abgearbeitet zu werden. Unter Qemu hingegen läuft das System normal.
-
Ständig wiederholt sich der USB-Status. <--- wenn dich das stört, hier abschalten:
initEHCIHostController(); // used only for first tests
Zeile 188 pci.c auskommentierenoder:
in Sun VBox einfach unter Änderungen / USB / USB 2.0 checkbox deaktivieren
-
Revision 162
anubis2k5 schrieb:
Kann jemand damit was anfangen???
Ja, Das Problem hatte ich auch.
"mingw32-make.exe" findet die "i586-elf-gcc.exe" nicht. Versuch mal die "Umgebungsvariablen" korrekt zu setzen, so wie Cuervo es hier im ersten Beitrag beschrieben hat ( -> pdf).
Mr X schrieb:
Die zu schnelle Uhr unter Virtual Box besteht auch weiterhin.
Das liegt an der "systemTimer_setFrequency" aus der "timer.c" Das "command byte" sollte besser auf "Mode 2" gesetzt werden:
// timer.c Revision 162 void systemTimer_setFrequency( uint32_t freq ) { (...) // Send the command byte // outportb(0x43, 0x36); // 0x36 -> Mode 3 : Square Wave Generator outportb(0x43, 0x34); // 0x34 -> Mode 2 : Rate Generator (...) }
Mr X schrieb:
Wir haben einen Schreibcursor. Dies hab ich erst jetzt gemerkt, da er bei mir nur unter Microsoft Virtual PC funktioniert (Nutze ich selten).
Qemu und Virtual Box zeigen ihn schlichtweg nicht an. Das dürfte ein Fehler sein.Der "Schreibcursor" ist ein Feature von "Virtual-PC". Wenn die "update_cursor" aus der "video.c" so hier verändert wird:
// video.c Revision 162 void update_cursor() { (...) position = 0; outportb(0x3D4, 0x0E); (...) }
dann erscheint der Schreibcursor immer an Position (0,0) obwohl die Eingaben stets an der korrekten Position sind.
-
Cuervo schrieb:
So, hier alle meine Test-PCs für PrettyOS:
Bei Deiner Sammlung fühle ich mich richtig heimisch
-
Zum Fehler gerade warum sich VirtualBox bei mir mit einem Fehler verabschiedet:
Es sieht so aus als wenn nach dem Aktiveren von Paging in den Bereich zwischen 0 und 20 mb geschrieben wird. Dieser Bereich ist zwar gemappt, aber (Außer 0xB8000) nicht zum schreiben freigegeben. Setze ich in paging.c in Zeile 252 noch MEM_WRITE läuft es. Wo das passiert und warum das scheinbar nur bei mir auftritt hab ich noch nicht überprüft.
-
Revision 169 (und folgende)
Wenn die KERNEL.BIN nach dem Kompilieren größer 52.732 Bytes ist, dann bleiben VPC und VB schon beim Booten stecken.
Das Problem ist in der "Fat12.inc" und dort ab Label "LoadFile:".
Kurz gesagt, wenn BX ein "Wrap-Around" macht (was heißt von z.B. 0xFF00 + 0x0200 auf 0x0100 kommt), dann muß das Segmentregister ES entsprechend aktualisiert werden (i.e. ES = ES + 0x0100).
Anderenfalls überschreibt "ReadSectors" via [es:bx] etwas und/oder bleibt einfach im "int 0x13" stecken.
-
Danke für den Hinweis. Ich habe die kernel.bin zunächst auf ca. 50 KB verkleinert (ab Rev. 175), damit wir da nicht anstoßen. Aber da muss uns was einfallen.
-
Revision 175
Zunächst einmal, entschuldigt bitte, daß ich noch bei Revision 175 bin. Aber ich schreibe gerade an einem Userprogramm, welches auf Festplatten zugreifen kann. Dazu mussten einige Dateien geändert werden und ich habe keine Lust, sie bei jeder neuen Revision wieder zu ändern.
~Eigentlich soll das ja ein Kerneltreiber werden. Aber die großzügigen Debugausgaben und ein kleines Menü zur bequemeren Bedienung beim Testen (typisch Windowser) haben leider den Umfang der KERNEL.BIN gesprengt. :(~
Nun zum Thema:
Wenn man in der Shell versehentlich eine falsche Eingabe macht, dann werden auch "leere" Einträge angezeigt. Das stört etwas beim Testen. Bislang löse ich das Problem via "Hotfix":
// fat12.c Revision 175 uint32_t search_file_first_cluster(const char* name, const char* ext, struct file* f) { (...) for(uint8_t i=0;i<224;i++) { read_dir(&entry, i, 19, false); if ((&entry)->Filename[0] == 0) { break; } // <- wenn der eintrag leer ist, dann kommen auch keine mehr. also raus hier :) (...) } (...) }
Eventuell könnte der Hotfix mal verschwinden?
Btw.:
Ihr seid ja beim Thema USB ganz schön am ackern.Hoffentlich kommt dabei der Spaß nicht zu kurz!