Using smaller divisor now, for faster multitasking
This commit is contained in:
parent
a1abe56104
commit
09fa845774
|
|
@ -119,6 +119,26 @@ void kernel_panic(char *message, cpu_registers_t *regs){
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
void pit_reload(uint8_t mode, uint16_t reload){
|
||||||
|
const uint16_t PIT_CMD = 0x43;
|
||||||
|
const uint16_t PIT_DATA = 0x40;
|
||||||
|
outb(PIT_CMD, 0b00110000 + mode); //channel 0, low/high byte, rate generator mode
|
||||||
|
|
||||||
|
outb(PIT_DATA, reload >> 8);
|
||||||
|
outb(PIT_DATA, reload & 0xff);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void pit_init(uint32_t freq){
|
||||||
|
uint32_t reload_value = 0x10000;
|
||||||
|
if(freq <= 18){
|
||||||
|
pit_reload(0b100, reload_value);
|
||||||
|
}
|
||||||
|
if(freq >= 1193181){
|
||||||
|
pit_reload(0b100, reload_value >> 16);
|
||||||
|
}
|
||||||
|
reload_value = ((3579545 * 256)/(3 * 256))/(freq);
|
||||||
|
pit_reload(0b100, reload_value);
|
||||||
|
}
|
||||||
|
|
||||||
void idt_load(){
|
void idt_load(){
|
||||||
// for(uint32_t i = 0; i < 32; i++){
|
// for(uint32_t i = 0; i < 32; i++){
|
||||||
|
|
@ -169,6 +189,8 @@ void idt_load(){
|
||||||
for(int i = 0; i < 16; i++){
|
for(int i = 0; i < 16; i++){
|
||||||
interrupt_handlers[i] = 0;
|
interrupt_handlers[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pit_init(1193181);
|
||||||
// asm volatile("lidt (%0)" : : "m"(&idt_desc));
|
// asm volatile("lidt (%0)" : : "m"(&idt_desc));
|
||||||
// outb(0x20, 0x11 );
|
// outb(0x20, 0x11 );
|
||||||
// outb(0xa0, 0x11);
|
// outb(0xa0, 0x11);
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,6 @@ extern void kmain(kernel_info_t *kernel_info){
|
||||||
|
|
||||||
fcreate("/dev", VFILE_DIRECTORY, kmalloc(1), 1);
|
fcreate("/dev", VFILE_DIRECTORY, kmalloc(1), 1);
|
||||||
fcreate("/tmp", VFILE_DIRECTORY, kmalloc(1), 1);
|
fcreate("/tmp", VFILE_DIRECTORY, kmalloc(1), 1);
|
||||||
vfile_t *file = fopen("/dev");
|
|
||||||
printf("%x", file);
|
|
||||||
mlog("KERNEL", "Initializing Scheduler & starting PID 1\n", MLOG_PRINT);
|
mlog("KERNEL", "Initializing Scheduler & starting PID 1\n", MLOG_PRINT);
|
||||||
boot_info = kernel_info;
|
boot_info = kernel_info;
|
||||||
scheduler_init();
|
scheduler_init();
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ void scheduler_init(){
|
||||||
install_irq_handler(schedule, 0);
|
install_irq_handler(schedule, 0);
|
||||||
// printf("Installing scheduler");
|
// printf("Installing scheduler");
|
||||||
}
|
}
|
||||||
|
uint32_t timer = 0;
|
||||||
cpu_registers_t *schedule(cpu_registers_t *regs){
|
cpu_registers_t *schedule(cpu_registers_t *regs){
|
||||||
// if(queue_length == 0){
|
// if(queue_length == 0){
|
||||||
// return regs;
|
// return regs;
|
||||||
|
|
|
||||||
|
|
@ -174,9 +174,9 @@ vfile_t *fopen(char *name){
|
||||||
if(name[strlen(name) - 1] == '/'){
|
if(name[strlen(name) - 1] == '/'){
|
||||||
name[strlen(name) - 1] = 0;
|
name[strlen(name) - 1] = 0;
|
||||||
}
|
}
|
||||||
printf("%s\n", name);
|
// printf("%s\n", name);
|
||||||
char *dir = strtok(name, '/');
|
char *dir = strtok(name, '/');
|
||||||
printf("%s", name);
|
// printf("%s", name);
|
||||||
char *tmp = dir;
|
char *tmp = dir;
|
||||||
uint32_t filename_offset = 0;
|
uint32_t filename_offset = 0;
|
||||||
vfile_t *current_dir = &root_dir;
|
vfile_t *current_dir = &root_dir;
|
||||||
|
|
@ -185,12 +185,12 @@ vfile_t *fopen(char *name){
|
||||||
dir = tmp;
|
dir = tmp;
|
||||||
tmpfile = search_dir(tmp, *current_dir);
|
tmpfile = search_dir(tmp, *current_dir);
|
||||||
if(!tmpfile){
|
if(!tmpfile){
|
||||||
printf("not found\n");
|
// printf("not found\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
switch(tmpfile->type){
|
switch(tmpfile->type){
|
||||||
case VFILE_DIRECTORY:
|
case VFILE_DIRECTORY:
|
||||||
printf("found directory in %s: %s\n", current_dir->name, tmpfile->name);
|
// printf("found directory in %s: %s\n", current_dir->name, tmpfile->name);
|
||||||
current_dir = tmpfile;
|
current_dir = tmpfile;
|
||||||
break;
|
break;
|
||||||
case VFILE_MOUNT:
|
case VFILE_MOUNT:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue