feature (proc): processes have now an executable and a own page_map

This commit is contained in:
antifallobst 2023-03-04 17:46:21 +01:00
parent e0494263da
commit 664bb8eaee
6 changed files with 74 additions and 49 deletions

View File

@ -26,6 +26,8 @@
#include "utils/stdtypes.h" #include "utils/stdtypes.h"
#include "utils/string.h" #include "utils/string.h"
#include "mm/page_map.h"
#include "drivers/elf/elf.h"
typedef uint32_t pid_t; typedef uint32_t pid_t;
@ -41,6 +43,9 @@ struct process_T{
void* chunk; void* chunk;
uint32_t chunk_id; uint32_t chunk_id;
page_map_T* page_map;
elf_executable_T* executable;
uint32_t num_threads; uint32_t num_threads;
void* threads; void* threads;
@ -50,7 +55,8 @@ struct process_T{
process_T* next; process_T* next;
}; };
pid_t process_spawn (pid_t parent, string_t name); void process_kernel_spawn (elf_executable_T* executable);
pid_t process_spawn (pid_t parent, string_t name, elf_executable_T* executable, void* buffer);
void process_kill_pid (pid_t pid); void process_kill_pid (pid_t pid);
void process_kill (process_T* process); void process_kill (process_T* process);

View File

@ -27,6 +27,7 @@
#include "proc/thread.h" #include "proc/thread.h"
#include "proc/process.h" #include "proc/process.h"
#include "utils/bitmap.h" #include "utils/bitmap.h"
#include "boot/boot_info.h"
#define SCHEDULER_PROCESS_CHUNK_SIZE 64 #define SCHEDULER_PROCESS_CHUNK_SIZE 64
@ -51,7 +52,7 @@ typedef struct {
bool initialized; bool initialized;
} scheduler_T; } scheduler_T;
void scheduler_init (); void scheduler_init (boot_info_T* boot_info);
cpu_state_T* scheduler_start (cpu_state_T* state); cpu_state_T* scheduler_start (cpu_state_T* state);
bool scheduler_is_initialized (); bool scheduler_is_initialized ();
void scheduler_dump_info (process_T* process, uint8_t indent); void scheduler_dump_info (process_T* process, uint8_t indent);

View File

@ -33,8 +33,6 @@
#include "drivers/fs/vfs.h" #include "drivers/fs/vfs.h"
#include "proc/scheduler.h" #include "proc/scheduler.h"
#include "drivers/elf/elf.h"
void limine_terminal_print(boot_info_T* boot_info, string_t string) { void limine_terminal_print(boot_info_T* boot_info, string_t string) {
boot_info->terminal->write(boot_info->terminal->terminals[0], string, string_length(string)); boot_info->terminal->write(boot_info->terminal->terminals[0], string, string_length(string));
} }
@ -74,27 +72,13 @@ void kernel_init(boot_info_T* boot_info) {
limine_terminal_print(boot_info, " ok\n"); limine_terminal_print(boot_info, " ok\n");
limine_terminal_print(boot_info, " Initializing scheduler..."); limine_terminal_print(boot_info, " Initializing scheduler...");
scheduler_init(); scheduler_init(boot_info);
limine_terminal_print(boot_info, " ok\n"); limine_terminal_print(boot_info, " ok\n");
} }
#include "utils/io.h" void test() {
while(1) {
void test1() { int x = 0 / 0;
while (true) {
io_out_byte(LOG_PORT, 'A');
}
}
void test2() {
while (true) {
io_out_byte(LOG_PORT, 'B');
}
}
void test3() {
while (true) {
io_out_byte(LOG_PORT, 'C');
} }
} }
@ -108,20 +92,23 @@ void kmain(boot_info_T boot_info) {
limine_terminal_print(&boot_info, "Kernel initialized\n"); limine_terminal_print(&boot_info, "Kernel initialized\n");
log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n"); log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n");
elf_init_kernel_exec(&boot_info);
pid_t proc1 = process_spawn(PROCESS_KERNEL, "test_1"); // pid_t proc1 = process_spawn(PROCESS_KERNEL, "test_1");
//
// pid_t proc1_1 = process_spawn(proc1, "test_1-1");
// thread_spawn(proc1_1, NULL);
// pid_t proc1_2 = process_spawn(proc1, "test_1-2");
//
// pid_t proc2 = process_spawn(PROCESS_KERNEL, "test_2");
pid_t proc1_1 = process_spawn(proc1, "test_1-1"); thread_T* thread = thread_spawn(PROCESS_KERNEL, test);
thread_spawn(proc1_1, NULL);
pid_t proc1_2 = process_spawn(proc1, "test_1-2");
pid_t proc2 = process_spawn(PROCESS_KERNEL, "test_2"); scheduler_start_thread(thread);
scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0); scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0);
process_kill_pid(proc1); // process_kill_pid(proc1);
scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0); // scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0);
// vfs_node_T* node = vfs_resolve_path(&g_root_fs, "/initrd/test.elf"); // vfs_node_T* node = vfs_resolve_path(&g_root_fs, "/initrd/test.elf");
// //

