First step for memory management
This commit is contained in:
parent
ca4489f4cc
commit
1f164a7a4e
@ -4,6 +4,7 @@
|
|||||||
#include "interrupt.h"
|
#include "interrupt.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "irq.h"
|
#include "irq.h"
|
||||||
|
#include "mem.h"
|
||||||
#include "multiboot.h"
|
#include "multiboot.h"
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
@ -19,6 +20,7 @@ void cpuid(int code, uint32_t *a, uint32_t *d)
|
|||||||
// 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)
|
void kmain(unsigned long magic, unsigned long addr)
|
||||||
{
|
{
|
||||||
|
unsigned long upper_mem = 0;
|
||||||
initVGA(BLACK, GREEN);
|
initVGA(BLACK, GREEN);
|
||||||
printString("Setting up IDT\n");
|
printString("Setting up IDT\n");
|
||||||
gdtSetup();
|
gdtSetup();
|
||||||
@ -35,6 +37,7 @@ void kmain(unsigned long magic, unsigned long addr)
|
|||||||
printString("KB mem_upper = ");
|
printString("KB mem_upper = ");
|
||||||
printInt((unsigned)mbi->mem_upper);
|
printInt((unsigned)mbi->mem_upper);
|
||||||
printString("KB\n");
|
printString("KB\n");
|
||||||
|
upper_mem = mbi->mem_upper;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is boot_device valid? */
|
/* Is boot_device valid? */
|
||||||
@ -52,6 +55,12 @@ void kmain(unsigned long magic, unsigned long addr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(upper_mem == 0){
|
||||||
|
printString("Cannot get upper phy mem bound. Using default value 32MB\n");
|
||||||
|
upper_mem = 32 * 1024;
|
||||||
|
}
|
||||||
|
memInit(upper_mem);
|
||||||
|
|
||||||
printString("Setting up IRQ handlers\n");
|
printString("Setting up IRQ handlers\n");
|
||||||
irqSetRoutine(IRQ_KEYBOARD, keyboard_handler);
|
irqSetRoutine(IRQ_KEYBOARD, keyboard_handler);
|
||||||
irqSetRoutine(IRQ_TIMER, timer_handler);
|
irqSetRoutine(IRQ_TIMER, timer_handler);
|
||||||
|
26
core/mem.c
Normal file
26
core/mem.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include "mem.h"
|
||||||
|
#include "vga.h"
|
||||||
|
|
||||||
|
struct mem_desc *page_desc = (struct mem_desc *)&__ld_kernel_end;
|
||||||
|
|
||||||
|
int memInit(unsigned long upper_mem)
|
||||||
|
{
|
||||||
|
printString("Free Mem going from ");
|
||||||
|
printInt((unsigned long)&__ld_kernel_end);
|
||||||
|
printString(" to ");
|
||||||
|
printInt(upper_mem * 1024);
|
||||||
|
printString("\n");
|
||||||
|
unsigned long memdesc_end =
|
||||||
|
(unsigned long)page_desc +
|
||||||
|
((upper_mem) / (PAGE_SIZE / 1024)) * sizeof(struct mem_desc);
|
||||||
|
uint lastUsed = (memdesc_end >> PAGE_SHIFT) + 1;
|
||||||
|
for (uint i = 0; i < (upper_mem / (PAGE_SIZE / 1024)); i++) {
|
||||||
|
struct mem_desc *mem = &page_desc[i];
|
||||||
|
if (i < lastUsed)
|
||||||
|
mem->ref = 1;
|
||||||
|
else
|
||||||
|
mem->ref = 0;
|
||||||
|
mem->phy_addr = i * PAGE_SIZE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
18
core/mem.h
Normal file
18
core/mem.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define PAGE_SHIFT 12
|
||||||
|
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
||||||
|
|
||||||
|
// Defined in linker.ld script
|
||||||
|
extern uint32_t __ld_kernel_begin;
|
||||||
|
extern uint32_t __ld_kernel_end;
|
||||||
|
|
||||||
|
struct mem_desc{
|
||||||
|
unsigned long phy_addr;
|
||||||
|
unsigned long ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int memInit(unsigned long upper_mem);
|
@ -16,6 +16,7 @@ SECTIONS
|
|||||||
.text BLOCK(4K) : ALIGN(4K)
|
.text BLOCK(4K) : ALIGN(4K)
|
||||||
{
|
{
|
||||||
*(.multiboot)
|
*(.multiboot)
|
||||||
|
__ld_kernel_begin = .;
|
||||||
*(.text)
|
*(.text)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ SECTIONS
|
|||||||
*(.bss)
|
*(.bss)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__ld_kernel_end = .;
|
||||||
|
|
||||||
/* The compiler may produce other sections, by default it will put them in
|
/* The compiler may produce other sections, by default it will put them in
|
||||||
a segment with the same name. Simply add stuff here as needed. */
|
a segment with the same name. Simply add stuff here as needed. */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user