From df90bd7313a7ff8e59082ff18d87b84e18333c0a Mon Sep 17 00:00:00 2001 From: Nathan Giddings Date: Thu, 9 Nov 2023 23:00:12 -0600 Subject: [PATCH] process struct now uses address_space struct --- include/addressspace.h | 6 +++--- include/kernel.h | 3 ++- include/process.h | 7 +++---- src/Makefile.am | 2 +- src/addressspace.c | 4 ++-- src/kernel.c | 22 +++++++++++----------- src/process.c | 13 ++++++++++--- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/include/addressspace.h b/include/addressspace.h index 6672556..1df81bc 100644 --- a/include/addressspace.h +++ b/include/addressspace.h @@ -3,13 +3,13 @@ #include "types/physaddr.h" -typedef struct addressspace_t +typedef struct address_space_t { physaddr_t page_table; int refcount; -} addressspace_t; +} address_space_t; -addressspace_t *addressspace_construct(); +address_space_t *address_space_construct(); diff --git a/include/kernel.h b/include/kernel.h index 9d766ed..544941d 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -5,6 +5,7 @@ #include "queue.h" #include "mmgr.h" #include "syscalls.h" +#include "addressspace.h" #include "types/syscallid.h" #include "types/status.h" #include "types/pid.h" @@ -65,7 +66,7 @@ struct process_context_t *kernel_current_context(); error_t kernel_store_active_context(struct process_context_t *context); -pid_t kernel_spawn_process(void *program_entry, int priority, physaddr_t address_space); +pid_t kernel_spawn_process(void *program_entry, int priority, address_space_t *address_space); struct process_context_t *kernel_advance_scheduler(); diff --git a/include/process.h b/include/process.h index 162506c..ef4dee1 100644 --- a/include/process.h +++ b/include/process.h @@ -5,6 +5,7 @@ #include "types/physaddr.h" #include "types/status.h" #include "queue.h" +#include "addressspace.h" typedef enum process_state_t { @@ -17,7 +18,7 @@ typedef struct process_t { pid_t pid; int priority; - physaddr_t page_table; + address_space_t *address_space; struct avltree_t *shared_objects; process_state_t state; struct queue_t sending_queue; @@ -26,8 +27,6 @@ typedef struct process_t struct process_context_t *ctx; } process_t; -process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, physaddr_t address_space); - -error_t process_call_func(process_t *process, void *func, void *ret, int argc, ...); +process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, address_space_t *address_space); #endif \ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index 158b76d..63da452 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ bin_PROGRAMS = quark-kernel -quark_kernel_SOURCES = kernel.c mmgr.c priorityqueue.c stdio.c string.c elf.c syscalls.c heap.c avltree.c queue.c math.c process.c sharedobject.c +quark_kernel_SOURCES = kernel.c mmgr.c priorityqueue.c stdio.c string.c elf.c syscalls.c heap.c avltree.c queue.c math.c process.c sharedobject.c addressspace.c quark_kernel_LDADD = -lgcc -lmalloc quark_kernel_CFLAGS = -I$(top_srcdir)/include -I$(prefix)/include -ffreestanding -mgeneral-regs-only -O0 -Wall -ggdb quark_kernel_LDFLAGS = -L$(prefix)/lib -nostdlib diff --git a/src/addressspace.c b/src/addressspace.c index 07c731c..eaf6db8 100644 --- a/src/addressspace.c +++ b/src/addressspace.c @@ -2,9 +2,9 @@ #include "heap.h" #include "mmgr.h" -addressspace_t *addressspace_construct() +address_space_t *address_space_construct() { - addressspace_t *as = kmalloc(sizeof(addressspace_t)); + address_space_t *as = kmalloc(sizeof(address_space_t)); if(as == NULL) { return NULL; diff --git a/src/kernel.c b/src/kernel.c index 7b5c317..9649e7d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -212,11 +212,11 @@ size_t kernel_do_syscall(syscall_id_t id, syscall_arg_t arg1, syscall_arg_t arg2 error_t kernel_load_module(struct module_t *module) { - physaddr_t module_address_space = create_address_space(); - if(module_address_space == ENOMEM) { + address_space_t *module_address_space = address_space_construct(); + if(module_address_space == NULL) { kernel_panic("failed to create address space for module: out of memory"); } - paging_load_address_space(module_address_space); + paging_load_address_space(module_address_space->page_table); void *const load_base = (void*)0x80000000; physaddr_t p = module->start & ~(page_size - 1); map_region(load_base, p, module->end - p, PAGE_RW); @@ -243,7 +243,7 @@ error_t kernel_load_module(struct module_t *module) } load_offset += page_size; } - if(kernel_spawn_process(module_entry, 1, current_address_space()) > 0) + if(kernel_spawn_process(module_entry, 1, module_address_space) > 0) { return ENONE; } @@ -277,7 +277,7 @@ struct process_context_t *kernel_current_context() } } -pid_t kernel_spawn_process(void *program_entry, int priority, physaddr_t address_space) +pid_t kernel_spawn_process(void *program_entry, int priority, address_space_t *address_space) { physaddr_t stack_page = reserve_page(); if(stack_page % page_size) @@ -308,8 +308,8 @@ struct process_context_t *kernel_advance_scheduler() kernel.active_process = priorityqueue_extract_min(&kernel.priority_queue); if(kernel.active_process != NULL) { - paging_load_address_space(kernel.active_process->page_table); - printf("entering process %08x cr3=%08x ctx=%08x sched=%i.\n", kernel.active_process->pid, kernel.active_process->page_table, kernel.active_process->ctx, kernel.priority_queue.size); + paging_load_address_space(kernel.active_process->address_space->page_table); + printf("entering process %08x cr3=%08x ctx=%08x sched=%i.\n", kernel.active_process->pid, kernel.active_process->address_space->page_table, kernel.active_process->ctx, kernel.priority_queue.size); return kernel.active_process->ctx; } kernel_panic("no processes available to enter!"); @@ -413,9 +413,9 @@ error_t kernel_send_message(unsigned long recipient, struct message_t *message) struct message_t kernel_buffer; memcpy(&kernel_buffer, message, sizeof(struct message_t)); kernel_buffer.sender = kernel.active_process->pid; - paging_load_address_space(dest->page_table); + paging_load_address_space(dest->address_space->page_table); memcpy(dest->message_buffer, &kernel_buffer, sizeof(struct message_t)); - paging_load_address_space(kernel.active_process->page_table); + paging_load_address_space(kernel.active_process->address_space->page_table); dest->message_buffer = NULL; dest->state = PROCESS_ACTIVE; set_context_return(dest->ctx, ENONE); @@ -512,7 +512,7 @@ error_t kernel_execute_interrupt_handler(unsigned long interrupt) return EDOESNTEXIST; } - paging_load_address_space(process->page_table); + paging_load_address_space(process->address_space->page_table); struct signal_context_t siginfo = { .signal_id = interrupt @@ -527,7 +527,7 @@ error_t kernel_execute_interrupt_handler(unsigned long interrupt) priorityqueue_insert(&kernel.priority_queue, process, process->priority); } - paging_load_address_space(kernel.active_process->page_table); + paging_load_address_space(kernel.active_process->address_space->page_table); return ENONE; } diff --git a/src/process.c b/src/process.c index bcb8bdc..07964a4 100644 --- a/src/process.c +++ b/src/process.c @@ -3,7 +3,7 @@ #include "platform/context.h" #include "string.h" -process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, physaddr_t address_space) +process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, address_space_t *address_space) { process_t *new_process = (process_t*) kmalloc(sizeof(process_t)); if(new_process == NULL) @@ -14,7 +14,13 @@ process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, struct process_context_t *initial_context = kmalloc(sizeof(struct process_context_t)); if(initial_context == NULL) { - return 0; + return NULL; + } + + if(address_space == NULL + && (address_space = address_space_construct()) == NULL) + { + return NULL; } context_construct(initial_context); @@ -22,7 +28,8 @@ process_t *process_construct(pid_t pid, void *entry, void *stack, int priority, set_context_stack(initial_context, stack); new_process->priority = priority; new_process->pid = pid; - new_process->page_table = address_space; + new_process->address_space = address_space; + new_process->address_space->refcount++; new_process->state = PROCESS_ACTIVE; new_process->message_buffer = NULL; new_process->ctx = initial_context;