/* Check if the compiler thinks you are targeting the wrong operating system. */ #if defined(__linux__) #error "You are not using a cross-compiler, you will most certainly run into trouble" #endif /* This tutorial will only work for the 32-bit ix86 targets. */ #if !defined(__i386__) #error "This kernel needs to be compiled with a ix86-elf compiler" #endif #include #include #include #include "terminal.c" #include "memory.c" #include "interrupts.c" #include "shell.c" #include "util/printer.c" static inline bool are_interrupts_enabled() { unsigned long flags; asm volatile ( "pushf\n\t" "pop %0" : "=g"(flags)); return flags & (1 << 9); } void kernel_main(void) { /* Initialize terminal interface */ terminal_initialize(); terminal_putchar('H'); terminal_putchar('e'); terminal_putchar('l'); terminal_putchar('l'); terminal_putchar('o'); terminal_setcolor(vga_entry_color(VGA_COLOR_GREEN, VGA_COLOR_BLACK)); print(" kernel"); terminal_setcolor(vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK)); print(" World!\n"); print("Newlines!\n"); char *memory_str = alloc(sizeof(char) * 7); for (int i = 0; i < 6; i++) { memory_str[i] = "Memory"[i]; } memory_str[6] = 0; char *management_str = alloc(sizeof(char) * 13); for (int i = 0; i < 13; i++) { management_str[i] = " management!\n"[i]; } management_str[13] = 0; print(memory_str); print(management_str); free(memory_str); free(management_str); // Some dummy allocations to demonstrate the states of memory and to showcase the memory dump printout. void* ptr = alloc(30); alloc(30); alloc(31); free(ptr); void* ptr2 = alloc(64); alloc(61); free(ptr2); print((are_interrupts_enabled()) ? "Interrupts!\n" : "No interrupts :(\n"); interrupt_init(); print_memory(); for (;;) { shell_step(); } }