init.c (1738B)
1 #include <multiboot.h> 2 #include <fns.h> 3 #include <keyboard/keyboard.h> 4 5 extern void test_syscall_write(); 6 extern size_t test_syscall_read(); 7 8 void multiboot(uint32_t magic, multiboot_info_t *mbi) { 9 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { 10 kpanic("invalid magic number!"); 11 } 12 13 if (!(mbi->flags & (1 << 6))) { 14 kpanic("invalid memory map given by GRUB"); 15 } 16 uint32_t offset = 0; 17 uint64_t total_ram = 0; 18 while (offset < mbi->mmap_length) { 19 multiboot_memory_map_t *entry = (multiboot_memory_map_t*)(mbi->mmap_addr + offset); 20 if (entry->type == MULTIBOOT_MEMORY_AVAILABLE) { 21 total_ram += entry->len; 22 } 23 offset += entry->size + sizeof(entry->size); 24 } 25 printk("memory size: %d KiB (%d MiB)\n", 26 (int)(total_ram / 1024), 27 (int)(total_ram / (1024 * 1024))); 28 } 29 30 void init(uint32_t magic, multiboot_info_t *mbi) { 31 tty_init(); 32 vfs_write(stdout, "tty initialized\n", 16); 33 34 gdt_init(); 35 vfs_write(stdout, "gdt initialized\n", 16); 36 37 idt_init(); 38 vfs_write(stdout, "idt initialized\n", 16); 39 40 pit_init(1000); 41 vfs_write(stdout, "pit initialized (freq = 1000)\n", 30); 42 43 syscall_init(); 44 vfs_write(stdout, "syscalls initialized\n", 21); 45 46 keyboard_init(); 47 vfs_write(stdout, "keyboard initialized\n", 21); 48 49 multiboot(magic, mbi); 50 vfs_write(stdout, "multiboot initialized\n", 22); 51 52 /* enable interrupts */ 53 asm volatile ("sti"); 54 } 55 56 void bin_init_prog() { 57 while(1) { 58 char c; 59 size_t bytes = vfs_read(stdin, &c, 1); 60 61 if (bytes > 0) { 62 vfs_write(stdout, &c, 1); 63 } else { 64 asm volatile("hlt"); 65 } 66 } 67 } 68 69 void start_kernel(uint32_t magic, multiboot_info_t *mbi) { 70 init(magic, mbi); 71 72 bin_init_prog(); 73 74 kpanic("failed to start /bin/init"); 75 }