PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt 0x15 aufrufen (RAM ermitteln)



jay-t
29-08-2013, 14:59
Hallo ich versuche mit gccs Inline Assembler auf den Interrupt 0x15 zuzugreifen.
Es soll bei einem selbstgebauten "Kernel" das verfügbare RAM ermittelt werden.

Der Kernel wird über GRUB gestartet.
Danach vom Kernel aus die Inline Assembler Funktion aufgerufen.

Die C Funktion: AT&T syntax von gas



u64int get_memory_size_64mb (void)
{
u64int memory_size;
u32int axv, bxv;

__asm__ (
".extern axv\n\t"
".extern bxv\n\t"
"xor %cx, %cx\n\t"
"xor %dx, %dx\n\t"
"mov $0xe801, %ax\n\t"
"INT $0x15\n\t"
"jc error\n\t"
"cmp $0x86, %ah\n\t"
"je error\n\t"
"cmp $0x80, %ah\n\t"
"je error\n\t"
"jcxz useax\n\t"
"mov %cx, %ax\n\t"
"mov %dx, %bx\n"
"useax:\n\t" );
__asm__ ("mov %%ax, %0" : : "m"(axv));
__asm__ ("mov %%bx, %0" : : "m"(bxv));
__asm__ (
"error:\n\t"
"mov -1, %ax\n\t"
"mov 0, %bx\n\t" );

memory_size = bxv * 64 + (axv + 1024);

return (memory_size);
}


Crashlog von Bochs:


00468146517e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x15)
00468146517e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
00468146517e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00468146517i[CPU0 ] CPU is in protected mode (active)
00468146517i[CPU0 ] CS.mode = 32 bit
00468146517i[CPU0 ] SS.mode = 32 bit
00468146517i[CPU0 ] EFER = 0x00000000
00468146517i[CPU0 ] | EAX=0000e801 EBX=0002d000 ECX=00010000 EDX=00000000
00468146517i[CPU0 ] | ESP=021083a0 EBP=021083b0 ESI=00053c74 EDI=00000000
00468146517i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf ZF af PF cf
00468146517i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00468146517i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00468146517i[CPU0 ] | EIP=00100724 (00100724)
00468146517i[CPU0 ] | CR0=0x60000011 CR2=0x00000000
00468146517i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
(0).[468146517] [0x000000100724] 0008:00100724 (unk. ctxt): int 0x15 ; cd15
00468146517e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00468146517i[SYS ] bx_pc_system_c::Reset(HARDWARE) called
00468146517i[CPU0 ] cpu hardware reset


Frage: geht das überhaupt vom protected Mode aus den Interrupt aufrufen?
Ich meine GRUB schaltet den protected Mode ein oder?