Autor Thema: binarys laden...  (Gelesen 17427 mal)

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 09. May 2006, 19:33 »
danke habs hingebracht!!

aber nun muss mein kernel auch wieder den gewohnten verlauf nehmen koenen wie mach ich das am besten dass mein kernel dann wieder so weiterlauft wie gehabt... ich kann zwar wieder in funnktionen im kernel springen doch die funken nicht mehr so wie sie sollten...

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 09. May 2006, 20:18 »
Ja das ist schwierig.....
Könntest du mal ein bisschen Code von deinem Kernel posten (nur die Hauptroutine)??

Aber du könntest deinen Interrupt so machen, dass er nicht direkt auf den Kernel zeigt, sondern in eine eigene Routine. Diese Routine verändert die Rücksprung-Adresse auf dem Stack dann so, dass mittels IRET in den Kernel gesprungen wird.

Ein anderes Problem könnte sein, dass du einen nicht freien Interrupt benützt. Ich würde da einen über  0x30 nehmen.


Gruss
Nooooooooooos

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 10. May 2006, 21:12 »
wie wäre es denn mit einer kleinen routine im kernel, die einfach den stackpointer erhöht, um die rücksprungadresse des ints zu löschen? die wird per int angesprochen und steht direkt vor der stelle, an der es nach dem programm weitergehen soll.

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 17. May 2006, 20:36 »
ich hab noch ne frage wie geb ich den interrupt in der IVT genau an ich wollte den interrupt

0x31 haben den hab ich folgendermassen in der IVT registriert:

 printf("Initialisiere Interrupts...");
   
    int buffer = ds;

    edx=(cs<<16)+interruptHandler;
    asm{
        mov cx,0x0
        mov ds,cx
        mov dword ptr[0xC4], edx
    }

    ds = buffer;

    printf("OK\n");


kann das so stimmen?

waenn ich dann in den interrupt springe und die ausgabe aufrufe:

int interruptHandler(void){
    konsole_main();

    printf("hallo\n");

    asm{
        siret
    }
}

kommen lauter so komische zeichen die eingabe funkt aber komischerweise nur irgendwo aufm bildschirm wird der curser gesetzt und dann kann man weiterschreiben...... was kann ich machen damit ich da sauber wieder rauskomme? ich glaub da muss ich irgendwas aufm stack aendern damit das ganze wieder passt oder? bidde bidde helft mir...
danke!

@nore tschuldigung aber ich kann dir nicht ganz folgen... ich will vom int aus ja gar nicht mehr zurueckspringen ich will wieder in den kernel springen

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 18. May 2006, 01:15 »
Keine Ahnung. Kommt auf den Compiler an. Du solltest dir die Dokumentation anschauen, oder die Disassembly.

Du brauchst unbedingt einen Wrapper, denn du darfst nicht einfach so Register ändern. Du musst sie vorher sichern. Das einfachste wäre den Wrapper für Interrupthandler komplett in Assembler zu schreiben. Meinetwegen auch Inline Assembler:

printf("Initialisiere Interrupts...");
   
    int buffer = ds;

    asm {
         jmp skip_wrapper
wrapper:
         pusha
         push ds
         push es
         push fs
         push gs
         call interruptHandler
         pop gs
         pop fs
         pop es
         pop es
         popa
         iret ; <------- das iret in dem handler brauchst du dann nicht mehr
skip_wrapper:
    }

    edx=(cs<<16)+wrapper;
    asm{
        mov cx,0x0
        mov ds,cx
        mov dword ptr[0xC4], edx
    }

    ds = buffer;

    printf("OK\n");


(achja ungetestet und guck auch auf die uhrzeit ^^)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #25 am: 18. May 2006, 01:31 »
Zitat
(achja ungetestet und guck auch auf die uhrzeit ^^)
Jo, sollte wohl ein "pop es" durch ein "pop ds" ersetzt werden. ;)

bitmaster
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 18. May 2006, 11:38 »
jupp und die Flags sollten auch noch gepusht und gepoppt werden. ;)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #27 am: 18. May 2006, 12:09 »
Zitat von: PorkChicken
jupp und die Flags sollten auch noch gepusht und gepoppt werden. ;)
^^ Nee, das macht der "int" Befehl automatisch. Der legt die Flags und die Rücksprungadresse auf dem Stack. Der "iret" springt dann zurück und läd die Flags wieder.

bitmaster
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 18. May 2006, 12:53 »
Richtig ... naja die Uhrzeit, die Uhrzeit ... ;)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #29 am: 18. May 2006, 13:36 »
Zitat von: PorkChicken
Richtig ... naja die Uhrzeit, die Uhrzeit ... ;)
Die Uhrzeit war 10:38 Uhr. ^^
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 18. May 2006, 14:09 »
nee, da hab ich noch geschlafen. Wenn dann 11:38 Uhr (wir haben Sommerzeit), also kurz nach dem Aufstehen. Da bin ich noch nicht ganz so fit. ;)
Dieser Text wird unter jedem Beitrag angezeigt.

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 18. May 2006, 20:55 »
Zitat von: PorkChicken

printf("Initialisiere Interrupts...");
   
    int buffer = ds;

    asm {
         jmp skip_wrapper
wrapper:
         pusha
         push ds
         push es
         push fs
         push gs
         call interruptHandler
         pop gs
         pop fs
         pop es
         pop es
         popa
         iret ; <------- das iret in dem handler brauchst du dann nicht mehr
skip_wrapper:
    }

    edx=(cs<<16)+wrapper;
    asm{
        mov cx,0x0
        mov ds,cx
        mov dword ptr[0xC4], edx
    }

    ds = buffer;

    printf("OK\n");



