This commit is contained in:
2026-06-13 13:27:39 -05:00
parent 00fb70c25b
commit 3ecbcdf369
13 changed files with 106 additions and 14 deletions

View File

@@ -21,8 +21,6 @@ stack_top:
.type _start, @function
_start:
mov $stack_top, %esp
call kernel_main
cli
1: hlt
call kmain
1:
jmp 1b

6
kernel/common_stubs.S Normal file
View File

@@ -0,0 +1,6 @@
.code32
.global enable_interrupts
enable_interrupts:
sti
ret

0
kernel/drivers/pic/pic.c Normal file
View File

7
kernel/drivers/pic/pic.h Normal file
View File

@@ -0,0 +1,7 @@
#define PIC1_ADDR 0x20
#define PIC2_ADDR 0xA0
#define PIC1_COMMAND PIC1_ADDR
#define PIC1_DATA (PIC1_ADDR+1)
#define PIC2_COMMAND PIC2_ADDR
#define PIC2_DATA (PIC2_ADDR+1)
#define PIC_EOI 0x20

View File

@@ -0,0 +1,51 @@
#include "drivers/pic/pic.h"
.code32
.global init_pic
init_pic:
# init command
mov $0x11, %al
outb %al, $PIC1_COMMAND
outb %al, $PIC2_COMMAND
# vector offsets
mov $0x20, %al
outb %al, $PIC1_DATA
mov $0x28, %al
outb %al, $PIC2_DATA
# cascade
mov $0x04, %al
outb %al, $PIC1_DATA
mov $0x02, %al
outb %al, $PIC2_DATA
# env
mov $0x01, %al
outb %al, $PIC1_DATA
outb %al, $PIC2_DATA
# mask all
mov $0xFC, %al
outb %al, $PIC1_DATA
mov $0xFF, %al
outb %al, $PIC2_DATA
ret
.global io_wait
io_wait:
ret
.global send_eoi_master
send_eoi_master:
mov $0x20, %al
outb %al, $PIC1_COMMAND
ret
.global send_eoi_slave
send_eoi_slave:
mov $0x20, %al
outb %al, $PIC2_COMMAND
call send_eoi_master
ret

0
kernel/drivers/pit/pit.h Normal file
View File

View File

@@ -0,0 +1,16 @@
#include "drivers/pit/pit.h"
.code32
.global init_pit
init_pit: # tickrate: 1193182/1000 = 0x04A9 (1000hz) (1ms)
movb $0x36, %al
outb %al, $0x43
movb $0xA9, %al
outb %al, $0x40
movb $0x04, %al
outb %al, $0x40
ret

View File

@@ -1,7 +1,8 @@
#include "lib/print.h"
#include <stdint.h>
extern void master_eoi(void);
extern void send_eoi_master(void);
extern void send_eoi_slave(void);
struct registers {
uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax;
@@ -32,12 +33,12 @@ void common_interrupt_handler(struct registers *regs) {
kprint("\n");
break;
case 32:
// wake the PIC timer driver
master_eoi();
// wake the PIT timer driver
send_eoi_master();
break;
case 33:
// wake the keyboard driver
master_eoi();
kprint("keypress detected\n");
send_eoi_master();
break;
default:
kprint("Received unhandled interrupt\n");

View File

@@ -7,8 +7,11 @@
extern void init_idt();
extern void init_gdt();
extern void init_pic();
extern void init_pit();
extern void enable_interrupts();
void kernel_main(void)
void kmain(void)
{
extern print_stream_t vga_print_stream;
extern print_stream_t* kout;
@@ -22,4 +25,15 @@ void kernel_main(void)
init_idt();
kprint("IDT set\n");
init_pic();
kprint("PIC initialized\n");
init_pit();
kprint("PIT initialized\n");
enable_interrupts();
kprint("Interrupts enabled\n");
while(1);
}

View File

@@ -4,10 +4,10 @@ LD = i686-elf-ld
OSNAME := rockos
C_SOURCES := $(shell find kernel -type f -name '*.c')
S_SOURCES := $(shell find kernel -type f -name '*.s')
S_SOURCES := $(shell find kernel -type f -name '*.S')
# This correctly generates paths like obj/kernel/main.o
OBJECTS := $(patsubst %.c, obj/%.o, $(C_SOURCES)) $(patsubst %.s, obj/%.o, $(S_SOURCES))
OBJECTS := $(patsubst %.c, obj/%.o, $(C_SOURCES)) $(patsubst %.S, obj/%.o, $(S_SOURCES))
CFLAGS := -ffreestanding -O2 -Wall -Wextra -Ikernel
LDFLAGS := -T kernel/linker.ld
@@ -25,12 +25,11 @@ $(OSNAME).iso: $(OSNAME).bin grub.cfg
cp grub.cfg isodir/boot/grub/grub.cfg
grub-mkrescue -o $(OSNAME).iso isodir
# FIX: Pattern rules now explicitly expect the 'kernel' directory layout
obj/kernel/%.o: kernel/%.c
@mkdir -p $(dir $@)
$(CC) -c $< -o $@ $(CFLAGS)
obj/kernel/%.o: kernel/%.s
obj/kernel/%.o: kernel/%.S
@mkdir -p $(dir $@)
$(CC) -c $< -o $@ $(CFLAGS)