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

Seiten: 1 [2] 3 4 ... 6
21
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 01. April 2009, 18:45 »
Das ist der Codeschnipsel aus Ausgabe 3 APM Powerdown.
22
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 01. April 2009, 17:10 »
Ich hab doch noch ein Problem:
Ich wollte den Herunterfahren Schnipsel  ausprobieren, aber da Passiert nichts.
Das einzige, was mir als Fehler einfällt, sind meine out und in Funktionen, ob diese richtig funktionieren.  (ich weis nicht, wie out und in unter C offiziell heisst)void out(unsigned short _port, unsigned char _data)
{
__asm__ ("out %%al, %%dx" : : "a" (_data), "d" (_port));
}

unsigned char in(unsigned short _port)
{
unsigned char result;
__asm__ ("in %%dx, %%al" : "=a" (result) : "d" (_port));
return result;
}


void outw(unsigned short _port, unsigned short _data)
{
__asm__ ("out %%ax, %%dx" : : "a" (_data), "d" (_port));
}

unsigned short inw(unsigned short _port)
{
unsigned short result;
__asm__ ("in %%dx, %%ax" : "=a" (result) : "d" (_port));
return result;
}
Oder es liegt an etwas anderen.
23
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 01. April 2009, 14:33 »
So ich hab den Fehler gefunden ich hab die Adressen  immer umgebaut
wie z. B. 0xc000:0x012c  zu  0xc012:0x000c und bei einigen Befehlen spring er deswegen an einer falschen Stelle hin. Danke für die Hilfe. :-)
24
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 27. March 2009, 17:42 »
Nein halt ich hab mich geirrt der Befehl ist mov cs, wort ptr ds:[bx+0x1f14]BIOS Befehl c086:0005 müsste beim Starten überall gleich sein.
25
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 27. March 2009, 13:53 »
OK ich hab jetzt die ersten Befehle simulieren können und das Gerüst dazu implementiert.
Jetzt ist Exeption 6 (ungültiger Befehl) aufgetreten mit dem Befehl mov cs, [ds + 0x1f14] diesen Befehl gibt es wohl nur im RealMode. (er wird disassembelt, deswegen gibt es ihn wohl doch irgendwie)
Jetzt such ich eine Tabelle, in der Befehle mit ihren Bytesignaturen aufgelistet sind, einziges was ich gefunden habe sind die einzelnen Befehltypen aber nicht die Bytesignaturen.
Ein direkter link währe sehr gut.
26
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 20. March 2009, 15:44 »
OK ich hab jetzt den Ringwechsel hinbekommen (in beide Richtungen).
Ich wusste nicht, dass beim Ringwechsel  ESP und SS auf den Stack müssen und dass in das TaskRegister ein 'gültiger' TSS Descriptor gehört der zum Rückwechsel (Ring 0) da ist. (SS und ESP)

Zum VM86 hab ich noch eine Frage genauer gesagt zum Tutorial  im Codeslisting #4
ctx->cs = ivt[ip[1] * 2 + 1];
ctx->eip = ivt[ip[1] * 2];
Auf was zeigt dieser Zeiger. Die Adresse aus der ivt muss doch auch auf den User-Stack, damit das ausgeführt werden kann.

Und mit dem Interrupt-Flag verstehe ich nicht richtig wozu wird das gebraucht?
   if (current->v86_if)
        stack[2] |= EFLAG_IF;
    else
        stack[2] &= ~EFLAG_IF;

Noch einmal um das zu Rekapitulieren. (ob ich das richtig verstanden habe) 
In einem Ring3 Task wird VM86 gestartet.
Dann entsteht wahrscheinlich  ein Execption 13, da bestimmte Befehle halt nicht erlaubt sind.
Jetzt ist zu Prüfen, ob das VM-Flag gesetzt ist. Wenn er gesetzt ist muss der gewollte Befehl ‚Simuliert‘ werden.
27
Lowlevel-Coding / Re: Ringwechsel und VM86
« am: 18. March 2009, 11:53 »
Ich hab mich wohl falsch ausgedrückt. Der C++ ausschnitt hat nichts direkt mit dem VM86 zu tun. Mein Hauptproblem ist nämlich erst einmal ein Task auszuführen, der im Ring 3 läuft, ich hab einfach die Segmente (GDT Einträge) mit einer niedrigeren Privilegstufe erstellt wie auch die Selektoren und dann diesen Task genauso wie die anderen behandelt (gewechselt) mit Softwaremultitasking. Und das verursacht den Exceptions 13 noch einmal die Frage:
Zitat
Ist beim Rinwechsel noch etwas wichtiges zu beachten?

