Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - wissenshunger

Seiten: [1] 2 3
1
OS-Design / Ordentliche ms genaue Sleep Funktion (Delay)
« am: 13. March 2014, 19:23 »
Hallo liebe Community,

ich habe mir schon einige Beispiele an Sleep Funktionen angeschaut und einiges getestet.
Von asm("nop"); Schleifen bis hin zu komplizierten Timer.

Bisher an mich nichts richtig zufrieden gestellt, aber ich bin im Moment an diesem Modell hängen geblieben:
void sleep(uint32_t ms)
{
    SLEEP_ACTIV_STATE = 1;
    uint64_t cur = tick_counter;
while((cur+ms) >= tick_counter);
SLEEP_ACTIV_STATE = 0;
return;
}

Am Timer 1, der eigentlich das Multitasking steuert steht folgendes:
if (cpu->intr == 0x20) {  //TIMER
        TIMER_ITR();
new_cpu = schedule(cpu);
tss[1] = (uint32_t) (new_cpu + 1);
new_cpu = cpu; 
}

TIMER_ITR():
void TIMER_ITR(void)
{
tick_counter += 10;
}

Wie man sieht ist diese Sleep-Funktion nur 10ms "genau". Sprich der Timer wird jede 10ms ausgelöst. (100Hz) Ich benötige allerdings für das Multitasking eine niedrige Frequenz, vielleicht 10Hz, also jede 100ms. Dann würde meine Sleepfunktion allerdings um 100ms ungenau gehen.

Das Ziel ist es aber meine Task mit 10Hz zu wechseln und meine Sleepfunktion auch nur 1ms warten zu lassen.
Ist den mein jetziges Model dafür überhaupt geeignet? Sollte ich etwas ganz anderes Verfolgen?

Wie habt ihr dieses Funktion gelöst?

Seltsam ist bei meiner Varriante von Sleep-Funktion auch, dass vor dem Multitasking (aber schon aktivem Timer IRQ) meine Sleep-Funktion die Zeit abwartet und es danach weiter im Kernel geht. Sobald das Multitasking aktiv ist, sprich auch Task laufen & ich dann z.B. mein Floppy-Laufwerk ansteuer und die Sleepfunktion aufgerufen wird kommt er nicht mehr aus der while Schleife herraus.

Ich freue mich auf eure Idee, Vorschläge und Anregungen...
L.G.
2
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 14. February 2014, 02:18 »
Wie kann man den einen Kernel töten?
3
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 11. February 2014, 00:42 »
Was ist, wenn ich einen Leerlauf Task erstelle der einfach nur eine Endlosschleife ist? Dieser Task nicht nicht beendbar.
4
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 10. February 2014, 18:04 »
Wieso habe ich noch ein größeres Problem? Wie wäre es besser gelöst?
5
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 23:46 »
Meine Vermutung hat sich bewahrheitet!

Das Problem war die ganze Zeit, dass bei echter Hardware der Timer Interrupt früher auslöste als überhaupt der erste Task angelegt werden konnte! Bei Qemu mit Standart-Timerfrequenz hat es manschmal doch geklappt.

Bei folgendem Codeausschnitt vom Schedule:
    cpu = current_task->cpu_state;

    return cpu;
}

...habe ich einfach "if (current_task != NULL)" eingebaut:
    if (current_task != NULL)
    cpu = current_task->cpu_state;

    return cpu;
}

..und siehe da, dass PROBLEM ist behoben. Man man man was ein langer Weg für so wenig Code.
Wenn current_task = NULL ist wird der letzte CPU Stand einfach gelassen. Dieser Zustand kommt ja nur vor, wenn die Interrupts aktiviert werden und es noch wenige (m)sek. dauert bis der erste Task gestartet ist.

Bitte bitte ändert das mal jemand im Tutorial, damit dieser Fehler nicht bei irgendjemand sonst auftretten kann. Er ist überaus lästig!

