Requesting the BIOS' memory map

This commit is contained in:
Thomas Oltmann 2026-02-18 01:27:49 +01:00
parent 68d47cd451
commit ae735033f0
2 changed files with 53 additions and 1 deletions

View file

@ -40,12 +40,23 @@ void serial_write(const char *msg)
}
extern void bios_write(const char *msg, unsigned length);
extern void *bios_getmap(void *buffer);
unsigned char memmap[24 * 128];
void
main()
{
bios_write("init\r\n", 6);
void *end = bios_getmap(memmap);
bios_write("karlos\r\n", 8);
for (int i = 0; ; i++) {
unsigned char *entry = memmap + 24 * i;
if (entry >= end) break;
unsigned char type = *(entry + 16);
char c = type < 10 ? type + '0' : '?';
bios_write(&c, 1);
}
for (;;) {
__asm__ ("hlt" :);
}

43
Rnbp.S
View file

@ -1,4 +1,4 @@
// vim: et:sw=12:ts=12:sts=12
// vim: ft=gas:et:sw=12:ts=12:sts=12
.global _start
@ -13,6 +13,7 @@
.code32
mov $SS_DATA16, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
ljmp $SS_CODE16, $9f
9: .code16
@ -22,6 +23,7 @@
.code16
mov $SS_DATA32, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
ljmp $SS_CODE32, $9f
9: .code32
@ -164,6 +166,45 @@ bios_write: push %ebp
pop %ebp
ret
.global bios_getmap
.code32
bios_getmap:push %ebp
mov %esp, %ebp
push %ebx
push %edi
mov 8+0(%ebp), %edi
PROT16
.code16
REAL
xor %ebx, %ebx
_gmnext: movl $0, 20(%di)
mov $0x534D4150, %edx // e820 magic number
mov $24, %ecx
mov $0xE820, %eax
int $0x15
jc _gmdone
test %ebx, %ebx
jz _gmdone
add $24, %di
jmp _gmnext
_gmdone: add $24, %di
PROT
PROT32
.code32
mov %edi, %eax
pop %edi
pop %ebx
mov %ebp, %esp
pop %ebp
ret
.data
real_ss: .word 0