First steps: getting memory map from Limine request and looking at it
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <limine.h>
|
||||
#include "../../kernel.h"
|
||||
#include "../../string/string.h"
|
||||
|
||||
// We won't be linked to standard library, but still need the basic mem* functions
|
||||
// so everything goes allright with the compiler
|
||||
@@ -67,4 +70,47 @@ int memcmp(const void* s1, const void* s2, size_t n)
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Display the memmap so we see how the memory is laid out at handoff
|
||||
void memmap_display(struct limine_memmap_response* response)
|
||||
{
|
||||
DEBUG("Got memory map from Limine: revision %u, %u entries", response->revision, response->entry_count);
|
||||
|
||||
for (size_t i=0; i<response->entry_count; i++)
|
||||
{
|
||||
struct limine_memmap_entry* entry = response->entries[i];
|
||||
char type[32] = {0};
|
||||
switch(entry->type)
|
||||
{
|
||||
case LIMINE_MEMMAP_USABLE:
|
||||
strcpy(type, "USABLE");
|
||||
break;
|
||||
case LIMINE_MEMMAP_RESERVED:
|
||||
strcpy(type, "RESERVED");
|
||||
break;
|
||||
case LIMINE_MEMMAP_ACPI_RECLAIMABLE:
|
||||
strcpy(type, "ACPI_RECLAIMABLE");
|
||||
break;
|
||||
case LIMINE_MEMMAP_ACPI_NVS:
|
||||
strcpy(type, "ACPI_NVS");
|
||||
break;
|
||||
case LIMINE_MEMMAP_BAD_MEMORY:
|
||||
strcpy(type, "BAD_MEMORY");
|
||||
break;
|
||||
case LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE:
|
||||
strcpy(type, "BOOTLOADER_RECLAIMABLE");
|
||||
break;
|
||||
case LIMINE_MEMMAP_KERNEL_AND_MODULES:
|
||||
strcpy(type, "KERNEL_AND_MODULES");
|
||||
break;
|
||||
case LIMINE_MEMMAP_FRAMEBUFFER:
|
||||
strcpy(type, "FRAMEBUFFER");
|
||||
break;
|
||||
default:
|
||||
strcpy(type, "UNKNOWN");
|
||||
break;
|
||||
}
|
||||
DEBUG("entry %u: [%016x | %u bytes] - %s", i, entry->base, entry->length, type);
|
||||
}
|
||||
}
|
||||
@@ -8,4 +8,6 @@ void* memset(void* s, int c, size_t n);
|
||||
void* memmove(void *dest, const void* src, size_t n);
|
||||
int memcmp(const void* s1, const void* s2, size_t n);
|
||||
|
||||
void memmap_display(struct limine_memmap_response* response);
|
||||
|
||||
#endif
|
||||
16
src/mem/paging/paging.h
Normal file
16
src/mem/paging/paging.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef PAGING_PMM_H
|
||||
#define PAGING_PMM_H
|
||||
|
||||
/*
|
||||
We are going to use a bitmap, consisting of an array of uint64_t
|
||||
to represent pages for the PMM (physical memory manager).
|
||||
|
||||
Bit set (1) = page used
|
||||
Bit clear (0) = page free
|
||||
|
||||
*/
|
||||
|
||||
#define PAGE_SIZE 4096
|
||||
#define BITS_PER_ROW 64
|
||||
|
||||
#endif
|
||||
17
src/mem/paging/pmm.c
Normal file
17
src/mem/paging/pmm.c
Normal file
@@ -0,0 +1,17 @@
|
||||
// OMG here we are. I'm cooked.
|
||||
|
||||
/*
|
||||
pmm - Physical Memory Manager
|
||||
will manage 4kb pages physically
|
||||
it will probably need to get some info from Limine,
|
||||
to see which pages are used by kernel/bootloader/mmio/fb etc.
|
||||
*/
|
||||
|
||||
#include "paging.h"
|
||||
|
||||
/*
|
||||
First we'll have to discover the physical memory layout,
|
||||
and for that we can use a Limine request.
|
||||
*/
|
||||
|
||||
uint64_t pages_bitmap[];
|
||||
Reference in New Issue
Block a user