Somit bedanke ich mich hiermit ganz herzlich bei jedem der sich hier mit den Kopf zerbrochen hat. Ich habe sehr viel über debugging gelernt und bin um einiges fitter in Sachen Register geworden. Vielen lieben Dank! Damit erkläre ich dieses Thema für erledigt und geschlossen! Danke!
6
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 23:05 »
Mir kommt gerade eine Idee weil ich mich gefragt habe wieso Qemu doch manschmal weiter läuft.
Könnte der Fehler daran liegen, dass die Taskliste mit Null init. wird und wenn die Interrupts aktiviert werden der schedule dann null zurück gibt, dann noch kein Task in dieser Zeit aktiv ist bis das erste Mal Timer IRQ kommt? Interessanterweise ist nach änderung der Timerfrequenz an Problem mit Qemu schlimmer geworden! Das würde auch erklären wieso echte Hardware sofort resetet! Bei echter Hardware ist der Timer genUer oder er braucht länger den ersten Task zu init als der Timer und deswegen kommt es zu dieser geheimnisvollen Null, dass das ganze System zum absturz bringt.
7
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 22:46 »
Liest du für irgend etwas die BIOS Data Area (BDA) aus? Die liegt nämlich genau bei 0x400
Beim Starten lese ich die BDA aus um Daten zur seriellen Schnittstelle zu bekommen etc.
8
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 22:07 »
Also wenn die erste Page nicht mappe, spri. physisch = virtuell erst ab 4096KB, dann wird sofort eine #PF ausgelöst, log dazu:

Zitat
     0: v=0e e=0000 i=0 cpl=0 IP=0008:0010444a pc=0010444a SP=0010:00109f3c CR2=00000400
EAX=00000400 EBX=00000002 ECX=00000000 EDX=00000400
ESI=00000014 EDI=00000020 EBP=00109f50 ESP=00109f3c
EIP=0010444a EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000400 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000400 CCD=00000400 CCO=ADDL   
EFER=0000000000000000


Das blöde dazu, wenn ich objdump mit den Option -dS speicher und durchsuche, finde ich Adresse 10444a nicht.
9
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 21:53 »
Jetzt macht mein Kernel noch andere komische Sachen. -.-

Wie es scheint wird jetzt nach dem Timer IRQ eine #GP ausgelöst und danach eine #PF, dann gefolgt vom #DF [Qemu stopp]


Zitat
     1: v=20 e=0000 i=0 cpl=0 IP=0008:0010166f pc=0010166f SP=0010:00109f3c EAX=000000ed
EAX=000000ed EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000020 EBP=00109f54 ESP=00109f3c
EIP=0010166f EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000010 CCD=00109f30 CCO=EFLAGS 
EFER=0000000000000000
check_exception old: 0xffffffff new 0xd
     2: v=0d e=0000 i=0 cpl=0 IP=0008:00102bcd pc=00102bcd SP=0010:00001024 EAX=00002027
EAX=00002027 EBX=00003007 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00001024
EIP=00102bcd EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00001024 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xffffffff new 0xe
     3: v=0e e=0002 i=0 cpl=0 IP=0008:00102ba8 pc=00102ba8 SP=0010:00001000 CR2=00000ffc
EAX=00002027 EBX=00003007 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00001000
EIP=00102ba8 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000ffc CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00001024 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xe new 0xe
     4: v=08 e=0000 i=0 cpl=0 IP=0008:00102ba8 pc=00102ba8 SP=0010:00001000 EAX=00002027
EAX=00002027 EBX=00003007 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00001000
EIP=00102ba8 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000ffc CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00001024 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0x8 new 0xe
10
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 09. February 2014, 02:21 »
Nach Kontrolle von init_task und kleinen veränderungen tretten die letzten beiden Eceptions nach dem Timer IRQ bei folgenden Befehle im handle_interrupt auf:
push %ecx
Und
pop %ecx

Ich versteh einfach nicht wodran es liegt. Ich habe teilweise wieder orginal Code zum Tutorial wiederhergestellt und trotzem kommich vom Triple Fault nicht weg.
Langsam verzweifel ich.
11
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 07. February 2014, 14:56 »
struct cpu_state* handle_interrupt(struct cpu_state* cpu)
{

    struct cpu_state* new_cpu = cpu;

