From 84ae1aa6e5dffa012a69b774082f61c533e02bb5 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Sun, 26 Nov 2023 21:49:21 +0100 Subject: [PATCH] limine module loading as user tasks! --- run.sh | 2 +- src/CMakeLists.txt | 3 +++ src/arch/x86/CMakeLists.txt | 3 ++- src/arch/x86/boot.cpp | 2 ++ src/arch/x86/kmain.cpp | 14 ++++++++++- src/arch/x86/limine_modules.cpp | 29 +++++++++++++++++++++++ src/arch/x86/limine_modules.hpp | 21 ++++++++++++++++ src/arch/x86/task.cpp | 22 +++++++++-------- src/arch/x86/task.hpp | 3 ++- src/iso/CMakeLists.txt | 4 +++- src/iso/limine.cfg | 5 +++- src/kernel/CMakeLists.txt | 2 +- src/test/CMakeLists.txt | 9 +++++++ src/test/hello.cpp | 10 ++++++++ src/test/linker.ld | 27 +++++++++++++++++++++ src/uapi/CMakeLists.txt | 4 ++++ src/{kernel => uapi}/syscalls_defs.h | 0 src/{kernel => uapi}/syscalls_interface.c | 0 src/{kernel => uapi}/syscalls_interface.h | 0 19 files changed, 143 insertions(+), 17 deletions(-) create mode 100644 src/arch/x86/limine_modules.cpp create mode 100644 src/arch/x86/limine_modules.hpp create mode 100644 src/test/CMakeLists.txt create mode 100644 src/test/hello.cpp create mode 100644 src/test/linker.ld create mode 100644 src/uapi/CMakeLists.txt rename src/{kernel => uapi}/syscalls_defs.h (100%) rename src/{kernel => uapi}/syscalls_interface.c (100%) rename src/{kernel => uapi}/syscalls_interface.h (100%) diff --git a/run.sh b/run.sh index d1fc1b31b..18c2ebeb3 100755 --- a/run.sh +++ b/run.sh @@ -69,5 +69,5 @@ fi cmake --build cmake-build-$MODE --target iso -qemu-system-x86_64 -s $QEMU_OPTS -cdrom cmake-build-relwithdebinfo/src/iso/os2.iso +qemu-system-x86_64 -s $QEMU_OPTS -cdrom cmake-build-$MODE/src/iso/os2.iso diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fa8daf024..f1b812b8c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,5 +6,8 @@ target_compile_options(kernel.elf PUBLIC $<$:-fstack-protect add_subdirectory(./arch/) add_subdirectory(./kernel/) +add_subdirectory(./uapi/) + +add_subdirectory(./test/) add_subdirectory(./iso/) diff --git a/src/arch/x86/CMakeLists.txt b/src/arch/x86/CMakeLists.txt index 0edbbea27..e78c29582 100644 --- a/src/arch/x86/CMakeLists.txt +++ b/src/arch/x86/CMakeLists.txt @@ -23,7 +23,8 @@ target_sources(kernel.elf PRIVATE gdt.cpp misc.cpp syscalls.cpp - syscalls.asm) + syscalls.asm + limine_modules.cpp) target_include_directories(kernel.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/arch/x86/boot.cpp b/src/arch/x86/boot.cpp index f5c9a2eb0..3cca024ce 100644 --- a/src/arch/x86/boot.cpp +++ b/src/arch/x86/boot.cpp @@ -10,6 +10,7 @@ #include "limine.h" #include "limine_fb.hpp" #include "limine_mm.hpp" +#include "limine_modules.hpp" #include "memman.hpp" #include "misc.hpp" #include "paging.hpp" @@ -44,6 +45,7 @@ extern "C" void _start(void) { init_serial(); barrier(); limine_kern_save_response(); + limine_modules_save(); barrier(); map_hddm(get_cr3()); barrier(); diff --git a/src/arch/x86/kmain.cpp b/src/arch/x86/kmain.cpp index ed32b441a..e69934624 100644 --- a/src/arch/x86/kmain.cpp +++ b/src/arch/x86/kmain.cpp @@ -7,10 +7,12 @@ #include "SkipList.hpp" #include "String.hpp" #include "TestTemplates.hpp" +#include "VMA.hpp" #include "asserts.hpp" #include "globals.hpp" #include "kmem.hpp" #include "limine_fb.hpp" +#include "limine_modules.hpp" #include "memman.hpp" #include "misc.hpp" #include "mutex.hpp" @@ -213,7 +215,17 @@ void ktask_main() { new_ktask(templates_tester, "templates_tester2"); new_ktask(stress_tester, "stress_tester"); - new_utask(user_task, "user"); + for (int i = 0; i < saved_modules_size; i++) { + all_tty_putstr("Starting "); + all_tty_putstr(saved_modules_names[i]); + all_tty_putchar('\n'); + + Task *utask = new_utask((void (*)()) 0x00020000, saved_modules_names[i]); + assert(saved_modules_size > 0); + utask->vma->mmap_phys((void *) 0x00020000, (void *) KERN_V2P(saved_modules_data[i]), + max_saved_module_file_size, PAGE_USER | PAGE_RW); + start_utask(utask); + } remove_self(); } diff --git a/src/arch/x86/limine_modules.cpp b/src/arch/x86/limine_modules.cpp new file mode 100644 index 000000000..8cfa2879c --- /dev/null +++ b/src/arch/x86/limine_modules.cpp @@ -0,0 +1,29 @@ +// +// Created by Stepan Usatiuk on 26.11.2023. +// + +#include "limine_modules.hpp" + +#include "asserts.hpp" +#include "string.h" + +static volatile struct limine_module_request module_request = { + .id = LIMINE_MODULE_REQUEST, + .revision = 0}; + + +limine_file saved_modules[max_saved_modules]; +char saved_modules_data[max_saved_modules][max_saved_module_file_size] __attribute__((aligned(4096))); +char saved_modules_names[max_saved_modules][max_saved_module_name] __attribute__((aligned(4096))); +unsigned saved_modules_size = 0; + +void limine_modules_save() { + for (int i = 0; i < module_request.response->module_count; i++) { + assert(i < max_saved_modules); + saved_modules_size++; + saved_modules[i] = (*module_request.response->modules)[i]; + assert(saved_modules[i].size < max_saved_module_file_size); + memcpy(saved_modules_data[i], saved_modules[i].address, saved_modules[i].size); + memcpy(saved_modules_names[i], saved_modules[i].path, max_saved_module_name); + } +} \ No newline at end of file diff --git a/src/arch/x86/limine_modules.hpp b/src/arch/x86/limine_modules.hpp new file mode 100644 index 000000000..a40f87f7f --- /dev/null +++ b/src/arch/x86/limine_modules.hpp @@ -0,0 +1,21 @@ +// +// Created by Stepan Usatiuk on 26.11.2023. +// + +#ifndef OS2_LIMINE_MODULES_HPP +#define OS2_LIMINE_MODULES_HPP + +#include "limine.hpp" + +void limine_modules_save(); + +static constexpr unsigned max_saved_modules = 2; +static constexpr unsigned max_saved_module_file_size = 1024 * 1024; +static constexpr unsigned max_saved_module_name = 256; + +extern unsigned saved_modules_size; +extern limine_file saved_modules[max_saved_modules]; +extern char saved_modules_data[max_saved_modules][max_saved_module_file_size] __attribute__((aligned(4096))); +extern char saved_modules_names[max_saved_modules][max_saved_module_name] __attribute__((aligned(4096))); + +#endif//OS2_LIMINE_MODULES_HPP diff --git a/src/arch/x86/task.cpp b/src/arch/x86/task.cpp index d49ad6bd6..d70c47afa 100644 --- a/src/arch/x86/task.cpp +++ b/src/arch/x86/task.cpp @@ -130,14 +130,14 @@ struct Task *new_ktask(void (*fn)(), const char *name) { } return newt; } -struct Task *new_utask(void (*fn)(), const char *name) { +struct Task *new_utask(void (*entrypoint)(), const char *name) { Task *newt = static_cast(kmalloc(sizeof(struct Task))); newt->kstack = static_cast(kmalloc(TASK_SS)); newt->name = static_cast(kmalloc(strlen(name) + 1)); newt->fxsave = static_cast(kmalloc(512)); strcpy(name, newt->name); - newt->frame.ip = (uint64_t) fn; + newt->frame.ip = (uint64_t) entrypoint; newt->frame.cs = GDTSEL(gdt_code_user) | 0x3; newt->frame.ss = GDTSEL(gdt_data_user) | 0x3; @@ -147,7 +147,7 @@ struct Task *new_utask(void (*fn)(), const char *name) { newt->frame.guard = IDT_GUARD; newt->addressSpace = new AddressSpace(); newt->vma = new VMA(newt->addressSpace); - newt->state = TS_RUNNING; + newt->state = TS_BLOCKED; newt->mode = TASKMODE_USER; newt->pid = max_pid.fetch_add(1); newt->used_time = 0; @@ -175,13 +175,6 @@ struct Task *new_utask(void (*fn)(), const char *name) { sanity_check_frame(&newt->frame); - auto new_node = NextTasks.create_node(newt); - - { - LockGuard l(NextTasks_lock); - NextTasks.emplace_front(new_node); - } - { LockGuard l(AllTasks_lock); AllTasks.add(newt->pid, newt); @@ -189,6 +182,15 @@ struct Task *new_utask(void (*fn)(), const char *name) { return newt; } +void start_utask(struct Task *task) { + task->state = TS_RUNNING; + auto new_node = NextTasks.create_node(task); + { + LockGuard l(NextTasks_lock); + NextTasks.emplace_front(new_node); + } +} + void remove_self() { { diff --git a/src/arch/x86/task.hpp b/src/arch/x86/task.hpp index 798e2dee5..5687a0e84 100644 --- a/src/arch/x86/task.hpp +++ b/src/arch/x86/task.hpp @@ -53,7 +53,8 @@ List::Node *extract_running_task_node(); void init_tasks(); struct Task *new_ktask(void (*fn)(), const char *name); -struct Task *new_utask(void (*fn)(), const char *name); +struct Task *new_utask(void (*entrypoint)(), const char *name); +void start_utask(struct Task *task); void remove_self(); void sleep_self(uint64_t diff); diff --git a/src/iso/CMakeLists.txt b/src/iso/CMakeLists.txt index 9e76a245f..e4e6c06ef 100644 --- a/src/iso/CMakeLists.txt +++ b/src/iso/CMakeLists.txt @@ -4,10 +4,12 @@ add_custom_target(iso COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/isodir/ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/limine.cfg ${CMAKE_CURRENT_BINARY_DIR}/isodir/ COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_CURRENT_BINARY_DIR}/isodir/os2.elf + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_CURRENT_BINARY_DIR}/isodir/hello COMMAND xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label ${CMAKE_CURRENT_BINARY_DIR}/isodir -o ${CMAKE_CURRENT_BINARY_DIR}/os2.iso - COMMAND ${tools}/limine/prefix/bin/limine bios-install ${CMAKE_CURRENT_BINARY_DIR}/os2.iso + COMMAND ${tools}/limine/prefix/bin/limine bios-install ${CMAKE_CURRENT_BINARY_DIR}/os2.iso VERBATIM DEPENDS kernel.elf + DEPENDS hello DEPENDS iso_limine ) diff --git a/src/iso/limine.cfg b/src/iso/limine.cfg index 1e3441a5d..3b5f8684f 100644 --- a/src/iso/limine.cfg +++ b/src/iso/limine.cfg @@ -8,6 +8,8 @@ TIMEOUT=1 # Path to the kernel to boot. boot:/// represents the partition on which limine.cfg is located. KERNEL_PATH=boot:///os2.elf + + MODULE_PATH=boot:///hello # Same thing, but without KASLR. :os2 (KASLR off) @@ -16,4 +18,5 @@ TIMEOUT=1 # Disable KASLR (it is enabled by default for relocatable kernels) KASLR=no - KERNEL_PATH=boot:///os2.elf \ No newline at end of file + KERNEL_PATH=boot:///os2.elf + MODULE_PATH=boot:///hello diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 13dd2fa36..0f647bbd3 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -1,5 +1,5 @@ target_include_directories(kernel.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_sources(kernel.elf PRIVATE mutex.cpp cppsupport.cpp Spinlock.cpp LockGuard.cpp rand.cpp VMA.cpp asserts.cpp syscalls_interface.c) +target_sources(kernel.elf PRIVATE mutex.cpp cppsupport.cpp Spinlock.cpp LockGuard.cpp rand.cpp VMA.cpp asserts.cpp) add_subdirectory(templates) \ No newline at end of file diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt new file mode 100644 index 000000000..7b57683a4 --- /dev/null +++ b/src/test/CMakeLists.txt @@ -0,0 +1,9 @@ +add_executable(hello hello.cpp) + +target_link_libraries(hello syscalls_interface) + +target_include_directories(hello PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_options(hello PRIVATE "SHELL:-T${CMAKE_CURRENT_SOURCE_DIR}/linker.ld") +set_target_properties(hello PROPERTIES LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld") + diff --git a/src/test/hello.cpp b/src/test/hello.cpp new file mode 100644 index 000000000..a7fed78b1 --- /dev/null +++ b/src/test/hello.cpp @@ -0,0 +1,10 @@ +#include "syscalls_interface.h" + +void _start() { + while (true) { + putchar('h'); + putchar('i'); + putchar('\n'); + sleep(100000); + } +} \ No newline at end of file diff --git a/src/test/linker.ld b/src/test/linker.ld new file mode 100644 index 000000000..428f7df7c --- /dev/null +++ b/src/test/linker.ld @@ -0,0 +1,27 @@ +OUTPUT_FORMAT("binary") +OUTPUT_ARCH(i386:x86-64) + +ENTRY(start) +phys = 0x00020000; +SECTIONS +{ + .text phys : AT(phys) { + code = .; + *(.text) + *(.rodata) + . = ALIGN(4096); + } + .data : AT(phys + (data - code)) + { + data = .; + *(.data) + . = ALIGN(4096); + } + .bss : AT(phys + (bss - code)) + { + bss = .; + *(.bss) + . = ALIGN(4096); + } + end = .; +} \ No newline at end of file diff --git a/src/uapi/CMakeLists.txt b/src/uapi/CMakeLists.txt new file mode 100644 index 000000000..ce2c42aec --- /dev/null +++ b/src/uapi/CMakeLists.txt @@ -0,0 +1,4 @@ +add_library(syscalls_interface syscalls_interface.c) +target_include_directories(syscalls_interface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(kernel.elf syscalls_interface) \ No newline at end of file diff --git a/src/kernel/syscalls_defs.h b/src/uapi/syscalls_defs.h similarity index 100% rename from src/kernel/syscalls_defs.h rename to src/uapi/syscalls_defs.h diff --git a/src/kernel/syscalls_interface.c b/src/uapi/syscalls_interface.c similarity index 100% rename from src/kernel/syscalls_interface.c rename to src/uapi/syscalls_interface.c diff --git a/src/kernel/syscalls_interface.h b/src/uapi/syscalls_interface.h similarity index 100% rename from src/kernel/syscalls_interface.h rename to src/uapi/syscalls_interface.h