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

Code:
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:
Code:
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?