Add: basic scheduler

This commit is contained in:
brice.boisson 2023-10-01 00:40:00 +09:00
parent 917988e871
commit 3a3795d524
6 changed files with 60 additions and 25 deletions

View File

@ -4,6 +4,7 @@
#include "pic_controler.h" #include "pic_controler.h"
#include "debug.h" #include "debug.h"
#include "syscall.h" #include "syscall.h"
#include "userland.h"
void isr_default_int(void) void isr_default_int(void)
{ {
@ -17,7 +18,15 @@ void isr_page_fault(void)
void isr_clock_int(void) void isr_clock_int(void)
{ {
DEBUG_INFO("Enterring clock interrupt handler."); DEBUG_INFO("Clock interrupt handler.");
for (int i = (userland_data->curent_process + 1) % 128; i != userland_data->curent_process; i = (i + 1) % 128)
{
if (userland_data->active_process[i / 32] & (1 << (i % 32)))
{
switch_to_process(i);
return;
}
}
} }
void isr_kbd_int(void) void isr_kbd_int(void)

View File

@ -22,8 +22,12 @@ void main(void)
char *data_end = _binary_a_out_end; char *data_end = _binary_a_out_end;
size_t data_size = (size_t)_binary_a_out_size; size_t data_size = (size_t)_binary_a_out_size;
u16 tss = 0x28;
create_process(0, data_start); create_process(0, data_start);
switch_to_process(0); create_process(1, data_start);
userland_data->active_process[0] |= 1 << (1 % 32);
switch_to_ring_3(0);
for (;;) for (;;)
{ {

View File

@ -2,13 +2,14 @@
#include "tss.h" #include "tss.h"
#include "debug.h" #include "debug.h"
#include "userland.h"
void launch_process(u16 tss, int memory_start, int userland_stack, int userland_code, u16 userland_data) void launch_process(u16 tss, int memory_start, int userland_stack, int userland_code, u16 userland_data_seg)
{ {
// Setting DPL and GDT bits // Setting DPL and GDT bits
userland_stack += 3; userland_stack += 3;
userland_code += 3; userland_code += 3;
userland_data += 3; userland_data_seg += 3;
DEBUG_INFO("LAUCHING USER LAND PROCESS"); DEBUG_INFO("LAUCHING USER LAND PROCESS");

View File

@ -101,6 +101,8 @@ void pic_init(void)
IRQ_set_mask(i); IRQ_set_mask(i);
} }
DEBUG_INFO("Unmasking IRQ 0 - Clock");
IRQ_clear_mask(0);
DEBUG_INFO("Unmasking IRQ 1 - Keyboard"); DEBUG_INFO("Unmasking IRQ 1 - Keyboard");
IRQ_clear_mask(1); IRQ_clear_mask(1);

View File

@ -30,6 +30,21 @@ int create_process(int uid, char *data_start)
return 0; return 0;
} }
int switch_to_ring_3(int uid){
DEBUG_INFO("SWITCHING TO RING 3");
void *process_page_dir_adress = userland_data->userland_data[uid].page_directories;
// load cr3
asm volatile (" \
mov %0, %%eax \n \
mov %%eax, %%cr3" : "+r" (process_page_dir_adress));
userland_data->curent_process = uid;
userland_data->active_process[uid / 32] |= 1 << (uid % 32);
launch_process(0x28, 0x6000000, 0x20, 0x18, 0x20);
}
int switch_to_process(int uid) int switch_to_process(int uid)
{ {
DEBUG_INFO("SWITCHING TO PROCESS"); DEBUG_INFO("SWITCHING TO PROCESS");
@ -40,6 +55,8 @@ int switch_to_process(int uid)
mov %0, %%eax \n \ mov %0, %%eax \n \
mov %%eax, %%cr3" : "+r" (process_page_dir_adress)); mov %%eax, %%cr3" : "+r" (process_page_dir_adress));
// TODO : once data by process has been implemented, load the right one userland_data->curent_process = uid;
launch_process(0x28, 0x6000000, 0x20, 0x18, 0x20); userland_data->active_process[uid / 32] |= 1 << (uid % 32);
return 0;
} }

View File

@ -10,17 +10,19 @@ struct userland_data
{ {
struct page_directory_entry page_directories[1024]; struct page_directory_entry page_directories[1024];
struct page_table_entry page_table[1024]; struct page_table_entry page_table[1024];
}; } __attribute__((packed));
struct userlands_data { struct userlands_data {
struct userland_data userland_data[128]; struct userland_data userland_data[128];
u32 page_dir[4]; int curent_process;
}; u32 active_process[4];
} __attribute__((packed));
extern struct userlands_data *userland_data; extern struct userlands_data *userland_data;
int create_process(int uid, char *data_start); int create_process(int uid, char *data_start);
int switch_to_ring_3(int uid);
int switch_to_process(int uid); int switch_to_process(int uid);
#endif /* !USERLAND_H */ #endif /* !USERLAND_H */