PrettyOS Fehler-/Testthread



  • Rev. 89 läuft bei mir Fehlerfrei. Auch das mehrfache ausführen von hello.elf funktioniert tatellos!



  • eigentlich funktioniert alles soweit, aber ich hab noch etwas (nicht so wichtig, eigentlich) gefunden: Die Sekunden seit dem Start laufen viel! zu schnell.



  • Noch ein (erheblich größeres) Problem.
    Es kommt mglw. durch das Multithreading.

    Die Konsolenausgabe läuft nicht geordnet. Das äußert sich wie folgt:
    Textfarbe ändert sich ohne zutun meinerseits mitten im user-programm und es werden Zeilen vertauscht. Dies tritt insbesondere nach Benutzereingabe auf.

    EDIT: hälfte vergessen 😉
    getch funktioniert garnicht; selbe problem wie gehabt (falls das eigentlich hätte behoben sein sollen)


  • Mod

    getch funktioniert garnicht; selbe problem wie gehabt

    Hast Du den Stack-Pointer auch gegenüber program.c verändert für das weitere Programm hello.c (oder test.c oder was auch immer)? Ist offenbar notwendig. Darüber müssen wir noch diskutieren.
    start.asm:

    ; start.asm
    
    [BITS 32]
    extern __bss_start
    extern __end
    extern _main
    extern _exit
    extern _test
    global _start
    
    _start:
        mov esp, 0x500000 ; stackpointer
        call _main	
    
    	call _exit	
    	call _test
    	jmp  $
    


  • ich hab die neue start.asm verwendet...


  • Mod

    OK, dann wundert mich das schon etwas. Kannst Du genau ausführen oder testen, was nicht geht? Mit was testest Du (real, simulation)?



  • ich teste mit Virtual Box 3.1.2

    Hab übrigens da gleich mal virtualPC gestartet: Kann keine User-progs laden. Lesefehler von der Disk


  • Mod

    Ja, das ist mir auch schon aufgefallen, dass Virtual PC nicht von Floppy liest. Real geht es aber, zumindest bei meinen Test-PC. 🙂



  • Ich weiß nicht ob das schon irgendwo aufgenommen wurde: Nach dem Programmstart (hello.elf, clear.elf) wird der Prompt nicht wieder neu gezeichnet. Habs jetzt auch nochmal in VirtualBox getestet, wo's auch perfekt läuft.


  • Mod

    Ja, bei mir läuft es auch in Sun VB. In der Rev. 90 wurden noch zwei Fehler im Kernel beseitigt.


  • Mod

    Anmerkungen zu Rev. 91:

    mit echter Floppy: (klappt offenbar nicht überall lt. Cuervo)
    - FAT lesen zu langsam (umbauen auf einmaliges Lesen der gesamten FAT in ein Array, dann evtl. nur die Blöcke von 12 Bit entziffern, die wirklich für ein File beim Laden gebraucht werden)
    - #define FATMAXINDEX 150 ///TEST <--- nur als Test brauchbar, denn der Wert kann überschritten werden (momentaner work-around: floppy disk vor dem Aufspielen der Files formatieren), dann #PF als Ergebnis

    Allgemein:
    - Zeichenausgaben (incl. Farbe) geraten beim Taskwechsel noch allgemein durcheinander (Kritische Ressourcen während Benutzung allokieren für eine Task --> "critical section")

    - shell: Eingabe "hello.elf" --> sucht nach ".elf" (Eingabe-Algo überarbeiten)

    Simulationen:
    - MS Virtual PC liest nicht von Floppy



  • Rev. 91 läuft stabil in VirtualBox und Qemu.

    Wer schreibt eigentlich an der Shell? Würde mich da gern einbringen und unterstützend wirken. Ebenso was externe Programme betrifft.


  • Mod

    Wer schreibt eigentlich an der Shell? Würde mich da gern einbringen und unterstützend wirken.

    Ich schreibe an der shell. Vielleicht findet jemand heraus, wie man die Abfrage der shell so umbauen kann, dass sowohl

    "hello", "hello.elf", "hello .elf", "hello  .elf", "hello   .elf"
    

    (1,4,5 geht, wenn ich das richtig sehe; 2 u. 3 werden als ".ELF" gewertet) als

    "HELLO   ELF"
    

    interpretiert wird. Da habe ich mich irgendwie verhaspelt, das ging sogar schon.

    Ebenso was externe Programme betrifft.

    Das machen wohl einige momentan. Gute Ideen werden hier gerne gesehen. Man muss ja nur hello.c austauschen gegen eigenen Code. Allerdings sind die userlib.h/c und die syscalls noch ziemlich rudimentär. Anregungen werden gerne entgegen genommen.



  • Erhard Henkes schrieb:

    Vielleicht findet jemand heraus, wie man die Abfrage der shell so umbauen kann, dass sowohl

    "hello", "hello.elf", "hello .elf", "hello  .elf", "hello   .elf"
    

    (1,4,5 geht, wenn ich das richtig sehe; 2 u. 3 werden als ".ELF" gewertet) als

    "HELLO   ELF"
    

    interpretiert wird.

    Mit einem svn diff von

    Index: user/user_program_c/program.c                               
    ===================================================================
    --- user/user_program_c/program.c       (Revision 91)              
    +++ user/user_program_c/program.c       (Arbeitskopie)             
    @@ -149,7 +149,7 @@                                                
                       }                                               
                   }                                                   
    
    -              for(i=posPoint+1;i<12;i++)                          
    +              for(i=posPoint+1;i<posPoint+4;i++)                  
                   {                                                   
                       ext[i-posPoint-1]=entry[i];                     
                   }
    

    funktioniert es, also eine Ersetzung in Zeile 152 der benannten Datei.

    Ohne diese Änderung gibt es einen Pufferüberlauf auf dem Stack, somit wird "name" überschrieben und am Ende kommt ".ELF" raus ("name" beginnt mit '\0').


  • Mod

    Merkwürdig, ich wusste doch, dass das schon geklappt hat. Danke nochmals. 🙂



  • Du schreibst auch vieles, was du im IRC sagst, nochmal ins Forum. 😉


  • Mod

    Wir loggen das IRC nicht zentral mit, daher ist das "Forum" ein wichtiges Kommunikationsmedium, in dem der Fortschritt und die Wirren von PrettyOS festgehalten werden sollten. Daher die Bitte, alle wichtigen Beiträge hier ebenfalls einzupflegen. 🙂



  • 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. 😉


Anmelden zum Antworten