    if (cpu->intr <= 0x1f) {
    //  ... Exeptions

       while(1) {
            // Prozessor anhalten
            asm volatile("cli; hlt");
        }
    } else if (cpu->intr >= 0x20 && cpu->intr <= 0x2f) {
// ====> AB HIER HARDWARE INTERRUPTS <====
        if (cpu->intr == 0x20) {  //TIMER
// kprintf("!! TIMER !!\n");

// TIMER_ITR();
new_cpu = schedule(cpu);
// kprintf("!! SCHEDULE !!\n");
    tss[1] = (uint32_t) (new_cpu + 1);
           
        }

if (cpu->intr == 0x21) {  //Keyboard
interruptevent = 3;
keypress = kbd_read();
}

if (cpu->intr == 0x24) {  //SS0
interruptevent = 4;
}

if (cpu->intr == 0x26) {  //FDC
interruptevent = 6;
FLOPPY_IRQ();
}

        if (cpu->intr >= 0x28) {
            // EOI an Slave-PIC
            outb(0xa0, 0x20);
        }
        // EOI an Master-PIC
        outb(0x20, 0x20); // PIC zurueksetzen
       
        // =======================================
       
    } else if (cpu->intr == SYSCALL_INTERRUPT) {
        new_cpu = syscall(cpu);
    } else {
        kprintf("Unbekannter Interrupt\n");
        while(1) {
            // Prozessor anhalten
            asm volatile("cli; hlt");
        }
    }
   
    /*
    if (cpu != current_task->cpu_state) {
        asm volatile("mov %0, %%cr3" : : "r" (cpu->context));
    } */
   
    return new_cpu;
}

Da er bei echter Hardware immer nach dem Schedule abstürzt hier auch dieser Code:
struct cpu_state* schedule(struct cpu_state* cpu)
{

    /*
     * Wenn schon ein Task laeuft, Zustand sichern. Wenn nicht, springen wir
     * gerade zum ersten Mal in einen Task. Diesen Prozessorzustand brauchen
     * wir spaeter nicht wieder.
     */
    if (current_task != NULL) {
        current_task->cpu_state = cpu;
    }

    /*
     * Naechsten Task auswaehlen. Wenn alle durch sind, geht es von vorne los
     */
    if (current_task == NULL) {
        current_task = first_task;
    } else {
        current_task = current_task->next;
        if (current_task == NULL) {
            current_task = first_task;
        }
    }
   
/* Prozessorzustand des neuen Tasks aktivieren */
   
    cpu = current_task->cpu_state;
//   ###############################################################################
    return cpu;
}

Also ich kann kein Fehler sehen und das irgendwo NULL ausgegeben wird auch nicht.
Hier auch nochmal die intr.h:
#ifndef INTR_H
#define INTR_H

#include <stdint.h>
#include "multiboot.h"

struct cpu_state {
    // Von Hand gesicherte Register
    uint32_t   eax;
    uint32_t   ebx;
    uint32_t   ecx;
    uint32_t   edx;
    uint32_t   esi;
    uint32_t   edi;
    uint32_t   ebp;

    uint32_t   intr;
    uint32_t   error;

    // Von der CPU gesichert
    uint32_t   eip;
    uint32_t   cs;
    uint32_t   eflags;
    uint32_t   esp;
    uint32_t   ss;
};

void init_gdt(void);
void init_intr(void);
void init_multitasking(struct multiboot_info* mb_info);

struct cpu_state* handle_interrupt(struct cpu_state* cpu);
struct cpu_state* schedule(struct cpu_state* cpu);

#endif

12
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 07. February 2014, 01:43 »
Es muss also an der Funktion handle_interrupt liegen oder liegt es am Kernel Stack bzw. Am aktuellen Task Stack? Was heißt Stack kaputt?
13
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 06. February 2014, 13:22 »
int_stub.S:
...