Ich hab diesen Software Interrupt, in der Mainfunktion des Kernels,  aufgerufen aufgrund der Beschreibung hiervon http://lowlevel.brainsware.org/wiki/index.php/Virtual_8086_Mode
_int53:
pop eax  ;eip
pop eax  ;cs
pop ebx  ;eflags
or ebx, 0x20000

push 0
push 0
push 0
push 0
push 0x9000  ;ss
push 0
push ebx
push 0x8000  ;cs
push 0  ;ip
iret
Zitat
Das geht nämlich nicht
   Ich wollte das nur noch erwähnen wo das nicht geht. Xor ax,ax geht, aber int 10h halt nicht, was zum Absturz führt.
Gleich beim iret hätte ich vermutet.
28
Lowlevel-Coding / Ringwechsel und VM86
« am: 17. March 2009, 14:48 »
Ich wollte den VM86 einbauen welcher ja  von einem Task (Prozess) mit der Privilegstufe 3 bewirkt werden muss, der dann VM86 startet (iret), denn der erste Versuch mit VM86 denn ich mittels Software Interrupt ausgelöst habe hat beim Befehl int 10h (im VM86) einen Absturz verursacht.  Meine Add Funktion für Tasks hab ich so abgeändert, dass nun auch die Privilegstufe mit einbezogen werden.  Doch jetzt wird ein Exceptions 13 ausgelöst.  Wenn ich jedoch Privilegstufe auf 0 setze geht alles
void f3(){while(1);}
Tasks.add(0x0 ,0xffffffff,(unsigned int) &t_f1,0,(unsigned int) f1,0, true);
Tasks.add(0x0 ,0xffffffff,(unsigned int) &t_f3,0,(unsigned int) f3,3, true);

unsigned short CTask::add(unsigned int base, unsigned int size, unsigned int tss_base ,                   unsigned int page_base, unsigned int start,unsigned char privileg , bool update)  //paging noch nicht enthalten
/// Code Segement
i = GDT->add(base,size,0x9A | ((privileg & 3) << 5),G); //G==3
p_tss->CS = (i << 3) | (privileg & 3);
/// Data Segement
i = GDT->add(base,size,0x92 | ((privileg & 3) << 5),G);
i = (i << 3) | (privileg & 3);
p_tss->DS = i;
p_tss->ES = i;
p_tss->FS = (privileg & 3);
p_tss->GS = (privileg & 3);
p_tss->EIP = start;
p_tss->EFLAGS = 0x90200;
p_tss->CR3 = page_base;
//noch schlecht
p_tss->ESP = 0x300000 + task_Eintraege * 0x10000;
p_tss->SS = i;//0x10;

Ist beim Rinwechsel noch etwas wichtiges zu beachten? :?
29
Also das Problem war, dass ich jeweils eine TSS (oder für Software Multitasking etwas entsprechendes) vor jedem Task anordnen will. Ich geben jetzt einfach 2 Adressen in einer Funktion, die Tasks erstellt mit. Einmal, wo der Task anfängt und die andere Adresse, wo die TSS anfängt. Damit ich das ganze auch leichter Testen kann.

Jetzt hab ich aber doch noch ein Problem und zwar brauch ich, für die Test Funktionen/Tasks auch noch längen. Unter C/C++ weis ich nicht, wie man das von einer Funktion ermitteln kann. Ich weis nicht, ob Gcc das Chronologisch kompiliert, weil bei zwei Funktionen (f1, f2) wobei f1 über f2 sich befindet. Rechne ich das ganze dann so aus: (Wenn das so überhaupt richtig ist)
a = (int*)f2- (int*)f1;doch die Differenz ist viel zu hoch.
30
Ok ich sehe das ist nicht so einfach mit dem Linker, ich löse das glaub ich doch anders.
Trotzdem Danke.   :-)
31
Das zweite ist das, hätte mich doch präziser ausdrücken sollen.

