Scheduling + setting up files

This commit is contained in:
notsomeidiot123 2024-11-12 14:30:31 -05:00
parent 8ae88cf3e7
commit 0e2cfab914
15 changed files with 184 additions and 15 deletions

View File

@ -352,3 +352,19 @@ _irq_common_stub:
popad popad
add esp, 8 add esp, 8
iret iret
global panic_hold
panic_hold:
push ebp
mov ebp, esp
mov esp, [ebp + 8]
pop gs
pop fs
pop es
pop ds
popad
jmp $

View File

@ -41,17 +41,16 @@ void _irq_handler(cpu_registers_t *regs){
} }
else if(interrupt_handlers[regs->int_no - 32]) else if(interrupt_handlers[regs->int_no - 32])
{ {
if(regs->int_no == 32){ // printf("found one for an int");
// printf("Tick\n");
// printf("%x\n", regs->int_no);
}
regs = interrupt_handlers[regs->int_no - 32](regs); regs = interrupt_handlers[regs->int_no - 32](regs);
// printf("returned;")
// printf("eip: %x", regs->eip); // printf("eip: %x", regs->eip);
outb(0x20, 0x20);
if(regs->int_no >= 0x28){
outb(0xa0, 0x20);
}
} }
outb(0x20, 0x20);
if(regs->int_no >= 0x28){
outb(0xa0, 0x20);
}
return;
} }
void _isr_handler(cpu_registers_t *regs){ void _isr_handler(cpu_registers_t *regs){
printf("Error!! %x\n", regs->eip); printf("Error!! %x\n", regs->eip);
@ -62,6 +61,16 @@ cpu_registers_t *syscall(cpu_registers_t *regs){
} }
extern void panic_hold(cpu_registers_t *regs);
void kernel_panic(char *message, cpu_registers_t *regs){
printf("Kernel Panic!\nAn fatal error occured, and could not be recovered.\nError: ");
printf(message);
printf("System halting...\n");
if(regs != 0) panic_hold(regs);
asm volatile ("jmp .");
}
void install_irq_handler(void (*handler)(), uint8_t irqno){ void install_irq_handler(void (*handler)(), uint8_t irqno){
interrupt_handlers[irqno] = handler; interrupt_handlers[irqno] = handler;
} }
@ -74,7 +83,7 @@ void init_idt(){
// printf("last ") // printf("last ")
for(uint32_t i = 0; i < 16; i++){ for(uint32_t i = 0; i < 16; i++){
set_idt_entry(i + 32, (_irq0 + ((_irq1 - _irq0) * i)), IDT_GATE_INT, 0x10); set_idt_entry(i + 32, (_irq0 + ((_irq1 - _irq0) * i)), IDT_GATE_INT, 0x10);
printf("int %d: address: %x\n", i + 32, _irq0 + (_irq1 - _irq0) * i); // printf("int %d: address: %x\n", i + 32, _irq0 + (_irq1 - _irq0) * i);
} }
idt_desc.pointer = (uint32_t)&idt_table; idt_desc.pointer = (uint32_t)&idt_table;

View File

@ -4,11 +4,11 @@
#define mmap_count 0x20000 #define mmap_count 0x20000
uint8_t pm_map[mmap_count]; uint8_t volatile pm_map[mmap_count];
uint32_t total_memory = 0; uint32_t total_memory = 0;
uint32_t total_memory_usable = 0; uint32_t total_memory_usable = 0;
uint32_t last_allocated = 0; uint32_t volatile last_allocated = 0;
extern uint32_t _start; extern uint32_t _start;
uint32_t pm_alloc(){ uint32_t pm_alloc(){

View File

@ -4,6 +4,7 @@
#include "shared/interrupts.h" #include "shared/interrupts.h"
#include "drivers/serial.h" #include "drivers/serial.h"
#include "drivers/pic.h" #include "drivers/pic.h"
#include "system/scheduler.h"
extern void kmain(kernel_info_t *kernel_info){ extern void kmain(kernel_info_t *kernel_info){
init_serial(); init_serial();
@ -11,9 +12,10 @@ extern void kmain(kernel_info_t *kernel_info){
init_idt(); init_idt();
init_pic(32); init_pic(32);
pic_disable(); pic_disable();
init_scheduler();
pic_setmask(0xfe, PIC1_DATA); pic_setmask(0xfe, PIC1_DATA);
enable_interrupts(); enable_interrupts();
printf("done\n"); // printf("done\n");
for(;;); for(;;);
return; return;
} }

View File

@ -29,4 +29,5 @@ inline void enable_interrupts(){
inline void disable_interrupts(){ inline void disable_interrupts(){
asm volatile("cli"); asm volatile("cli");
} }
void kernel_panic(char *msg, cpu_registers_t *regs);
void install_irq_handler(void (*handler)(), uint8_t irqno); void install_irq_handler(void (*handler)(), uint8_t irqno);

View File

@ -1,6 +1,8 @@
#pragma once #pragma once
// #include "memory.h" // #include "memory.h"
#include "../drivers/serial.h" #include "../drivers/serial.h"
#include "interrupts.h"
typedef struct kernel_info{ typedef struct kernel_info{
void *mmap_ptr; void *mmap_ptr;
uint16_t mmap_entry_count; uint16_t mmap_entry_count;
@ -12,3 +14,5 @@ typedef struct kernel_info{
void *loaded_modues; void *loaded_modues;
uint32_t loaded_module_count; uint32_t loaded_module_count;
}__attribute__((packed)) kernel_info_t; }__attribute__((packed)) kernel_info_t;
#define PANIC(m) kernel_panic(m, 0)

View File

@ -67,5 +67,12 @@ uint32_t get_paddr(void *addr);
uint32_t pm_alloc(); uint32_t pm_alloc();
void pm_reserve(uint32_t addr); void pm_reserve(uint32_t addr);
void pm_free(uint32_t addr); void pm_free(uint32_t addr);
inline void set_cr3(void *cr3){
asm volatile("mov %0, %%eax; mov %%eax, %%cr3":: "r"(cr3));
}
inline void *get_cr3(){
void *cr3;
asm volatile("mov %%cr3, %%eax;mov %0, %%eax": "=r"(cr3));
return cr3;
}
int pm_init(kernel_info_t *kernel_info); int pm_init(kernel_info_t *kernel_info);

View File

View File

@ -0,0 +1,33 @@
#include<stdint.h>
typedef struct{
uint32_t devid;
enum DeviceType{
NULL_TYPE,
DEV_TYPE_DISK,
DEV_TYPE_AUDIO,
DEV_TYPE_KBD,
DEV_TYPE_MOUSE,
DEV_TYPE_VIDEO,
DEV_TYPE_OTHER,
DEV_TYPE_NAT,
}device_type;
uint32_t driver_pid;
}device_t;
typedef struct{
uint64_t start_sector; //Register or sector (depending on command and or device type)
uint64_t total_sectors;//hard disks only
volatile void *buffer;
uint32_t buffer_size;//size of each object in buffer
uint32_t buffer_count;//Number of objects of size buffer_size in buffer
enum DeviceCommand{
NULLOP,
DEVICE_READ,
DEVICE_WRITE,
DEVICE_INIT,
DEVICE_COMMAND,
DEVICE_SET_MMAP,
DEVICE_SET_DMA,
}command;
uint32_t requesting_pid;
}device_packet_t;

0
src/kernel/system/ipc.c Normal file
View File

0
src/kernel/system/ipc.h Normal file
View File

View File

@ -0,0 +1,2 @@
#include "modules.h"

View File

@ -0,0 +1,2 @@
#pragma once
#include <stdint.h>

View File

@ -0,0 +1,69 @@
#include "../shared/interrupts.h"
#include "scheduler.h"
#include "../shared/kstdlib.h"
process_t volatile processes[0x10000];
uint32_t volatile process_queue[0x10000];
uint32_t volatile current_pid;
void init_scheduler(){
for(uint32_t i = 0; i < 0x10000; i++){
processes[i].flags.present = 0;
process_queue[i] = 0;
}
current_pid = 0;
install_irq_handler(schedule, 0);
printf("Installing scheduler");
}
cpu_registers_t *schedule(cpu_registers_t *regs){
uint32_t i = current_pid;
// printf("Test");
while(processes[process_queue[i]].flags.blocked){
i++;
if(i == current_pid) return regs;
if(i >= 0x10000) i = 0;
}
current_pid = i;
return &(processes[i].cpuregs);
// return regs;
}
void spawn_new_process(cpu_registers_t defaultregs, char **argv, uint32_t argc, void *cr3){
uint32_t i = current_pid;
while(processes[i].flags.present){
i++;
if(i >= 0x10000) i = 0;
if(i == current_pid) return;
}
process_t new_proc = {0};
new_proc.argc = argc;
new_proc.argv = argv;
new_proc.page_dir = cr3;
new_proc.cpuregs = defaultregs;
new_proc.parent = current_pid;
new_proc.flags.present = 1;
new_proc.flags.cpu_lvl = 1;
new_proc.flags.priority = 0;
new_proc.flags.system = processes[current_pid].flags.system;
return;
}
void fork(){
}
void exec(){
}
void exit(){
}
void thread_start(void (*function)(), uint32_t *exit_code){
}
void thread_join(uint32_t thread_id, uint32_t **exit_code){
}
void thread_exit(uint32_t *exit_code){
}

View File

@ -0,0 +1,24 @@
#pragma once
#include <stdint.h>
#include "../shared/interrupts.h"
typedef struct{
char **argv;
uint32_t argc;
cpu_registers_t cpuregs;
void *page_dir;
struct pflags{
uint8_t blocked :1;
uint8_t system :1;
uint8_t cpu_lvl :1;
uint8_t priority:3;
uint8_t present :1;
uint8_t unused :1;
}flags;
uint32_t thread_id;
uint32_t parent;
uint32_t uid;
uint32_t gid;
}process_t;
cpu_registers_t* schedule(cpu_registers_t *regs);
void init_scheduler();