intr_common_handler:
    // CPU-Zustand sichern
    push %ebp
    push %edi
    push %esi
    push %edx
    push %ecx
    push %ebx
    push %eax

    // Kernel-Datensegmente laden
    mov $0x10, %ax
    mov %ax, %ds
    mov %ax, %es

    // Handler aufrufen
    // Der Rueckgabewert ist der Prozessorzustand des moeglicherweise
    // gewechselten Tasks. Wir muessen also den Stack dorthin wechseln
    // um die Register wiederherzustellen.
    push %esp
    call handle_interrupt
    mov %eax, %esp

    // User-Datensegmente laden
    mov $0x23, %ax
    mov %ax, %ds
    mov %ax, %es

    // CPU-Zustand wiederherstellen
    pop %eax
    pop %ebx
    pop %ecx
    pop %edx
    pop %esi
    pop %edi
    pop %ebp

    // Fehlercode und Interruptnummer vom Stack nehmen
    add $8, %esp

    iret

Also bedeutet das doch, dass es bei pop %eax zum Fault kommt. Was sagt mir das jetzt?
14
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 06. February 2014, 13:03 »
Ich habe nochmal mit objdump -dS kernel >kernel.txt disasm. & da finde ich Adresse 102c17 in 00102bf8 <intr_common_handler>:
Zitat
00102bf8 <intr_common_handler>:
  102bf8:   55                      push   %ebp
  102bf9:   57                      push   %edi
  102bfa:   56                      push   %esi
  102bfb:   52                      push   %edx
  102bfc:   51                      push   %ecx
  102bfd:   53                      push   %ebx
  102bfe:   50                      push   %eax
  102bff:   66 b8 10 00             mov    $0x10,%ax
  102c03:   8e d8                   mov    %eax,%ds
  102c05:   8e c0                   mov    %eax,%es
  102c07:   54                      push   %esp
  102c08:   e8 56 11 00 00          call   103d63 <handle_interrupt>
  102c0d:   89 c4                   mov    %eax,%esp
  102c0f:   66 b8 23 00             mov    $0x23,%ax
  102c13:   8e d8                   mov    %eax,%ds
  102c15:   8e c0                   mov    %eax,%es
  102c17:   58                      pop    %eax
  102c18:   5b                      pop    %ebx
  102c19:   59                      pop    %ecx
  102c1a:   5a                      pop    %edx
  102c1b:   5e                      pop    %esi
  102c1c:   5f                      pop    %edi
  102c1d:   5d                      pop    %ebp
  102c1e:   83 c4 08                add    $0x8,%esp
  102c21:   cf                      iret   
   ...

15
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 06. February 2014, 12:37 »
Hat geklappt!
info mem gibt folgendes aus:
Zitat
00000000-00800000 00800000 urw

info tlb kann ich leider nicht komplett auslesen.

info registers:
Zitat
EAX=f0000023 EBX=00000002 ECX=0010ee00 EDX=00000020
ESI=00000014 EDI=00000011 EBP=00109ff4 ESP=f000ff53
EIP=00102c17 EFL=00000002
...
GDT= 0012a060 0000002f
IDT= 0012a0a0 999997ff

CR0=80000011 CR2=f000ff4f CR3=00001000 CR4-DR0-DR3=00000000
DR6=ffff0ff0 DR7=00000400
...

Dazu Qemu INT-Log:
Zitat
     0: v=20 e=0000 i=0 cpl=0 IP=0008:00103b28 pc=00103b28 SP=0010:00109fa8 EAX=00000030
EAX=00000030 EBX=00000002 ECX=0010ee00 EDX=00082bf2
ESI=00000014 EDI=00000011 EBP=00109ff4 ESP=00109fa8
EIP=00103b28 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000034 CCD=00109f68 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xffffffff new 0xe
     1: v=0e e=0000 i=0 cpl=0 IP=0008:00102c17 pc=00102c17 SP=0010:f000ff53 CR2=f000ff53
EAX=f0000023 EBX=00000002 ECX=0010ee00 EDX=00000020
ESI=00000014 EDI=00000011 EBP=00109ff4 ESP=f000ff53
EIP=00102c17 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=f000ff53 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000024 CCD=00109f68 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xe new 0xe
     2: v=08 e=0000 i=0 cpl=0 IP=0008:00102c17 pc=00102c17 SP=0010:f000ff53 EAX=f0000023
EAX=f0000023 EBX=00000002 ECX=0010ee00 EDX=00000020
ESI=00000014 EDI=00000011 EBP=00109ff4 ESP=f000ff53
EIP=00102c17 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=f000ff4f CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000024 CCD=00109f68 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0x8 new 0xe


