1
Lowlevel-Coding / APM protected mode
« am: 30. March 2010, 13:50 »
Also durch die Specifikation http://www.microsoft.com/whdc/archive/amp_12.mspx zu APM und die Dokumentation der MUltibootstruktur im Wiki(http://lowlevel.brainsware.org/wiki/index.php/Multiboot) habe ich entdeckt, dass man APM auch im Protected Mode nutzen kann.
Danke der HIlfe von bluecode und kwolf im IRC habe ich herausgefunden, dass man 3 Deskriptoren in der GDT richtig anlegen muss:
Trotzdem lässt ein Aufruf von :
Hat jemand noch einen Tipp für mich?
Danke schon im Vorraus.
Gruß
Thylôn
Edit
der Fehler hat sich erledigt.
Jetzt wird die APM-Funktion (hoffentlich) aufgerufen:
Die APM-Funktion mach folgendes:
Jetzt gibt es eine Expection. Unter Bochs ein #GP und unter qemu ein #UD
Meine Frage mache ich sichtbar etwas falsch?
Unter bochs nach dem "far call" http://pastebin.com/JJjyBv3q
Gruß Thylôn
Danke der HIlfe von bluecode und kwolf im IRC habe ich herausgefunden, dass man 3 Deskriptoren in der GDT richtig anlegen muss:
Code: [Auswählen]
gdt_set_descriptor_byte_granularity(5, size_cseg, base_cseg, GDT_SEGMENT | GDT_PRESENT | GDT_CODESEG, 0);
gdt_set_descriptor_byte_granularity(6, size_cseg16, base_cseg16, GDT_SEGMENT | GDT_PRESENT | GDT_CODESEG, 0);
gdt_set_descriptor_byte_granularity(7, size_dseg, base_dseg, GDT_SEGMENT | GDT_PRESENT | GDT_DATASEG, 0);
So lege ich die Benötigten Deskriptoren an, die auch geladen werden.Trotzdem lässt ein Aufruf von :
Code: [Auswählen]
asm("mov $0x28,%%ax;mov %%ax,%%cs; xor %%eax,%%eax;movb $0x53, %%ah;movb $0x08, %%al;xor %%ebx,%%ebx;mov 0x0001,%%bx;mov 0x0001,%%cx;call %%cs:%1;jc Fehler;mov $0x01,%0;jmp done;Fehler:;mov $0x02,%0;done:;" :"=a" (ok): "m"(multiboot_struct->mi_apm->offset));
Die virtuelle Maschiene neustarten. Hat jemand noch einen Tipp für mich?
Danke schon im Vorraus.
Gruß
Thylôn
Edit
der Fehler hat sich erledigt.
Jetzt wird die APM-Funktion (hoffentlich) aufgerufen:
Code: [Auswählen]
asm("call apm": : "a"(multiboot_struct->mi_apm->offset));
Die APM-Funktion mach folgendes:
Code: [Auswählen]
apm:
pusha
mov edx,eax
xor eax,eax
mov ah,0x53
mov al,0x08
xor ebx,ebx
mov bx,0x0001
mov cx,bx
;call 0x28:[edx]
push dword cs
push dword after
push dword 0x28
push dword edx
retf
after:
popa
ret
Jetzt gibt es eine Expection. Unter Bochs ein #GP und unter qemu ein #UD
Meine Frage mache ich sichtbar etwas falsch?
Unter bochs nach dem "far call" http://pastebin.com/JJjyBv3q
Gruß Thylôn