Implement page allocation

This commit is contained in:
Mathieu Maret 2018-08-09 22:19:34 +02:00
parent 0930f2664a
commit 6cb8b4372a
5 changed files with 70 additions and 11 deletions

View File

@ -9,3 +9,11 @@ void *memcpy(void *dst, const void *src, size_t n)
}
return dst;
}
void *memset(void *src, int c, size_t n)
{
for (char *ptr = (char *)src; n > 0; n--, ptr++) {
*ptr = (char)c;
}
return src;
}

View File

@ -2,3 +2,4 @@
#include "stdarg.h"
void *memcpy(void *dest, const void *src, size_t n );
void *memset(void *s, int c, size_t n);

View File

@ -4,6 +4,7 @@
#include "interrupt.h"
#include "io.h"
#include "irq.h"
#include "klibc.h"
#include "mem.h"
#include "multiboot.h"
#include "pit.h"
@ -16,8 +17,8 @@ void cpuid(int code, uint32_t *a, uint32_t *d)
asm volatile("cpuid" : "=a"(*a), "=d"(*d) : "0"(code) : "ebx", "ecx");
}
// Multiboot information available here : https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#kernel_002ec
// Multiboot information available here :
// https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#kernel_002ec
void kmain(unsigned long magic, unsigned long addr)
{
unsigned long upper_mem = 0;

View File

@ -1,7 +1,13 @@
#include "mem.h"
#include "list.h"
#include "vga.h"
struct mem_desc *page_desc = (struct mem_desc *)&__ld_kernel_end;
static struct mem_desc *page_desc = (struct mem_desc *)&__ld_kernel_end;
static struct mem_desc *free_page;
static struct mem_desc *used_page;
static unsigned long bottom_mem;
static unsigned long top_mem;
int memInit(unsigned long upper_mem)
{
@ -10,13 +16,53 @@ int memInit(unsigned long upper_mem)
(unsigned long)page_desc +
((upper_mem) / (PAGE_SIZE / 1024)) * sizeof(struct mem_desc);
uint lastUsed = (memdesc_end >> PAGE_SHIFT) + 1;
list_init(free_page);
list_init(used_page);
bottom_mem = lastUsed;
top_mem = upper_mem;
for (uint i = 0; i < (upper_mem / (PAGE_SIZE / 1024)); i++) {
struct mem_desc *mem = &page_desc[i];
if (i < lastUsed)
if (i < lastUsed) {
mem->ref = 1;
else
list_add_tail(used_page, mem);
} else {
mem->ref = 0;
list_add_tail(free_page, mem);
}
mem->phy_addr = i * PAGE_SIZE;
}
return 0;
}
struct mem_desc *addr2memDesc(unsigned long addr)
{
if (addr > top_mem || addr < bottom_mem)
return NULL;
int idx = addr >> PAGE_SHIFT;
return page_desc + idx;
}
unsigned long allocPage(void)
{
if (list_is_empty(free_page))
return (unsigned long)NULL;
struct mem_desc *mem = list_pop_head(free_page);
mem->ref = 1;
list_add_tail(used_page, mem);
return mem->phy_addr;
}
int unrefPage(unsigned long addr)
{
struct mem_desc *mem = addr2memDesc(addr);
if (!mem) {
return -1;
}
mem->ref--;
if (mem->ref == 0) {
list_add_tail(free_page, mem);
}
return 0;
}

View File

@ -12,7 +12,10 @@ extern uint32_t __ld_kernel_end;
struct mem_desc{
unsigned long phy_addr;
unsigned long ref;
struct mem_desc *next, *prev;
};
int memInit(unsigned long upper_mem);
unsigned long allocPage(void);
int unrefPage(unsigned long addr);