Das sind alles aktuelle Daten, die Qemu beim Stopp liefert.
16
Lowlevel-Coding / Re: Floppy Kabel für 5'25 Zoll gesucht
« am: 05. February 2014, 23:33 »
Ich weiß auch nicht genau wo sein Problem ist.
17
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 05. February 2014, 23:25 »
Laut Qemu ist kein Paging aktiv!
Laut log ist Paging schon vor dem ersten IRQ aktiv.  (Siehe CR0)
Dass dir Qemu sagt es wäre nicht aktiv, liegt  vermutlich daran, dass du das erst dann abfragst wenn Qemu wegen des Tripplefaults schon wieder rettetet wurde.
Das würde Sinn machen. Aber wie kann ich jetzt im info mem oder info tlb Daten auslesen, wenn Qemu schon reset hat? Kann ich den Rest irgendwie ausschalten?
18
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 05. February 2014, 22:20 »
Der darauf folgende Interrupt ist interessant. Der Dump fängt mit der Zeile "0: v=21 ..." an. Das heißt, dass Interrupt 21h (vermutlich IRQ 1 = Keyboard) ausgelöst wurde. Die drei darauffolgenden Interrupts kommen ebenfalls vom Keyboard Controller. Danach kommt ein Abschnitt, der mit "5: v=20 ..." anfängt, das heißt, dass ein Timer-Interrupt ausgelöst wird.

Wieso IRQ 0 und 1 an dieser Stelle ausgelöst werden verstehe ich allerdings auch nicht. Interessant ist, dass pmm_init() bei mehreren Tests durchgelaufen ist aber der Kernel trotzdem nach Beendigung stehen bleibt. An dieser Stelle ist aber noch kein Inerrupt aktiviert worden und Qemu sagt mir weiter, das  PG nicht aktiv ist.

Zitat
Die erste Frage, die du dir also stellen sollest: Warum treten Interrupts auf, bevor die Speicherverwaltung initialisiert ist, oder genauer warum aktivierst du Interrupts bevor die Speicherverwaltung initialisiert ist? Wenn du das nicht tust (und dir sicher bist, dass du das auch nicht ausversehen tust), wie konnte es dann kommen, dass du das Problem in pmm_init vermutet hast, wo doch das System offensichtlich danach weiterläuft?
Diese Frage habe ich mir gestellt und ehrlich gesagt weiß ich nicht wieso diese Fehler auftretten, wenn der Kernel gar nicht weiter läuft und Qemu einfach stehem bleibt.

Zitat
check_exception old: 0xffffffff new 0xe
     6: v=0e e=0000 i=0 cpl=0 IP=0008:00102c17 pc=00102c17 SP=0010:f000ff53 CR2=f000ff53
Das ist ein Page Fault. Die treten nur auf, wenn Paging aktiv ist. Wie kann das denn passieren, wo du doch oben gesagt hast, dass du kein Paging aktiviert hast?
[/quote]
Laut Qemu ist kein Paging aktiv!

Zitat
Die Ursache für den Page Fault ist übrigens, dass ESP auf f000ff53 gesetzt wurde. Das ist ein Wert der in der IVT steht, welche sich an Adresse 0 befindet. Meine Vermutung ist, dass du Multitasking-Code hast, der einen NULL-Pointer derefenziert. Der Wert EIP=00102c17 kann dir bei der Suche helfen, indem du den Kernel disassemblierst (objdump -x kernel), und nach der Adresse 102c17 in der Ausgabe suchst. Dann solltest du herausfinden, in welcher Funktion sich dein Kernel befunden hat, als das aufgetreten ist.
Adresse 102c17 gibt es nicht, wenn ich alles richtig gemacht habe:
objdump -x kernel > kernel.txt
...danach in kernel.txt nach 102c17 gesucht => kein Treffer!

Aber hier mal am Rande die Frage: Wenn jemand das Tutorial ohne weiteres compiliert hat, hätte ihm doch den selbe Fehler auffallen müssen. Wieso funktioniert das bei mir nur nicht? Oder hat ihn bis her niemand auf echter Hardware probiert?!
Seltsam....
19
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 05. February 2014, 18:19 »

