PrettyOS Fehler-/Testthread
-
Rev. 103:
PrettyOS erkennt nur großgeschriebene Dateien, ein Fehler, den ich sehr spät bemerkt habe..-.- Ist etwas ungünstig, da ich aus Gewohnheit immer kleine Buchstaben verwende.
-
Das kann ich nicht bestätigen, Cuervo...
-
Ich auch nicht...
Aber ich habe ein anderes Problem: Wenn ich hello.elf starte und weiter Backspace mache, als eigentlich möglich ist (und danach dann normal weiterspiele), bekomme ich beim Beenden einen Pagefault:
page not present at user-mode (errcode = 0x00000004) CR2 = 0x08080804 CS:EIP = 0x001B:0x0140050D SS:ESP = 0x0023:0x08080804 EFLAGS = 0x00000212 EAX = 0x00000000 EBX = 0x08080808 ECX = 0x08080808 EDX = 0x00000000 ESI = 0x08080808 EDI = 0x08081B08 EBP = 0x08080808 DS = 0x0023 ES = 0x0023 FS = 0x0023 GS = 0x0023
Ohne in den Code gesehen zu haben würde ich raten, dass da ein Stackoverflow geschieht: Vermutlich wird die Eingabe des Benutzers in einem Array auf dem Stack gespeichert. Wenn man zu oft Backspace drückt, dann wird der ganze Stack mit \b (also 0x08) überschrieben und dann werden am Ende des Programms die gespeicherten Register vom Stack geholt (so entstehen 0x08080808 in EBX, ECX, ESI, (EDI) und EBP). Dahinter steht dann wohl noch eine C-Funktion, die am Ende den Stackframe mit "mov esp,ebp" und "pop ebp" aufzulösen versucht. Erstere Funktion führt dazu, dass 0x08080808 in ESP geladen wird und die zweite zieht zuerst 4 von ESP ab (sodass 0x08080804 drinsteht) und versucht dann, einen Wert von dieser Adresse zu laden. Diese ist offensichtlich nicht gemappt und das führt dann zum PF an dieser Adresse.
q.e.d.
EDIT: PS, bitte mal die Vordergrundfarbe bei Panics ändern. Dieses Dunkelrot ist echt nicht zu erkennen, da macht man sich die Augen kaputt. Hellrot wäre besser.
-
komisch, also wenn ich z.B. hello eingebe, wird daraus HELLO .ELF und hello.elf wird nur gefunden, wenn es groß geschrieben ist (auf der Diskette)...
-
Cuervo schrieb:
komisch, also wenn ich z.B. hello eingebe, wird daraus HELLO .ELF und hello.elf wird nur gefunden, wenn es groß geschrieben ist (auf der Diskette)...
Natürlich wird daraus HELLO.ELF, auf FAT wird Groß- und Kleinschreibung nicht unterschieden und es ist vorgeschrieben, dass Dateinamen als Großbuchstaben (zumindest ohne VFAT) gespeichert werden.
-
mag sein, PrettyOS zeigt jedenfalls hello.elf unter fdir an statt HELLO.ELF und findet es nicht, vermutlich weil die Eingabe in Großbuchstaben umgewandelt wird.
-
Wenn du in den Quellcode der Shell sehen würdest, könntest du sehen, dass das tatsächlich so ist.
-
Dann hatte ich ja Recht^^
else { puts("file is being searched.\n"); settextcolor(2,0); toupper(entry);
Also ist das ein Fehler, weil die Datei ja hello.elf und nicht HELLO.ELF heißt.
-
vermutlich weil die Eingabe in Großbuchstaben umgewandelt wird
Wie gesehen, machen wir das FAT12-gerecht. Kleinschreibung ist nicht vorgesehen für Filename und Extension. Wenn also von anderen Sytemnen auf die Diskette geschrieben wird, bitte nur Großschreibung verwenden.
Wenn es dich momentan stört, nimmst Du das
toupper(entry);
eben raus.Damit haben wir den üblichen Konflikt zwischen Windows Client und Linux Server, wenn ich das richtig sehe.
Wie wird das allgemein im OSDEV-Bereich gehandhabt?
-
Cuervo schrieb:
Also ist das ein Fehler, weil die Datei ja hello.elf und nicht HELLO.ELF heißt.
Bei FAT ist es (ohne VFAT) halt einfach vorgeschrieben, dass der Dateiname großgeschrieben wird. Deshalb gibt es keinen Unterschied zwischen "hello.elf" und "HELLO.ELF".
EDIT: vgl. http://en.wikipedia.org/wiki/8.3_filename#Overview: "File and directory names are uppercase, although systems that use the 8.3 standard are usually case-insensitive."
oder auch http://en.wikipedia.org/wiki/File_Allocation_Table#Directory_table: "Legal characters for DOS file names include the following: Upper case letters A–Z [...]" -- "This excludes the following ASCII characters: [...] Lower case letters a–z; Stored as A–Z. [...]"
-
Weiß eigentlich jemand, warum man das damals so entschieden hat? Linux ist ja im Gegensatz dazu case-sensitive.
-
Der Zug bewegt sich bei mir immer unter Bochs nur weiter, wenn ich eine Taste drücke (oder ist das Absicht?).
-
Das ist überall so und liegt nicht an Bochs...
-
Der Zug bewegt sich bei mir immer unter Bochs nur weiter, wenn ich eine Taste drücke (oder ist das Absicht?).
Ja, das hat sich so ergeben, weil wir den inneren Loop nun nicht in der gesamten Shell, sondern nur in getch drehen (siehe Definition von getch in user-Lib). Wir fangen die vom Kernel zurück gegebene 0 dort ab.
-
Unter VirtualBox v3.1.4 r57640 stürtz PrettyOS Rev. 120 ab. Scheinbar geschieht dies, nachdem das Datum ausgegeben wird. Falls jemand interesse an der Log-Datei von VBox hat, ist diese hier zu finden: http://anubis2k5.bplaced.net/VBox.log
Unter Qemu läuft das OS normal.
-
Das Problem ist bekannt und auch mit Microsoft Virtual PC läuft PrettyOS derzeit nicht, anscheinend gibt es auch Probleme mit einigen echten PCs, die damit vlt. zusammenhängen.
-
00:00:03.394 PIT: mode=3 count=0x2e9b (11931) - 100.00 Hz (ch=0)
00:00:05.612 fatal error in recompiler cpu: triple fault
00:00:05.612 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00:00:05.612 !!
00:00:05.612 !! Guru Meditation -2301 (VERR_REM_VIRTUAL_CPU_ERROR)Leider versteht niemand bisher diesen "fatal error".
-
Sooo... Ich hab auch Fehler im Angebot
1. Page-Fault unter Qemu 0.12.2. Screenshot: http://kloke-witten.dyndns.org/~philipp/Temp/Fehler_Rev125.png
2. Uhr läuft ca. 2x zu schnell unter Virtual Box 3.1.4
3. Dieser Fehler ist etwas komplizierter zu beschreiben und ich hab ihn auch schon geschildert, wobei Erhard und ich nicht zu einer Lösung gekommen sind (Im IRC). Bevor das in Vergessenheit gerät, kommt hier die Fehlerbeschreibung (Ich hab das Verhalten auch noch etwas genauer Analysiert):
Das Problem tritt in Userprogrammen bei der Texteingabe auf. Die Backspace-Taste funktioniert nicht richtig, wenn man versucht, das erste Zeichen der Zeile zu löschen: Es wird das erste Zeichen dieser Zeile und das letzte Zeichen der vorigen Zeile gelöscht. Der Schreibcursor springt dann auch in die vorige Zeile. Testsystem: Virtual Box 3.1.4; Der Fehler tritt meines Wissens nach auch mit anderen Simulationen auf, komischerweise hab aber bislang nur ich ihn reproduzieren können.
mfg und in der Hoffnung, das die Fehler gefunden und behoben werden
Mr X
-
zu 3)
Das ist der Code von gets:char* gets(char* s) { int i=0; char c; //settaskflag(0); do { c = getch(); putch(c); if(c==8) // Backspace { if(i>0) { s[i-1]='\0'; --i; } } s[i] = c; i++; } while(c!=10); // Linefeed s[i]='\0'; //settaskflag(1); return s; }
Vielleicht fällt jemand da etwas auf? MrX und Cuervo mäkeln daran herum.
//settaskflag(0); <--- warum auskommentiert?
-
Nachdem ich mir gets() näher beguckt hab, bin ich zu dem Schluss gekommen, das der Fehler mglw. eher in getch() o.ä. zu suchen ist.
Abgesehen davon denke ich, das z.20 und 21 von einem else-Block umschlossen werden sollten; Es ist imho wohl eher nicht sinnvoll, Die Felder, wo gelöscht wurde mit dem Wert 8 zu füllen, nachdem man sie grad zuvor mit 0 gefüllt hat.