kernel

hobby kernel
git clone git://git.evenfri.xyz/kernel.git
Log | Files | Refs | README | LICENSE

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 }