View File

@ -26,14 +26,34 @@
#include "utils/memory.h" #include "utils/memory.h"
#include "utils/math.h" #include "utils/math.h"
pid_t process_spawn(pid_t parent, string_t name) { void process_kernel_spawn(elf_executable_T* executable) {
process_T* process = memory_allocate(sizeof(process_T));
process->num_threads = 0;
process->threads = NULL;
process->parent = NULL;
process->executable = executable;
memory_copy("kernel", process->name, 7);
process->page_map = g_kernel_page_map;
// the processes' id, chunk_id and chunk fields will be set by the scheduler
scheduler_register_process(process);
}
pid_t process_spawn(pid_t parent, string_t name, elf_executable_T* executable, void* buffer) {
process_T* process = memory_allocate(sizeof(process_T)); process_T* process = memory_allocate(sizeof(process_T));
process->num_threads = 0; process->num_threads = 0;
process->threads = NULL; process->threads = NULL;
process->parent = scheduler_get_process(parent); process->parent = scheduler_get_process(parent);
process->executable = executable;
memory_copy(name, process->name, MIN(string_length(name), 127)); memory_copy(name, process->name, MIN(string_length(name), 127));
process->page_map = page_map_create();
elf_mappings_apply(executable->mappings, executable->num_mappings, buffer, 0, process->page_map);
// the processes' id, chunk_id and chunk fields will be set by the scheduler // the processes' id, chunk_id and chunk fields will be set by the scheduler
return scheduler_register_process(process); return scheduler_register_process(process);
@ -46,5 +66,7 @@ void process_kill_pid(pid_t pid) {
void process_kill(process_T* process) { void process_kill(process_T* process) {
scheduler_kill_process(process); scheduler_kill_process(process);
page_map_destruct(process->page_map);
memory_free(process); memory_free(process);
} }

View File

@ -66,7 +66,7 @@ scheduler_processes_chunk_T* scheduler_processes_chunk_create(scheduler_processe
return chunk; return chunk;
} }
void scheduler_init() { void scheduler_init(boot_info_T* boot_info) {
g_scheduler.num_threads = 0; g_scheduler.num_threads = 0;
g_scheduler.num_processes = 0; g_scheduler.num_processes = 0;
g_scheduler.running_thread = NULL; g_scheduler.running_thread = NULL;
@ -76,13 +76,13 @@ void scheduler_init() {
g_scheduler_info_buffer = graphics_buffer_request(graphics_renderer_get_width()-100, 0, 100, 200, GRAPHICS_BUFFER_STANDARD); g_scheduler_info_buffer = graphics_buffer_request(graphics_renderer_get_width()-100, 0, 100, 200, GRAPHICS_BUFFER_STANDARD);
process_kernel_spawn(elf_executable_create(boot_info->kernel_file->address));
syscall_perform(SYSCALL_KERNEL_SCHEDULER_START); syscall_perform(SYSCALL_KERNEL_SCHEDULER_START);
} }
cpu_state_T* scheduler_start(cpu_state_T* state) { cpu_state_T* scheduler_start(cpu_state_T* state) {
process_spawn(PROCESS_NONE, "kernel");
thread_T* thread = thread_spawn_from_state(PROCESS_KERNEL, state); thread_T* thread = thread_spawn_from_state(PROCESS_KERNEL, state);
thread->global_prev = thread; thread->global_prev = thread;
thread->global_next = thread; thread->global_next = thread;
@ -292,11 +292,20 @@ process_T* scheduler_get_process(pid_t pid) {
} }
thread_T* scheduler_get_current_thread() { thread_T* scheduler_get_current_thread() {
if (!g_scheduler.initialized) {
return NULL;
}
return g_scheduler.running_thread; return g_scheduler.running_thread;
} }
process_T* scheduler_get_current_process() { process_T* scheduler_get_current_process() {
return g_scheduler.running_thread->process; thread_T* thread = scheduler_get_current_thread();
if (thread == NULL) {
return NULL;
}
return thread->process;
} }
cpu_state_T* scheduler_switch_context(cpu_state_T* state) { cpu_state_T* scheduler_switch_context(cpu_state_T* state) {

View File

@ -43,7 +43,7 @@ thread_T* thread_spawn(pid_t process, void* function) {
thread->cpu_time = 0; thread->cpu_time = 0;
thread->state = (cpu_state_T){ thread->state = (cpu_state_T){
.cr3 = (uint64_t)g_kernel_page_map, .cr3 = (uint64_t)thread->process->page_map,
.rax = 0, .rax = 0,
.rbx = 0, .rbx = 0,
.rcx = 0, .rcx = 0,