aboutsummaryrefslogtreecommitdiff
path: root/kernel/l0/kmain.c
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ens.fr>2014-12-07 11:49:52 +0100
committerAlex Auvolat <alex.auvolat@ens.fr>2014-12-07 11:49:52 +0100
commitd7aaba8c85cc71f3184cddcf20b740c5157c864d (patch)
treed99c9d6765eb433c73498c5e99ebcdb088c0e7e6 /kernel/l0/kmain.c
parent26b68c108664cb54089613bdbc54624ed66f7fda (diff)
downloadkogata-d7aaba8c85cc71f3184cddcf20b740c5157c864d.tar.gz
kogata-d7aaba8c85cc71f3184cddcf20b740c5157c864d.zip
Refactor kmalloc & tests in kmain.
Diffstat (limited to 'kernel/l0/kmain.c')
-rw-r--r--kernel/l0/kmain.c130
1 files changed, 56 insertions, 74 deletions
diff --git a/kernel/l0/kmain.c b/kernel/l0/kmain.c
index b70c6f4..e6831b2 100644
--- a/kernel/l0/kmain.c
+++ b/kernel/l0/kmain.c
@@ -8,6 +8,7 @@
#include <frame.h>
#include <paging.h>
#include <region.h>
+#include <kmalloc.h>
#include <slab_alloc.h>
@@ -18,66 +19,12 @@ void breakpoint_handler(registers_t *regs) {
BOCHS_BREAKPOINT;
}
-void* page_alloc_fun_for_kmalloc(size_t bytes) {
- void* addr = region_alloc(bytes, REGION_T_CORE_HEAP, default_allocator_pf_handler);
- dbg_printf("[alloc 0x%p for kmalloc : %p]\n", bytes, addr);
- return addr;
-}
-
void yield() {
// multitasking not implemented yet
dbg_printf("Warning : probable deadlock?\n");
}
-slab_type_t slab_sizes[] = {
- { "8B obj", 8, 2 },
- { "16B obj", 16, 2 },
- { "32B obj", 32, 2 },
- { "64B obj", 64, 4 },
- { "128B obj", 128, 4 },
- { "256B obj", 256, 4 },
- { "512B obj", 512, 8 },
- { "1KB obj", 1024, 8 },
- { "2KB obj", 2048, 16 },
- { "4KB obj", 4096, 16 },
- { 0, 0, 0 }
-};
-
-
-void kmain(struct multiboot_info_t *mbd, int32_t mb_magic) {
- dbglog_setup();
-
- dbg_printf("Hello, kernel world!\n");
- dbg_printf("This is %s, version %s.\n", OS_NAME, OS_VERSION);
-
- ASSERT(mb_magic == MULTIBOOT_BOOTLOADER_MAGIC);
-
- gdt_init(); dbg_printf("GDT set up.\n");
-
- idt_init(); dbg_printf("IDT set up.\n");
- idt_set_ex_handler(EX_BREAKPOINT, breakpoint_handler);
- asm volatile("int $0x3"); // test breakpoint
-
- size_t total_ram = ((mbd->mem_upper + mbd->mem_lower) * 1024);
- dbg_printf("Total ram: %d Kb\n", total_ram / 1024);
-
- // used for allocation of data structures before malloc is set up
- // a pointer to this pointer is passed to the functions that might have
- // to allocate memory ; they just increment it of the allocated quantity
- void* kernel_data_end = &k_end_addr;
-
- frame_init_allocator(total_ram, &kernel_data_end);
- dbg_printf("kernel_data_end: 0x%p\n", kernel_data_end);
- dbg_print_frame_stats();
-
- paging_setup(kernel_data_end);
- dbg_printf("Paging seems to be working!\n");
-
- BOCHS_BREAKPOINT;
-
- region_allocator_init(kernel_data_end);
- dbg_print_region_stats();
-
+void region_test1() {
void* p = region_alloc(0x1000, REGION_T_HW, 0);
dbg_printf("Allocated one-page region: 0x%p\n", p);
dbg_print_region_stats();
@@ -102,20 +49,18 @@ void kmain(struct multiboot_info_t *mbd, int32_t mb_magic) {
region_free(s);
dbg_printf("Freed region 0x%p\n", s);
dbg_print_region_stats();
- BOCHS_BREAKPOINT;
+}
+void region_test2() {
// allocate a big region and try to write into it
+ dbg_printf("Begin region test 2...");
const size_t n = 200;
void* p0 = region_alloc(n * PAGE_SIZE, REGION_T_HW, default_allocator_pf_handler);
for (size_t i = 0; i < n; i++) {
uint32_t *x = (uint32_t*)(p0 + i * PAGE_SIZE);
- dbg_printf("[%i : ", i);
x[0] = 12;
- dbg_printf(" : .");
x[1] = (i * 20422) % 122;
- dbg_printf("]\n", i);
}
- BOCHS_BREAKPOINT;
// unmap memory
for (size_t i = 0; i < n; i++) {
void* p = p0 + i * PAGE_SIZE;
@@ -129,35 +74,72 @@ void kmain(struct multiboot_info_t *mbd, int32_t mb_magic) {
frame_free(f, 1);
}
- region_free(s);
- BOCHS_BREAKPOINT;
+ region_free(p0);
+ dbg_printf("OK\n");
+}
- // Test slab allocator !
- mem_allocator_t *a =
- create_slab_allocator(slab_sizes, page_alloc_fun_for_kmalloc,
- region_free_unmap_free);
- dbg_printf("Created slab allocator at 0x%p\n", a);
+void kmalloc_test(void* kernel_data_end) {
+ // Test kmalloc !
dbg_print_region_stats();
+ dbg_printf("Begin kmalloc test...\n");
const int m = 200;
- uint16_t** ptr = slab_alloc(a, m * sizeof(uint32_t));
+ uint16_t** ptr = kmalloc(m * sizeof(uint32_t));
for (int i = 0; i < m; i++) {
size_t s = 1 << ((i * 7) % 11 + 2);
- ptr[i] = (uint16_t*)slab_alloc(a, s);
+ ptr[i] = (uint16_t*)kmalloc(s);
ASSERT((void*)ptr[i] >= kernel_data_end && (size_t)ptr[i] < 0xFFC00000);
*ptr[i] = ((i * 211) % 1024);
- dbg_printf("Alloc %i : 0x%p\n", s, ptr[i]);
}
+ dbg_printf("Fully allocated.\n");
dbg_print_region_stats();
for (int i = 0; i < m; i++) {
for (int j = i; j < m; j++) {
ASSERT(*ptr[j] == (j * 211) % 1024);
}
- slab_free(a, ptr[i]);
+ kfree(ptr[i]);
}
+ kfree(ptr);
+ dbg_printf("Kmalloc test OK.\n");
dbg_print_region_stats();
- dbg_printf("Destroying slab allocator...\n");
- destroy_slab_allocator(a);
- dbg_print_region_stats();
+}
+
+void kmain(struct multiboot_info_t *mbd, int32_t mb_magic) {
+ dbglog_setup();
+
+ dbg_printf("Hello, kernel world!\n");
+ dbg_printf("This is %s, version %s.\n", OS_NAME, OS_VERSION);
+
+ ASSERT(mb_magic == MULTIBOOT_BOOTLOADER_MAGIC);
+
+ gdt_init(); dbg_printf("GDT set up.\n");
+
+ idt_init(); dbg_printf("IDT set up.\n");
+ idt_set_ex_handler(EX_BREAKPOINT, breakpoint_handler);
+ asm volatile("int $0x3"); // test breakpoint
+
+ size_t total_ram = ((mbd->mem_upper + mbd->mem_lower) * 1024);
+ dbg_printf("Total ram: %d Kb\n", total_ram / 1024);
+
+ // used for allocation of data structures before malloc is set up
+ // a pointer to this pointer is passed to the functions that might have
+ // to allocate memory ; they just increment it of the allocated quantity
+ void* kernel_data_end = &k_end_addr;
+
+ frame_init_allocator(total_ram, &kernel_data_end);
+ dbg_printf("kernel_data_end: 0x%p\n", kernel_data_end);
+ dbg_print_frame_stats();
+
+ paging_setup(kernel_data_end);
+ dbg_printf("Paging seems to be working!\n");
+
+ BOCHS_BREAKPOINT;
+
+ region_allocator_init(kernel_data_end);
+ region_test1();
+ region_test2();
+
+ kmalloc_setup();
+ kmalloc_test(kernel_data_end);
PANIC("Reached kmain end! Falling off the edge.");