Und wie macht man das konkret im Linker Script (ich kenne mich mit dem Linker nicht so aus),
wenn ich z. B. Funktion f und Variable v (die vom Type einer beliebigen Struktur ist) habe?
32
Lowlevel-Coding / Struktur an einer bestimmten Stelle kompilieren
« am: 08. November 2008, 11:18 »
Ich möchte gerne folgendes mit C/C++ Erreichen, und zwar will ich, dass eine Struktur  direkt vor einer Funktion kompiliert wird.
33
Lowlevel-Coding / Re: Problem mit Zeiger auf Funktionen.
« am: 26. October 2008, 16:11 »
So funktioniert es jetzt.
Danke :-)
34
Lowlevel-Coding / Re: Problem mit Zeiger auf Funktionen.
« am: 26. October 2008, 12:53 »
Ich hab das jetzt so gemacht:
typedef int (*(KeyDown_T)(char scan1, char scan2, unsigned char shift));
typedef int (*(KeyPress_T)(char Ascii));
typedef int (*(KeyUp_T)(char scan1, char scan2, unsigned char shift));

struct key_func
{
KeyDown_T Key_down;
KeyPress_T Key_press;
KeyUp_T Key_up;
unsigned char Activ;
} Key_Functionen;
void Add_Keydown(KeyDown_T Func)
{
Key_Functionen.Key_down = Func;
}

void Add_Keydown(KeyPress_T Func)
{
Key_Functionen.Key_press = Func;
}

void Add_Keydown(KeyUp_T Func)
{
Key_Functionen.Key_up = Func;
}
Und dann kommen diese Fehlermedungen heraus:
driver.cpp:255: error: invalid use of member (did you forget the '&' ?)
driver.cpp: In function 'void Add_Keydown(int* (*)(char))':
driver.cpp:260: error: invalid use of member (did you forget the '&' ?)
driver.cpp: In function 'void Add_Keydown(int* (*)(char, char, unsigned char))':

driver.cpp:263: error: redefinition of 'void Add_Keydown(int* (*)(char, char, un
signed char))'
driver.cpp:253: error: 'void Add_Keydown(int* (*)(char, char, unsigned char))' p
reviously defined here
driver.cpp:265: error: invalid use of member (did you forget the '&' ?)
35
Lowlevel-Coding / Problem mit Zeiger auf Funktionen.
« am: 25. October 2008, 17:48 »
Ich habe folgende Struktur gemacht:
struct key_func
{
    int (*(Key_down)(unsigned char scan1, unsigned char scan2, unsigned char shift));
    int (*(Key_press)(unsigned char Ascii));
    int (*(Key_up)(unsigned char scan1, unsigned char scan2, unsigned char shift));
    unsigned char Activ;
}Key_Functionen;
Mit einer Add Funktion will ich jetzt der Struktur Funktionen zuweisen:
void Add(int Type, void Func())
{
    switch (Type)
    {
        case 1:   //Key_down
            Key_Functionen.Key_down = &Func;
            break;
        case 2:   //Key_press
            Key_Functionen.Key_press = &Func;
            break;
        case 3:   //Key_up
            Key_Functionen.Key_up = &Func;
            break;
    }
}
Hier weis ich nicht genau wie das geht.
36
Lowlevel-Coding / Re: Problem mit IDT unter C/C++
« am: 22. October 2008, 14:53 »
Ja da muss ein & und kein && hin, deswegen auch die 1.
Funktioniert jetzt.
Danke  :-)
37
Lowlevel-Coding / Re: Problem mit IDT unter C/C++
« am: 22. October 2008, 13:55 »
Hab halbwegs den Fehler gefunden.
Irgendwie schreibt  make_IDT  in IDT[x].offset_low immer eine 1 hinein, wenn ich jetzt in der Main Funktion, für z.B. IDT[50] das eintrage funktioniert das für INT 50:
        int a;
char H[12];
        IDT[50].offset_low = (((unsigned int) int50) & 0xffff);
a = IDT[50].offset_low;

Video.IntToStr(a,H);
Video.TextOut(H,10);
Ich hab auch überprüft, ob andere Funktion auf IDT zugreifen, was keine, außer die gewünschten, tut. (einmal Lokal IDT deklariert)
Ich weis nicht, woran das im Moment noch liegen kann. :?
38
Lowlevel-Coding / Re: Problem mit IDT unter C/C++
« am: 21. October 2008, 13:03 »
Ja du hast recht das muss durch Nummeriert werden und außerdem muss das i mindestens ein unsigned short sein, weil sonst die Schleife nie zu Ende geht. (weil i ja nicht 256 sondern dann wieder 0 wird). Jetzt stürzt er immer ab, wenn ein Interrupt aufgerufen wird.

Ich hatte auch zwischen durch eine Fehlermeldung von Bochs, die ich zur Zeit nicht mehr bekomme, obwohl ich eigentlich nichts geändert habe
call_protected: CS selector nullIch kann mir denke was das bedeutet, aber nicht, wie das entsteht.
39
Lowlevel-Coding / Problem mit IDT unter C/C++
« am: 20. October 2008, 16:41 »
Ich will mit C/C++ die IDT Laden. Im Boot Loader hab ich noch die Hardware Interrups umgeleitet:

irq:
mov al, 00010001b ;Das ICW in AL schreiben
out 0x20, al ;ICW an PIC1 senden
out 0xA0, al ;ICW an PIC2 senden

mov al, 0x20 ;AL auf 32 setzen
out 0x21, al ;ICW2 an ersten PIC senden
mov al, 0x28 ;AL auf 40 setzen
out 0xA1, al ;ICW2 an zweiten PIC senden

mov al, 00000100b ;Die IRQ2 Leitung auf 1 setzen
out 0x21, al ;An den Master-PIC senden
mov al, 2 ;Hier nun die NUMMER der IRQ-Leitung angeben
out 0xA1, al ;An den Slave-PIC senden

mov al, 00000001b ;Die Bits wie oben beschrieben setzen
out 0x21, al ;ICW4 an Master-PIC senden
out 0xA1, al ;ICW4 an Slave-PIC senden
retn
Und im C Kernel hab ich dazu folgenden Code:

struct idt_daten{
    unsigned short limit;
    unsigned int base;
  }  __attribute__((packed));

struct idt_entry
{
unsigned short offset_low;
unsigned short selector;
unsigned char zero;
unsigned char access;
unsigned short offset_high;
} __attribute__((packed));

struct idt_entry IDT[256];

void setup_IDT()
{
unsigned char i;
make_IDT(i,(unsigned int) int0,8,0x8E);
make_IDT(i,(unsigned int) int1,8,0x8E);



make_IDT(i,(unsigned int) int50,8,0x8E);

for(i = 51; i < 256; i++)
{
make_IDT(i,(unsigned int) int00,8,0x8E);
}
}


void make_IDT(unsigned char n, unsigned int iBase, unsigned short shSelector, unsigned char cAccess)
{
IDT[n].offset_low = ((iBase) && 0xffff);
IDT[n].selector =shSelector;
IDT[n].zero =0;
IDT[n].access = cAccess;
IDT[n].offset_high = ((iBase >> 16) & 0xffff);
}

void LoadIDT()
{
  struct idt_daten idt_ptr;
  idt_ptr.limit  = 256*8 - 1;
  idt_ptr.base  = (unsigned int)IDT;

  //IDT laden
  asm("lidt %0" : : "m" (idt_ptr));
}
Und eine Funktion im asm Teil.
_int50:
mov esi, 0xb8030
mov byte [esi], 'T'
mov byte [esi+1], 10
iret


Und der Aufruf in der Main Funktion:
setup_IDT();
LoadIDT();
asm("int $50");
Jedoch sehe ich kein Ergebnis auf den Bildschirm.
Woran kann das liegen?
40
Lowlevel-Coding / Re: Problem beim Linken vom C++ Kernel
« am: 11. October 2008, 12:09 »
Ja geht jetzt.
Danke    :-)
Seiten: 1 [2] 3 4 ... 6

Einloggen