tabs/kernel/kernel.c

75 lines
2.1 KiB
C
Raw Permalink Normal View History

2019-12-28 13:47:10 +01:00
/* 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__)
2020-01-08 22:36:49 +01:00
#error "This kernel needs to be compiled with a ix86-elf compiler"
2019-12-28 13:47:10 +01:00
#endif
2019-12-30 14:45:55 +01:00
2020-01-08 22:36:49 +01:00
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "terminal.c"
#include "memory.c"
#include "interrupts.c"
#include "shell.c"
2020-01-08 22:36:49 +01:00
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)
2019-12-28 13:47:10 +01:00
{
terminal_state state;
terminal_initialize_state(&state);
2019-12-30 16:02:43 +01:00
terminal_set_color(&state, VGA_COLOR_BLACK, VGA_COLOR_RED);
terminal_write_char(&state, 'H');
terminal_set_color(&state, VGA_COLOR_BLACK, VGA_COLOR_GREEN);
terminal_write_char(&state, 'e');
terminal_set_color(&state, VGA_COLOR_BLACK, VGA_COLOR_BLUE);
terminal_write_char(&state, 'l');
terminal_set_color(&state, VGA_COLOR_BLACK, VGA_COLOR_MAGENTA);
terminal_write_char(&state, 'l');
terminal_set_color(&state, VGA_COLOR_BLACK, VGA_COLOR_WHITE);
terminal_write_char(&state, 'o');
terminal_set_color(&state, VGA_COLOR_GREEN, VGA_COLOR_WHITE);
terminal_write_str(&state," kernel");
terminal_set_color(&state, VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
terminal_write_str(&state," World!\n");
terminal_write_str(&state,"Newlines!\n");
2020-01-07 14:53:27 +01:00
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);
2020-01-08 22:36:49 +01:00
for (int i = 0; i < 13; i++) {
management_str[i] = " management!\n"[i];
2020-01-07 14:53:27 +01:00
}
2020-01-08 22:36:49 +01:00
management_str[13] = 0;
2020-01-07 14:53:27 +01:00
/* terminal_write_str(&state,memory_str); */
/* terminal_write_str(&state,management_str); */
2020-01-08 22:36:49 +01:00
terminal_write_str(&state, (are_interrupts_enabled())? "Interrupts!\n": "No interrupts :(\n");
2020-01-08 22:36:49 +01:00
shell_set_terminal_state(&state);
exception_set_terminal_state(&state);
2020-01-08 22:36:49 +01:00
interrupt_init();
2020-01-09 12:06:45 +01:00
for(;;) {
shell_step();
2020-01-09 12:06:45 +01:00
}
}