Add preemptive multitasking

This commit is contained in:
pjht 2020-07-30 21:58:23 -05:00
parent 0522941a1d
commit c0929a4eea
7 changed files with 69 additions and 10 deletions

View File

@ -1,6 +1,7 @@
PLAT=i386
C_SOURCES = $(wildcard kernel/*.c kernel/cpu/$(PLAT)/*.c kernel/cpu/*.c)
C_HEADERS = $(wildcard kernel/*.h kernel/cpu/$(PLAT)/*.h kernel/cpu/*.h)
TIMER_TYPE=$(shell cat psinfo/$(PLAT)/timer_type.txt)
C_SOURCES = $(wildcard kernel/*.c kernel/cpu/$(PLAT)/*.c kernel/cpu/*.c kernel/timer/$(TIMER_TYPE)/*.c)
C_HEADERS = $(wildcard kernel/*.h kernel/cpu/$(PLAT)/*.h kernel/cpu/*.h kernel/timer/$(TIMER_TYPE)/*.h)
ASM = $(wildcard kernel/cpu/$(PLAT)/*.asm)
S_ASM = $(wildcard kernel/cpu/$(PLAT)/*.s)
LIBC_SOURCES = $(wildcard libc/*.c libc/*/*.c)

View File

@ -294,7 +294,7 @@ void irq_handler(registers_t* r) {
port_byte_out(0x20,0x20); /* master */
/* Handle the interrupt in a more modular way */
if (irq_handlers[r->int_no-32] != NULL) {
isr_t handler = irq_handlers[r->int_no];
isr_t handler = irq_handlers[r->int_no-32];
handler(r);
}
}

View File

@ -11,6 +11,7 @@
#include <stdlib.h>
#include <string.h>
#include <tasking.h>
#include "timer/timer.h"
/**
* REspresents a TAR file header
@ -66,6 +67,7 @@ void kmain(struct multiboot_boot_header_tag* hdr) {
asm volatile("sti");
tasking_init();
vga_init((char*)0xC00B8000);
timer_init(1000);
read_initrd(tags);
int pos=0;
size_t datapos;
@ -115,13 +117,14 @@ void kmain(struct multiboot_boot_header_tag* hdr) {
copy_data(address_space,ptr,pheader.memsz,(void*)pheader.vaddr);
}
create_proc((void*)header.entry,address_space,NULL,NULL);
for (int i=0;i<4;i++) {
yield();
}
unblock_thread(1,0);
for (int i=0;i<4;i++) {
yield();
}
// for (int i=0;i<4;i++) {
// yield();
// }
// unblock_thread(1,0);
// for (int i=0;i<4;i++) {
// yield();
// }
// for (;;);
exit(0);
}
}

26
kernel/timer/pit/timer.c Normal file
View File

@ -0,0 +1,26 @@
#include "../../cpu/isr.h"
#include "../../tasking.h"
#include "../../cpu/serial.h"
#include <cpu/ports.h>
void timer_handler(registers_t* r);
void timer_init(int freq) {
int div=1193180/freq;
if (div>65535) {
serial_printf("Frequency of %dHz too slow, min freq is 18 Hz\n");
div=65535;
freq=18;
if (div==0) {
serial_printf("Frequency of %dHz too slow, max freq is 1193180 Hz\n");
div=1;
freq=1193180;
}
} else {
serial_printf("Setting PIT to %dHz using divisor of %d\n",freq,div);
}
isr_register_handler(0,timer_handler);
port_byte_out(0x43,(div>>8)&0xFF);
port_byte_out(0x40,div&0xFF);
port_byte_out(0x40,0x2E);
}

14
kernel/timer/timer.h Normal file
View File

@ -0,0 +1,14 @@
/**
* \file
*/
#ifndef TIMER_H
#define TIMER_H
/**
* Initialize the timer
* \param freq The freqency to set the timer to
*/
void timer_init(int freq);
#endif

14
kernel/timer_handler.c Normal file
View File

@ -0,0 +1,14 @@
/**
* \file
*/
#include "tasking.h"
#include "cpu/isr.h"
/**
* Interrupt handler for the timer interrupt
* \param r The saved state of the CPU when the interrupt occured
*/
void timer_handler(registers_t* r) {
tasking_yield();
}

View File

@ -0,0 +1 @@
pit