Sourcecode Fortschritt



  • Revision 300:

    - BS wird nun vor der restlichen Ausgabe angezeigt, damit man diese vollständig sieht.
    - BS in Funktion ausgelagert


  • Mod

    Rev. 301:

    paging.c: 0x400000 bis 0x600000 wird nicht mehr für User frei gegeben
    ehci.c: beschleunigte Ausgabe
    os.h/start.asm: USER-Stack 0x1420000



  • Revision 302:

    * Leichte optische Anpassungen bei einem Systemfehler, dient der besseren Übersicht

    Leider verweigert mein SVN-Client grundsätzlich das Hochladen des Diskettenimages. Ich bitte diesbezüglich um Verständnis.


  • Mod

    Version 0.0.0.302 läuft auf VMWare, VBox, VPC, Qemu, Bochs 🙂

    Bitte beachten, dass alte elf-Dateien, die mit esp 0x500000 oder 0x600000 in start.asm compiliert wurden, jetzt nicht mehr laufen.


  • Mod

    Rev. 303:

    task.c: nun den user-esp richtig übergeben in create_task

    if (privilege == 3)
        {
            // general information: Intel 3A Chapter 5.12
            *(--kernel_stack) = new_task->ss = 0x23;    // ss
            *(--kernel_stack) = USER_STACK; // esp
            code_segment = 0x1B; // 0x18|0x3=0x1B
        }
    

    start.asm: kein setzen des esp mehr notwendig, damit mehr Freiheit im OS

    _start:
        ; mov esp, 0x1420000 ; stackpointer <--- nicht mehr notwendig
        call _main	
        call _exit
    

    👍



  • Revision 304:

    * Neue Startmelodie

    // Melody
    	// C Es F G F Es
    	// C E F G F E C
    	// http://www.flutepage.de/deutsch/goodies/frequenz.shtml (German)
    	// http://www.flutepage.de/englisch/goodies/frequenz.shtml (English)
    	beep(523,200); // C
    	beep(622,200); // Es
    	beep(689,200); // F
    	beep(784,200); // G
    	beep(689,200); // F
    	beep(622,200); // Es
    
    	beep(523,200); // C
    	beep(659,200); // E
    	beep(689,200); // F
    	beep(784,200); // G
    	beep(689,200); // F
    	beep(659,200); // E
    
    	beep(523,1000); // C
    

    * Makefile verändert: Es werden jetzt FloppyImage.bin und FloppyImage.img erstellt => Kompatibilität verbessert und KERNEL.BIN wird beim clean gelöscht, weil der ab und zu noch das alte verwendet hat^^
    * const char* version = "0.0.0.303"; wurde zu const char* version = "0.0.0.304";

    Leider läuft diese Version (bzw. die vorherigen) auf keinem meiner PCs.. einmal PF nach starten der Shell, einman GPF nach laden des Kernels (direkt GPF als erste Ausgabe)...


  • Mod

    Rev. 305:

    - Korrekturen in console.c (Hinweis +gjm+) integriert
    - flush.asm (Kommentar verbessert)

    Ein PC stürzt noch bei der Eingabe einer gültigen Zahl in TTT ab. Das könnte aber auch am User-Programm liegen.


  • Mod

    Rev. 306:

    initEHCIflag auf false initialisiert (Dank an Cuervo für den Hinweis!)


  • Mod

    Rev. 307:

    TTT: atoi aus userlib verwendet, geringe Veränderungen bei Eingabe (auf einem PC stürzt das Programm allerdings immer noch nach Eingabe einer gültigen Ziffer ab, auf einem anderen läuft es).


  • Mod

    Rev. 308:

    TTT 0.54 (hello.c): Globale Variablen beseitigt --> Kein Absturz mehr bei Eingabe valider Daten!

    Wieso können auf manchen PCs keine globalen Variablen verwendet werden im User-Programm? Wo liegt das genaue Problem?



  • Erhard Henkes schrieb:

    Wieso können auf manchen PCs keine globalen Variablen verwendet werden im User-Programm? Wo liegt das genaue Problem?

    Die Funktionen sind nicht mehr reentrant 😕



  • Probleme mit globalen Variablen haben manchmal mit einem kaputten ELF-Loader zu tun.


  • Mod

    Probleme mit globalen Variablen haben manchmal mit einem kaputten ELF-Loader zu tun.

    Code und Stack arbeitet gut, nun müssen wir uns im User-Bereich noch um die saubere Verarbeitung des Data-Bereiches kümmern.

    Bei Interesse: elf-Loader
    https://prettyos.svn.sourceforge.net/svnroot/prettyos/trunk/Source/kernel/elf.c


  • Mod

    Rev. 309:

    elf.c: set bss to zero http://en.wikipedia.org/wiki/.bss
    TTT (hello.c): memset((void*)tictactoe, 0, 18); // tictactoe has two bytes!

    Dank an XanClic, der beide Probleme auf Anhieb gefunden hat! 👍



  • Erhard Henkes schrieb:

    elf.c: set bss to zero http://en.wikipedia.org/wiki/.bss

    Jepp, das war mein Verdacht. 🙂



  • Revision 310:

    * Bootscreen verbessert und verschoben nach util.c


  • Mod

    Jepp, das war mein Verdacht.

    Wir hatten das sogar schon mal irgendwo drinnen, ist aber wieder verschwunden. 😉

    @Cuervo: Großes Lob! 👍


  • Mod

    Rev. 311:

    FPU-Sicherung Experimenteller Zwischenschritt
    #NM kommt noch zu oft

    Hier mal die Doku der neuen Schritte:

    os.h

    struct oda
    {
        //...
        uintptr_t curTask;           // Address of currentTask
        //...
    }__attribute__((packed));
    

    ckernel.c:

    void setup_x87_fpu()
    {
        //...
        // set TS in cr0
        uint32_t cr0;
        __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
        cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
        __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
    }
    
    //...
    
        while (true) // kernel idle loop
        {
            /// FPU-TEST
            float number1 = 2.5;
            float number2 = 2.5;
            float number3 = number1 * number2;
            char str[40];
            float2string(number3,3,str);
            printf("float result: %s\n",str);
            /// TEST
    

    irq.c:

    task_t* pCurrentTask = (task_t*)(pODA->curTask);
    
        if ( (r->int_no < 32) && (r->int_no == 7) ) //exception #NM (number 7)
        {
             settextcolor(12,0);
             printf("#NM: FPU is used\n");
             settextcolor(15,0);
    
             // current task uses FPU
             pCurrentTask->FPU_flag = true;
    
             // save FPU ...
             // ...
    
             // restore FPU ...
             // ...
    
             // set TS in cr0 to zero
    
             uint32_t cr0;
             __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
             cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM
             __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

    task.c:

    void tasking_install()
    {
      //...
        pODA->curTask = (uintptr_t)current_task;
        current_task->FPU_flag = false; 
      //...
    }
    
    task_t* create_task(page_directory_t* directory, void* entry, uint8_t privilege, const char* programName)
    {
      //...
        pODA->curTask = (uintptr_t)new_task;
        new_task->FPU_flag = false;
    }
    
    uint32_t task_switch (uint32_t esp)
    {
      //...
        // write active task struct address to ODA
        pODA->curTask = (uintptr_t)current_task;
    
      //...
            // set TS in cr0, if the task has not used the FPU before
        if (current_task->FPU_flag == false);
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

  • Mod

    Rev. 312:

    Rahmen für FPU-Nutzung bezüglich TS-Bit und #NM stehen, jetzt fehlt noch save und restore (Dank an Tobiking für das Mitdenken!)

    in task_switch:

    // set TS
        if (pODA->curTask == pODA->TaskFPU)
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
        else
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

    kernel:

    /// FPU-TEST
                if ((CurrentSeconds%5)==0)
                {
                    float number1 = 2.5;
                    float number2 = 2.5;
                    float number3 = number1 * number2;
                    char str[40];
                    float2string(number3,3,str);
                    printf("float result: %s\n",str);
                }
                /// TEST
    

    TTT (hello.c) als Test:

    void Zug(uint16_t Player, char* str, uint16_t* tictactoe, bool ende)
    {
    	memset((void*)str, 0, 80);
    
        for (; ; gets(str))
        {
         /// FLOAT-TEST
         float number1 = 2.5;
         float number2 = 2.5;
         float number3 = number1 * number2;
         char floatStr[40];
         float2string(number3,3,floatStr);
         /// TEST
    

  • Mod

    Rev. 313:

    FPU: fnsave / frstor eingebaut (Danke an Tobiking und taljeth für die Unterstützung)

    In den einzelnen Konsolen erkennt man jetzt sehr schön die bei den einzelnen Tasks anfallenden #NM beim Verwenden einer FPU-Operation.

    Hier der Part im irq-handler für #NM:

    if ( r->int_no == 7 ) //exception #NM (number 7)
        {
             // set TS in cr0 to zero
             uint32_t cr0;
             __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
             cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM
             __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
    
             settextcolor(12,0);
             printf("#NM: FPU is used. pCurrentTask: %X\n",pCurrentTask);
             settextcolor(15,0);
    
             // current task uses FPU
             pCurrentTask->FPU_flag = true;
    
             // save FPU data ...
             if(pODA->TaskFPU)
             {
                 // fsave or fnsave to pODA->TaskFPU->FPU_ptr
                 __asm__ volatile("fnsave %0" :: "m" (*(char*)(((task_t*)pODA->TaskFPU)->FPU_ptr)));
             }
    
             // store the last task using FPU
             pODA->TaskFPU = (uintptr_t)pCurrentTask;
    
             // restore FPU data ...
             if(pCurrentTask->FPU_ptr)
             {
                 // frstor from pCurrentTask->FPU_ptr
                 __asm__ volatile("frstor %0" :: "m" (*(char*)(pCurrentTask->FPU_ptr)));
             }
             else
             {
                 // allocate memory to pCurrentTask->FPU_ptr
                 pCurrentTask->FPU_ptr = (uintptr_t)malloc(108,4);
             }
        }
    

Anmelden zum Antworten