erstmal danke PorkChicken fuer deine antwort aber eins verstehe ich nicht... mit jmp skip_wrapper ueberspringst du ja alle pushs und popps? weiters frage ich mich warum muss ich alle segment register sichern ich nehm doch nur ds her... tja und wo genau soll ich diesen wrapper hernehmen? waenn ich den interrupt aufrufe? das kann ich mir nicht vorstellen denn ich brauch ja sowieso wieder einen anderen stack im kernel ich will ja von meinem interrupt aus nicht mehr zurueck in das programm...

tja... entschuldigt meine begriffstutzigkeit aber ich kann erst was programmieren waenn ichs verstehe...

danke nochmal fuer eure super hilfe!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #32 am: 18. May 2006, 23:02 »
@noob: Sorry, aber scheinst noch nicht viel mit OS Programmierung am Hut zu haben. Ja man springt zum "skip_wrapper" um dem Interrupt die Adresse zuzuweisen. Da wird da ja noch nicht ausgelöst. Erst wenn du mit "int XXh" den aufrufst, wird der Code mit den push/pop's ausgeführt. Warum er alle Segmentregister abspeichert? Weil er/wir ja nicht wissen was der code von "interruptHandler" macht. Wenn der natürlich nur ds verändert, brauchst du die anderen nicht abspeichern.

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #33 am: 18. May 2006, 23:03 »
Zitat von: PorkChicken
nee, da hab ich noch geschlafen. Wenn dann 11:38 Uhr (wir haben Sommerzeit), also kurz nach dem Aufstehen. Da bin ich noch nicht ganz so fit. ;)
so so ^^
In the Future everyone will need OS-64!!!

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 19. May 2006, 11:40 »
Zitat von: bitmaster
@noob: Sorry, aber scheinst noch nicht viel mit OS Programmierung am Hut zu haben.
bitmaster


tja aber es ist einfach so dass ich gerne nachfage... ausserdem kann man sich das ganze ja so nicht wirklich aus tutorials lernen kann... :-( tja und mit dem os will ich mich in die os entwicklung ja einarbeiten!!!

mfg noob

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 19. May 2006, 12:22 »
der code ist natürlich nur zur veranschaulichung. ich würde nicht unbedingt interrupthandler in andere funktionen einbetten. weil ich es aber getan habe, muss ich über diesen interrupthandler (genauer: den wrapper) rüberspringen, damit er nicht ausgeführt wird, wenn die umgebende funktion ausgeführt wird.

besser ist es die wrapper in externe assembler-dateien zu tun.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #36 am: 19. May 2006, 13:03 »
Zitat von: PorkChicken
der code ist natürlich nur zur veranschaulichung. ich würde nicht unbedingt interrupthandler in andere funktionen einbetten. weil ich es aber getan habe, muss ich über diesen interrupthandler (genauer: den wrapper) rüberspringen, damit er nicht ausgeführt wird, wenn die umgebende funktion ausgeführt wird.

besser ist es die wrapper in externe assembler-dateien zu tun.
Jo, sehe ich genau so. Aber er will doch bloß ein Interrupt (vielleicht nicht mal ein ganzer sondern nur ein Teil, also eine Nummer die man z.B. in eax oder ax, ah, al oder so angibt) der die laufende Datei beendet und zum kernel oder shell zurückspringt. Also ich glaube der möchte sowas in der Art:

cmd>: programm.exe ;Beispiel startet programm.exe

code von programm.exe:

... ;beliebiger Code
mov ax,0 ;ende z.B. Funktion 0
int 21h ;z.B. Interrupt 21h


der Code der Funktion 0 des int 21h springt dann zurück zur Shell

cmd>: ;da möchte er wieder hin

Der Code der Funktion 0 des int 21h bräuchte dann ja nur z.B. so aussehen:

int21h_0000h:
mov ax,1000h ;Segment der Shell
mov ds,ax
mov es,ax
mov ax,2000h ;Stack Segment
mov ss,ax
mov sp,0FFFFh ;Stackoffset
jmp 1000h:Shelloffset ;Shelloffset = stelle in der Shell die "cmd>: " neu zeichnet und auf neue Eingabe wartet



So das ist ein Beispiel wie ich vermute was er haben möchte.


bitmaster
In the Future everyone will need OS-64!!!

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 19. May 2006, 19:53 »
hi!

ich hab nun alles ausprobiert aber es funkt leider nicht :-( aber ich habe eine idee! immer waenn ich den interrupt aus dem kernel heraus aufrufe dann kann ich einfach mit konsole(); in meine konsole zurueckspringen und es funkt wunderbar... aber waenn ich das aus der applikation herausmache dann geht es nicht :-( nun stellt sich fuer mich die frage was anedert sich und ich bin zu dem schluss gekommen das es irgendwie was mit dem stack hat... wie kann ich den nach dem aufruf wieder in den originalzustand zurueckversetzen?

danke!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 19. May 2006, 20:47 »
Das ist schwer zu sagen. Kommt drauf an, wie du den Code lädst. Kann aber sein dass über den Interrupt das Segment oder die Flags gewechselt werden.

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 27. May 2006, 14:19 »
hi!

laden tu ich die bin folgendermassen:


int loadBin(char *paht){
    int seg = 0;
    int lsn = analytePath(paht);
    int i;

printf("%d\n", lsn);
   
    asm{
        mov ax, 0x8000
        mov es, ax
    }

    for(i = 0; i < 20; i++){
        readBin(seg, ((lsn) / 18) % 2, (lsn) / 36, ((lsn) % 18) +1, 1);
        seg+=512;
        lsn++;
    }

    asm {
        fcall 0x8000,0x0000
    }

    printf("_\n");

    return -1;
}


so das prog wird auch richtig geladen...

aber wie bekomm ich meine Einstellungen (stack,etc...) wieder zurueck?

danke...

 

Einloggen