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 - micha

Seiten: 1 ... 4 5 [6] 7 8
101
Softwareentwicklung / Re: Qemu und Oracle...
« am: 02. April 2012, 14:30 »
"VBox geht nicht mehr"?
Ich meine damit, dass wenn ich den VBoxManager ausführe passiert nichts, und kann die *.vbox dateien nichtmehr starten
102
OS-Design / Re: Monotholitisher Kernel oder Microkernel
« am: 01. April 2012, 19:48 »
Na das wird ja ein geläster hier  :wink:
103
Softwareentwicklung / Qemu und Oracle...
« am: 01. April 2012, 19:46 »
Halöle (Hallo)! :wink:
Ich hatte erst die VirtualBox von Oracle als Emulator installiert. Dann wollte ich qemu ausprobieren, doch seitdem geht die VBox nichtmehr. :-(
Vertragen die sich nicht?

Mein Virtuelles Windows XP lief in VBox so schnell ... und in qemu so langsam...


Grüße
104
ich meinte ja eingentlich auch nur das inb.
Der Assembler hat mir nur Angezeit: Suffix or operands invalid for out
mit den Funktionen kommt das nicht
deshalb hab ich dir funktionierende Funktionen :wink: nochmal geschrieben
105
Lowlevel-Coding / Re: Tastaturtreiber
« am: 01. April 2012, 19:37 »
Naja, wenn der Handler leer ist
( (Klammer Auf) int_handler_0x21:
    iret
) (Kalmmer zu)
dann kommt die Exeption trotzdem
106
Lowlevel-Coding / Re: Tastaturtreiber
« am: 01. April 2012, 14:02 »
Mein Printf (sprintf) habe ich ja selber implementiert, aber komplett in C. und ich glabe nicht, dass da was schief läuft. die cpu wird doch in einer C-Funktion gesichert.
107
nochmal zu dem outb:
deine funktionen in asmaccess.h sind falsch. Sie könnten (sollten) so aussehen:
static inline void outb(uint16_t port, uint8_t data){
   asm("outb %0, %1" : : "a" (data), "Nd" (port));
}
static inline uint8_t inb(uint16_t port){
  unsigned char result = 0;
  asm("inb %1, %0" : "=a" (result) : "Nd" (port));
  return result;
}
108
Diese Datei binde ich dann zb. in meinem Kernel ein:
#include "kernel\console.h"
#include "kernel\asmaccess.h"

void main()
{
    Console_ClearScreen();
    Console_WriteLine("Hallo!");
    Console_WriteLine("Ich heiße Compi!");
    Console_WriteLine("Ich bin ein Computer");
    Console_WriteLine("und lasse hier diesen sinnfreien Text anzeigen.");
    halt();
}

Liegt das vielleicht in deinem Kernelverzeichnis?

du solltest dann das nehmen:
#include "console.h"
#include "asmaccess.h"

statt dem:
Zitat
#include "kernel\console.h"
#include "kernel\asmaccess.h"
109
Lowlevel-Coding / Re: Tastaturtreiber
« am: 01. April 2012, 11:12 »
Ich kann jetzt mit dem Debugger arbeiten, ich komme auch an den Qemu-Monitor, doch dann ist meine Emulation verschwunden und die Register und der ganze andere kram passt auch nicht auf das kleine 80x25 "kästchen".
Also hab ich breakpoints (ohne Debugger) mit asm("int $3"); gesetzt und mir im qemu-log die Register angesehen:
Vor dem interruptaufruf war ESP ok. Nachher irgendwie falsch (kein vielfaches von vier). Aber mein Handler sieht nur so aus:
.extern keyboard_irq_handler

...

.global int_handler0x21
int_handler0x21:
    call keyboard_irq_handler
    iret

...
...

und wers wissen will..
void keyboard_irq_handler(void){
    printf("Taste gedrueckt!\n");
}

Ich mach nichts mit dem Stack.
könnte möglicherweise der Timerinterrupt dazwischen funken und der Stack verrutscht?
110
Lowlevel-Coding / Re: Tastaturtreiber
« am: 31. March 2012, 15:26 »
Nun mit dem Debugger komme ich noch nicht wirklich zurecht.
Also ich mache bisjetzt folgendes:
gdb [dann kommt hier das file]
Bla.. BLa ...Bla
(gdb) target remote :1234

Zitat
[dann kommt hier das file]
soll ich da mein iso-image angeben?


und gleichzeitig:
qemu -S -cdrom image.iso
Und wie komme ich zu dem Qemu-Monitor?

Kann mir jemand den Debugger erklären? :?
111
Lowlevel-Coding / Re: Tastaturtreiber
« am: 30. March 2012, 17:37 »
Eigentlich habe ich kein pushw/popw verwendet...
112
Lowlevel-Coding / Re: Tastaturtreiber
« am: 30. March 2012, 17:22 »
Ja, ESP ist nicht durch 4 teilbar. Ich hab nachgeschaut, ich hab immer versucht das `rechnen' mit dem Stackpointer zu vermeiden und bevor die komplette cpu gepopt wird nicht add $4, %esp sondern pop %eax verwendet. (%esp wegnehmen)
Beim wegnehmen der interruptnummer und dem Errorcode geht es ja nicht anders, da ist aber auch nichts (add $8, %esp).
Also ich hab' nicht mit irgendwelchen zahlen, die nicht durch 4 teibar sind, den Stackpointer verändert.
Wie könnten andere solche fehler entstehen?
113
Lowlevel-Coding / Re: Tastaturtreiber
« am: 30. March 2012, 15:35 »
genau der ist es! :-)
und was ist daran jetzt falsch, das ein GPF ausgelöst wird :?
114
Lowlevel-Coding / Re: Tastaturtreiber
« am: 30. March 2012, 14:02 »
wenn ich IDT_ENTRIES auf 256 gestetzt hab und *8 nehme wird der int erst ohne GPF audgelöst, springt in den handler und dann kommt der GPF.

im qemu.log steht eimal:
     0: v=21 e=0000 i=0 cpl=0 IP=0008:00101835 pc=00101835 SP=0010:00105f70 EAX=000000edund dann:
check_exception old: 0xffffffff new 0xd
     1: v=0d e=0204 i=0 cpl=0 IP=0008:00100d66 pc=00100d66 SP=0010:00105f6a EAX=00000000
115
Lowlevel-Coding / Re: Tastaturtreiber
« am: 29. March 2012, 16:46 »
Jetzt nochmal damit das klar ist:
 1. Ich nehme .size = IDT_ENTRIES -1
   - wenn IDT_ENTRIES = 256 ist funktioniert es
   - wenn IDT_ENTRIES = irgendwas anderes ist, startet qemu neu
 
 2. Ich nehme .size = IDT_ENTRIES * 8 -1
   - Es funktioniert immer, wenn IDT_ENTRIES größer als die wirkliche Anzahl der interrupts ist
      sonst bleibt qemu schwarz

Trotz dem bleibt ein Interrupt der >= 0x20 ist nicht ohne GPF
116
Lowlevel-Coding / Re: Tastaturtreiber
« am: 29. March 2012, 12:40 »
du hast nicht mit IDT_ENTRIES * 8 - 1 probiert, oder? Die minus 1 war schon richtig.
Na klar hab ich das!!!
117
Lowlevel-Coding / Re: Tastaturtreiber
« am: 28. March 2012, 19:23 »
Richtig!
IDT_ENTRIES ist 256.
Wenn ich bei size IDT_ENTRIES * 8 nehme starte qemu bei jedem int. neu
118
Lowlevel-Coding / Re: Tastaturtreiber
« am: 28. March 2012, 17:17 »
Denk ich nicht.
Die Testhandler (Hello-World-handler) fubktionieren, ABER nur auf den interrupts bis 0x1f

idt.c
/**
 *  kernel/interrupt/idt.h
 *  set_interrupt, init_idt, load_idt
 *
 *  (C) Copyright 2012 Michael Sippel
 */
#include <stdint.h>
#include <stdbool.h>

#include "handlerextern.h"
#include "interrupt.h"
/* ---------- Globale Variablen ----------------------- */
static uint64_t idt[IDT_ENTRIES]; //Interupt Deskriptor Table
/* ---------- Eintrag in die IDT setzen --------------- */
static void set_interrupt(int i, uint32_t offset, uint16_t selector, int type, bool present, int dpl){
  idt[i] = 0;
  //untere 32-Bit
  idt[i] = (offset & 0x0000ffff) | (selector << 16);
  //obere 32-Bit
  idt[i] |=(
    ( type << 8 ) |
    ( (dpl&3) << 13 ) |
    ( (present&1) << 15)|
    ( offset & 0xffff0000 )
   ) * 0x100000000;
}
/* ---------- IDT laden ------------------------------- */
void load_idt(void){
  struct {
    uint16_t size;
    uint64_t pointer;
  } __attribute__((packed)) idtp = {
    .size = IDT_ENTRIES - 1,
    .pointer = &idt,
  };
  asm("lidt %0" : : "m" (idtp));
}
/* ---------- IDT initalisieren ----------------------- */
void init_idt(void){
  ///           index, offset,                  selector,  type,  present, dpl
  set_interrupt(0x00, (uint32_t)&int_handler0x00,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x01, (uint32_t)&int_handler0x01,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x02, (uint32_t)&int_handler0x02,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x03, (uint32_t)&int_handler0x03,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x04, (uint32_t)&int_handler0x04,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x05, (uint32_t)&int_handler0x05,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x06, (uint32_t)&int_handler0x06,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x07, (uint32_t)&int_handler0x07,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x08, (uint32_t)&int_handler0x08,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x09, (uint32_t)&int_handler0x09,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0A, (uint32_t)&int_handler0x0A,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0B, (uint32_t)&int_handler0x0B,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0C, (uint32_t)&int_handler0x0C,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0D, (uint32_t)&int_handler0x0D,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0E, (uint32_t)&int_handler0x0E,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x0F, (uint32_t)&int_handler0x0F,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x10, (uint32_t)&int_handler0x10,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x11, (uint32_t)&int_handler0x11,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x12, (uint32_t)&int_handler0x12,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x13, (uint32_t)&int_handler0x13,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x14, (uint32_t)&int_handler0x14,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x15, (uint32_t)&int_handler0x15,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x16, (uint32_t)&int_handler0x16,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x17, (uint32_t)&int_handler0x17,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x18, (uint32_t)&int_handler0x18,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x19, (uint32_t)&int_handler0x19,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1A, (uint32_t)&int_handler0x1A,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1B, (uint32_t)&int_handler0x1B,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1C, (uint32_t)&int_handler0x1C,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1D, (uint32_t)&int_handler0x1D,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1E, (uint32_t)&int_handler0x1E,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
  set_interrupt(0x1F, (uint32_t)&int_handler0x1F,0x08,INTERRUPT_GATE,TRUE, 0  );//Exeption
     
  set_interrupt(0x20, (uint32_t)&int_handler0x20,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x21, (uint32_t)&int_handler0x21,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x22, (uint32_t)&int_handler0x22,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x23, (uint32_t)&int_handler0x23,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x24, (uint32_t)&int_handler0x24,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x25, (uint32_t)&int_handler0x25,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x26, (uint32_t)&int_handler0x26,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x27, (uint32_t)&int_handler0x27,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x28, (uint32_t)&int_handler0x28,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x29, (uint32_t)&int_handler0x29,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2A, (uint32_t)&int_handler0x2A,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2B, (uint32_t)&int_handler0x2B,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2C, (uint32_t)&int_handler0x2C,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2D, (uint32_t)&int_handler0x2D,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2E, (uint32_t)&int_handler0x2E,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ
  set_interrupt(0x2F, (uint32_t)&int_handler0x2F,0x08,INTERRUPT_GATE,TRUE, 0  );//IRQ

  set_interrupt(0x30, (uint32_t)&int_handler0x30,0x08,INTERRUPT_GATE,TRUE, 0  );//Software
  set_interrupt(0x31, (uint32_t)&test_int_handler00,0x08,INTERRUPT_GATE,TRUE,0);//Software
  set_interrupt(0x32, (uint32_t)&test_int_handler01,0x08,INTERRUPT_GATE,TRUE,0);//Software
}

/*----- ENDE idt.c ---- */
119
Lowlevel-Coding / Re: Tastaturtreiber
« am: 28. March 2012, 16:40 »
Aha!
Ich kann nur die intr. bis 0x1f aufrufen (alle Exeptions) bei alen Anderen interrupts kommt ein GPF.
Ist möglicherweise der PIC falsch programmiert?

pic.c
/**
 *  kernel/interrupt/pic.c
 *  init_pic
 *
 *  (C) Copyright 2012 Michael Sippel
 */
#include <portio.h>
#include "interrupt.h"

#define PIC_MASTER_COMM    0x20
#define PIC_MASTER_DATA    (PIC_MASTER_COMM) + 1
#define PIC_SLAVE_COMM     0xa0
#define PIC_SLAVE_DATA     (PIC_SLAVE_COMM) + 1

#define PIC_INIT        0x11
#define PIC_ICW4        0x01
#define PIC_EOI         0x20

/* ---------- Initalisierung des PIC ------------------ */
void init_pic(void){
  // PICs initalisieren
  outb(PIC_MASTER_COMM,PIC_INIT);
  outb(PIC_SLAVE_COMM,PIC_INIT);
 
  //Erstes IRQ
  outb(PIC_MASTER_DATA, FIRST_IRQ);    // Master
  outb(PIC_SLAVE_DATA,  FIRST_IRQ + 8);// Slave
 
  //Slave auf IRQ 2 setzen
  outb(PIC_MASTER_DATA, 0x04);
  outb(PIC_SLAVE_DATA,  0x02);
 
  //ICW 4
  outb(PIC_MASTER_DATA, PIC_ICW4);// Master
  outb(PIC_SLAVE_DATA,  PIC_ICW4);// Slave
 
  // All IRQs aktivieren / demaskieren
  outb(PIC_MASTER_DATA, 0x0);
  outb(PIC_SLAVE_DATA,  0x0);
}

Eigentlich dürfte da nix falsch sein.

Was gibt es noch für mögliche fehler?
120
OS-Design / Monotholitisher Kernel oder Microkernel
« am: 26. March 2012, 17:24 »
Hallo!

Ich bin am überlegen, ob ich mich für einen Monotholitischen Kernel oder für ein Microkernel entscheide.
Dabei kann ich mich eben nicht entscheiden!
Kann mir jemand vorteile bzw. nachteile von den verschiedenen Kernelarten nennen, damit ich mich besser entscheiden kann.

Grüße
Micha
Seiten: 1 ... 4 5 [6] 7 8

Einloggen