-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkernel.c
40 lines (33 loc) · 1008 Bytes
/
kernel.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "multiboot.h"
#include "kernel.h"
extern u8 _head[];
extern u8 _start[];
extern u8 _end[];
int
kmain(u32 magic, multiboot_info_t *info)
{
u32 p;
void *pgdir;
u8 *addr;
cursor_move(0);
kprintf("kernel begins at 0x%x\n", _head);
kprintf("kernel loaded at 0x%x\n", _start);
kprintf("kernel ends at 0x%x\n", _end);
p = info->mmap_addr;
while (p < info->mmap_addr + info->mmap_length) {
multiboot_memory_map_t *mmap = (multiboot_memory_map_t *) p;
u32 size = mmap->size, addr = mmap->addr, len = mmap->len;
kprintf("addr %x len %d\n", addr, len);
p += size + sizeof size;
}
kinit((void *) PAGE_ROUND_UP(_end), 2048);
pgdir = kalloc0();
//kprintf("created pgdir at %x\n", pgdir);
for (addr = _head; addr < _end; addr += PAGE_SIZE)
kmap(pgdir, addr, addr);
kmap(pgdir, (void *) 0xb8000, (void *) 0xb8000);
setcr3((u32) pgdir);
setcr0(getcr0() | CR0_PG);
kprintf("ok\n");
return 0;
}