...
This commit is contained in:
30
makefile
30
makefile
@@ -4,6 +4,13 @@ LD = x86_64-elf-ld
|
|||||||
CFLAGS = -m64 -ffreestanding -fno-builtin -Wall -Wextra -Wshadow -std=c23
|
CFLAGS = -m64 -ffreestanding -fno-builtin -Wall -Wextra -Wshadow -std=c23
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
|
|
||||||
|
SRC_C := src/kernel.c src/vga.c src/idt.c src/string.c
|
||||||
|
SRC_ASM := src/boot.asm src/idt_stub.asm
|
||||||
|
|
||||||
|
OBJ_C := $(SRC_C:src/%.c=.build/%.o)
|
||||||
|
OBJ_ASM := $(SRC_ASM:src/%.asm=.build/%.o)
|
||||||
|
OBJS := $(OBJ_C) $(OBJ_ASM)
|
||||||
|
|
||||||
all: .build/nub-os.iso
|
all: .build/nub-os.iso
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@@ -12,26 +19,17 @@ clean:
|
|||||||
build-dir:
|
build-dir:
|
||||||
mkdir .build 2>/dev/null || true
|
mkdir .build 2>/dev/null || true
|
||||||
|
|
||||||
.build/nub-os.iso: build-dir .build/kernel
|
.build/nub-os.iso: .build/kernel
|
||||||
mkdir -p .build/iso/boot/grub
|
mkdir -p .build/iso/boot/grub
|
||||||
cp grub.cfg .build/iso/boot/grub
|
cp grub.cfg .build/iso/boot/grub
|
||||||
cp .build/kernel .build/iso/boot/
|
cp .build/kernel .build/iso/boot/
|
||||||
grub-mkrescue -o .build/nub-os.iso .build/iso/
|
grub-mkrescue -o .build/nub-os.iso .build/iso/
|
||||||
|
|
||||||
.build/kernel: build-dir .build/boot.o .build/kernel.o .build/vga.o .build/idt.o .build/idt_stub.o
|
.build/kernel: $(OBJS)
|
||||||
$(LD) $(LDFLAGS) -T src/boot.ld -o .build/kernel .build/boot.o .build/kernel.o .build/vga.o .build/idt.o .build/idt_stub.o
|
$(LD) $(LDFLAGS) -T src/boot.ld -o $@ $^
|
||||||
|
|
||||||
.build/kernel.o: build-dir src/kernel.c
|
.build/%.o: src/%.c | build-dir
|
||||||
$(CC) $(CFLAGS) -c -o .build/kernel.o src/kernel.c
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
.build/vga.o: build-dir src/vga.c
|
.build/%.o: src/%.asm | build-dir
|
||||||
$(CC) $(CFLAGS) -c -o .build/vga.o src/vga.c
|
nasm -f elf64 -o $@ $<
|
||||||
|
|
||||||
.build/idt.o: build-dir src/idt.c
|
|
||||||
$(CC) $(CFLAGS) -c -o .build/idt.o src/idt.c
|
|
||||||
|
|
||||||
.build/idt_stub.o: build-dir src/idt_stub.asm
|
|
||||||
nasm -f elf64 -o .build/idt_stub.o src/idt_stub.asm
|
|
||||||
|
|
||||||
.build/boot.o: build-dir src/boot.asm
|
|
||||||
nasm -f elf64 -o .build/boot.o src/boot.asm
|
|
||||||
@@ -52,10 +52,10 @@ void idt_set_descriptor(uint8_t vector, void* handler, uint8_t dpl)
|
|||||||
void exception_handler(isr_frame_t* frame)
|
void exception_handler(isr_frame_t* frame)
|
||||||
{
|
{
|
||||||
vga_print("Interrupt\n");
|
vga_print("Interrupt\n");
|
||||||
vga_print(" int_no:");
|
vga_print(" int_no: ");
|
||||||
vga_print_uint(frame->int_no);
|
vga_print_uint(frame->int_no);
|
||||||
vga_print("\n");
|
vga_print("\n");
|
||||||
vga_print(" err_code:");
|
vga_print(" err_code: ");
|
||||||
vga_print_uint(frame->err_code);
|
vga_print_uint(frame->err_code);
|
||||||
vga_print("\n");
|
vga_print("\n");
|
||||||
__asm__ volatile("cli; hlt");
|
__asm__ volatile("cli; hlt");
|
||||||
@@ -71,5 +71,4 @@ void idt_init(void)
|
|||||||
idtr_t idtr = { .base = (uintptr_t)&idt[0], .limit = (uint16_t)sizeof(interrupt_descriptor) * IDT_SIZE - 1 };
|
idtr_t idtr = { .base = (uintptr_t)&idt[0], .limit = (uint16_t)sizeof(interrupt_descriptor) * IDT_SIZE - 1 };
|
||||||
|
|
||||||
__asm__ volatile("lidt %0" : : "m"(idtr));
|
__asm__ volatile("lidt %0" : : "m"(idtr));
|
||||||
__asm__ volatile("sti");
|
|
||||||
}
|
}
|
||||||
10
src/kernel.c
10
src/kernel.c
@@ -4,11 +4,15 @@
|
|||||||
void kernel_main(void)
|
void kernel_main(void)
|
||||||
{
|
{
|
||||||
vga_clear();
|
vga_clear();
|
||||||
|
vga_print_success();
|
||||||
|
vga_print(" VGA intialzied\n");
|
||||||
|
|
||||||
idt_init();
|
idt_init();
|
||||||
vga_print_success("IDT intialzied\n");
|
vga_print_success();
|
||||||
|
vga_print(" IDT intialzied\n");
|
||||||
|
|
||||||
vga_print("Welcome to nub OS\n");
|
vga_print("\nWelcome to nub OS\n");
|
||||||
|
vga_print(">");
|
||||||
|
|
||||||
int i = 2 / 0;
|
int x = 1 / 0;
|
||||||
}
|
}
|
||||||
77
src/string.c
77
src/string.c
@@ -1,4 +1,5 @@
|
|||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
int strcmp(const char* a, const char* b)
|
int strcmp(const char* a, const char* b)
|
||||||
{
|
{
|
||||||
@@ -10,3 +11,79 @@ int strcmp(const char* a, const char* b)
|
|||||||
|
|
||||||
return (*a == *b) ? 0 : (*a > *b) ? 1 : -1;
|
return (*a == *b) ? 0 : (*a > *b) ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reverse(char* str, size_t length)
|
||||||
|
{
|
||||||
|
int start = 0;
|
||||||
|
int end = length - 1;
|
||||||
|
while (start < end)
|
||||||
|
{
|
||||||
|
char temp = str[start];
|
||||||
|
str[start] = str[end];
|
||||||
|
str[end] = temp;
|
||||||
|
start++;
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int uitoa(uint64_t value, char* buffer)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
if (value == 0)
|
||||||
|
{
|
||||||
|
buffer[i++] = '0';
|
||||||
|
buffer[i] = '\0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (value > 0)
|
||||||
|
{
|
||||||
|
buffer[i++] = (value % 10) + '0';
|
||||||
|
value /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[i] = '\0';
|
||||||
|
reverse(buffer, i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int itoa(int64_t value, char* buffer)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (value == 0)
|
||||||
|
{
|
||||||
|
buffer[i++] = '0';
|
||||||
|
buffer[i] = '\0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool negative = false;
|
||||||
|
uint64_t v;
|
||||||
|
|
||||||
|
if (value < 0)
|
||||||
|
{
|
||||||
|
negative = true;
|
||||||
|
v = (uint64_t)(-value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
v = (uint64_t)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (v > 0)
|
||||||
|
{
|
||||||
|
buffer[i++] = (v % 10) + '0';
|
||||||
|
v /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negative)
|
||||||
|
{
|
||||||
|
buffer[i++] = '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[i] = '\0';
|
||||||
|
reverse(buffer, i);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
int strcmp(const char* a, const char* b);
|
int strcmp(const char* a, const char* b);
|
||||||
|
void reverse(char* str, size_t length);
|
||||||
|
int uitoa(uint64_t value, char* buffer);
|
||||||
|
int itoa(int64_t value, char* buffer);
|
||||||
66
src/vga.c
66
src/vga.c
@@ -1,4 +1,8 @@
|
|||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#define ROWS 25
|
#define ROWS 25
|
||||||
#define COLUMNS 80
|
#define COLUMNS 80
|
||||||
@@ -110,78 +114,30 @@ void vga_print(const char* string)
|
|||||||
vga_print_colored(string, vga_default_color());
|
vga_print_colored(string, vga_default_color());
|
||||||
}
|
}
|
||||||
|
|
||||||
void vga_print_success(const char* message)
|
void vga_print_success(void)
|
||||||
{
|
{
|
||||||
vga_print("[ ");
|
vga_print("[ ");
|
||||||
vga_print_colored("success", VGA_GREEN);
|
vga_print_colored("success", VGA_GREEN);
|
||||||
vga_print(" ] ");
|
vga_print(" ]");
|
||||||
vga_print(message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vga_print_error(const char* message)
|
void vga_print_error(void)
|
||||||
{
|
{
|
||||||
vga_print("[ ");
|
vga_print("[ ");
|
||||||
vga_print_colored("error", VGA_RED);
|
vga_print_colored("error", VGA_RED);
|
||||||
vga_print(" ] ");
|
vga_print(" ]");
|
||||||
vga_print(message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reverse(char* str, int length)
|
void vga_print_uint(uint64_t value)
|
||||||
{
|
|
||||||
int start = 0;
|
|
||||||
int end = length - 1;
|
|
||||||
while (start < end)
|
|
||||||
{
|
|
||||||
char temp = str[start];
|
|
||||||
str[start] = str[end];
|
|
||||||
str[end] = temp;
|
|
||||||
start++;
|
|
||||||
end--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uitoa(unsigned int value, char* buffer)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
if (value == 0)
|
|
||||||
{
|
|
||||||
buffer[i++] = '0';
|
|
||||||
buffer[i] = '\0';
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (value > 0)
|
|
||||||
{
|
|
||||||
buffer[i++] = (value % 10) + '0';
|
|
||||||
value /= 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer[i] = '\0';
|
|
||||||
reverse(buffer, i);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vga_print_uint(unsigned int value)
|
|
||||||
{
|
{
|
||||||
char buffer[11];
|
char buffer[11];
|
||||||
uitoa(value, buffer);
|
uitoa(value, buffer);
|
||||||
vga_print(buffer);
|
vga_print(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vga_print_int(int value)
|
void vga_print_int(int64_t value)
|
||||||
{
|
{
|
||||||
char buffer[12];
|
char buffer[12];
|
||||||
|
itoa(value, buffer);
|
||||||
if (value < 0)
|
|
||||||
{
|
|
||||||
vga_print("-");
|
|
||||||
unsigned int abs_val = (unsigned int)(-value);
|
|
||||||
uitoa(abs_val, buffer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uitoa((unsigned int)value, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
vga_print(buffer);
|
vga_print(buffer);
|
||||||
}
|
}
|
||||||
@@ -27,11 +27,11 @@ void vga_set_cursor_position(uint8_t row, uint8_t col);
|
|||||||
void vga_print_colored(const char* string, vga_color_t color);
|
void vga_print_colored(const char* string, vga_color_t color);
|
||||||
void vga_print(const char* string);
|
void vga_print(const char* string);
|
||||||
|
|
||||||
void vga_print_success(const char* message);
|
void vga_print_success(void);
|
||||||
void vga_print_error(const char* message);
|
void vga_print_error(void);
|
||||||
|
|
||||||
void vga_print_uint(unsigned int value);
|
void vga_print_uint(uint64_t value);
|
||||||
void vga_print_int(int value);
|
void vga_print_int(int64_t value);
|
||||||
|
|
||||||
static inline vga_color_t vga_color(vga_color_t fg_color, vga_color_t bg_color)
|
static inline vga_color_t vga_color(vga_color_t fg_color, vga_color_t bg_color)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user