SMM: enter
EAX=00000001 EBX=00000000 ECX=02000000 EDX=00000cfc
ESI=000f39fd EDI=0003802d EBP=0000000b ESP=00006ef0
EIP=000f409b EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fd3a8 00000037
IDT=     000fd3e6 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=000f39d0 CCD=00000001 CCO=LOGICB 
EFER=0000000000000000
SMM: after RSM
EAX=00000001 EBX=00000000 ECX=02000000 EDX=00000cfc
ESI=000f39fd EDI=0003802d EBP=0000000b ESP=00006ef0
EIP=000f409b EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fd3a8 00000037
IDT=     000fd3e6 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS 
EFER=0000000000000000
     0: v=21 e=0000 i=0 cpl=0 IP=0008:001016c3 pc=001016c3 SP=0010:00109f3c EAX=000000ed
EAX=000000ed EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=00109f3c
EIP=001016c3 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00109f2c CCO=SUBL   
EFER=0000000000000000
     1: v=21 e=0000 i=0 cpl=0 IP=0008:0010170f pc=0010170f SP=0010:00109f5c EAX=00000000
EAX=00000000 EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000017 EBP=00109f74 ESP=00109f5c
EIP=0010170f EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00109f4c CCO=SUBL   
EFER=0000000000000000
     2: v=21 e=0000 i=0 cpl=0 IP=0008:001016c3 pc=001016c3 SP=0010:00109f3c EAX=000000f3
EAX=000000f3 EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=00109f3c
EIP=001016c3 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00109f2c CCO=SUBL   
EFER=0000000000000000
     3: v=21 e=0000 i=0 cpl=0 IP=0008:0010172f pc=0010172f SP=0010:00109f5c EAX=00000000
EAX=00000000 EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000017 EBP=00109f74 ESP=00109f5c
EIP=0010172f EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00109f4c CCO=SUBL   
EFER=0000000000000000
     4: v=21 e=0000 i=0 cpl=0 IP=0008:001016c3 pc=001016c3 SP=0010:00109f3c EAX=000000f4
EAX=000000f4 EBX=00000002 ECX=00000000 EDX=00000060
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=00109f3c
EIP=001016c3 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=00109f2c CCO=SUBL   
EFER=0000000000000000
     5: v=20 e=0000 i=0 cpl=0 IP=0008:00101c10 pc=00101c10 SP=0010:00109f40 EAX=00000000
EAX=00000000 EBX=00000002 ECX=0000055e EDX=000b84be
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=00109f40
EIP=00101c10 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=00000000 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000085 CCD=fffff5c0 CCO=EFLAGS 
EFER=0000000000000000
check_exception old: 0xffffffff new 0xe
     6: v=0e e=0000 i=0 cpl=0 IP=0008:00102c17 pc=00102c17 SP=0010:f000ff53 CR2=f000ff53
EAX=f0000023 EBX=00000002 ECX=0000055e EDX=00000020
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=f000ff53
EIP=00102c17 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=f000ff53 CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000024 CCD=00109f00 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xe new 0xe
     7: v=08 e=0000 i=0 cpl=0 IP=0008:00102c17 pc=00102c17 SP=0010:f000ff53 EAX=f0000023
EAX=f0000023 EBX=00000002 ECX=0000055e EDX=00000020
ESI=00000014 EDI=00000017 EBP=00109f54 ESP=f000ff53
EIP=00102c17 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00105180 00000080 0000e900 DPL=3 TSS32-avl
GDT=     0012a060 0000002f
IDT=     0012a0a0 000007ff
CR0=80000011 CR2=f000ff4f CR3=00001000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000024 CCD=00109f00 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0x8 new 0xe
20
OS-Design / Re: Qemu = ok, echt Hardware = Auaa... ;(
« am: 05. February 2014, 17:17 »
Also laut Qemu
hat EIP=0000fff0
EDX=00000633
alles andere 0!

CR0=60000010 falls das weiter hilft.

Wie bringen mich diese Register weiter? Wie kann ich nach EIP suchen?
Seiten: [1] 2 3

Einloggen