mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-14 06:56:51 -04:00
Allocate kernel user stacks in kernel memory space
This commit is contained in:
parent
5f88766c83
commit
9b9d6bea2d
@ -44,14 +44,11 @@ struct process_t {
|
||||
|
||||
constexpr const size_t program_base = 0x8000000000;
|
||||
|
||||
constexpr const auto user_stack_start = program_base + 0x700000;
|
||||
constexpr const auto kernel_stack_start = program_base + 0x800000;
|
||||
|
||||
constexpr const auto user_stack_size = 2 * paging::PAGE_SIZE;
|
||||
constexpr const auto kernel_stack_size = 2 * paging::PAGE_SIZE;
|
||||
|
||||
constexpr const auto user_stack_start = program_base + 0x700000;
|
||||
constexpr const auto user_rsp = user_stack_start + (user_stack_size - 8);
|
||||
constexpr const auto kernel_rsp = kernel_stack_start + (user_stack_size - 8);
|
||||
|
||||
} //end of namespace scheduler
|
||||
|
||||
|
@ -58,7 +58,6 @@ void switch_to_process(size_t index){
|
||||
|
||||
k_printf("Switched to %u\n", index);
|
||||
|
||||
//TODO Move that to scheduler
|
||||
auto& process = processes[current_index];
|
||||
|
||||
gdt::tss.rsp0_low = process.kernel_rsp & 0xFFFFFFFF;
|
||||
@ -71,11 +70,10 @@ void switch_to_process(size_t index){
|
||||
|
||||
asm volatile("mov cr3, %0" : : "r" (process.physical_cr3) : "memory");
|
||||
|
||||
//TODO Check if user_rsp is correctly passed
|
||||
asm volatile("xor rax, rax; mov ax, %0; push rax; mov rax, %1; push rax; pushfq; xor rax, rax; mov ax, %2; push rax; mov rax, %3; push rax; iretq"
|
||||
: //No outputs
|
||||
: "r" (process.data_selector), "r" (process.user_rsp), "r" (process.code_selector), "r" (process.rip)
|
||||
: "rax");
|
||||
: "rax", "memory");
|
||||
}
|
||||
|
||||
size_t select_next_process(){
|
||||
|
@ -809,11 +809,9 @@ bool create_paging(char* buffer, scheduler::process_t& process){
|
||||
|
||||
//2.1 Allocate user stack
|
||||
allocate_user_memory(process, scheduler::user_stack_start, scheduler::user_stack_size, process.physical_user_stack);
|
||||
process.user_rsp = scheduler::user_rsp;
|
||||
|
||||
//2.2 Allocate kernel stack
|
||||
allocate_user_memory(process, scheduler::kernel_stack_start, scheduler::kernel_stack_size, process.physical_kernel_stack);
|
||||
|
||||
//2.3 Allocate all user segments
|
||||
//2.2 Allocate all user segments
|
||||
|
||||
auto header = reinterpret_cast<elf::elf_header*>(buffer);
|
||||
auto program_header_table = reinterpret_cast<elf::program_header*>(buffer + header->e_phoff);
|
||||
@ -849,6 +847,17 @@ bool create_paging(char* buffer, scheduler::process_t& process){
|
||||
}
|
||||
}
|
||||
|
||||
//2.3 Allocate kernel stack
|
||||
auto virtual_kernel_stack = virtual_allocator::allocate(scheduler::kernel_stack_size / paging::PAGE_SIZE);
|
||||
auto physical_kernel_stack = physical_allocator::allocate(scheduler::kernel_stack_size / paging::PAGE_SIZE);
|
||||
|
||||
if(!paging::map_pages(virtual_kernel_stack, physical_kernel_stack, scheduler::kernel_stack_size / paging::PAGE_SIZE)){
|
||||
return false;
|
||||
}
|
||||
|
||||
process.physical_kernel_stack = physical_kernel_stack;
|
||||
process.kernel_rsp = virtual_kernel_stack + (scheduler::user_stack_size - 8);
|
||||
|
||||
//3. Clear stacks
|
||||
clear_physical_memory(process.physical_user_stack, scheduler::user_stack_size / paging::PAGE_SIZE);
|
||||
clear_physical_memory(process.physical_kernel_stack, scheduler::kernel_stack_size / paging::PAGE_SIZE);
|
||||
@ -887,9 +896,6 @@ void exec_command(const std::vector<std::string>& params){
|
||||
return;
|
||||
}
|
||||
|
||||
process.kernel_rsp = scheduler::kernel_rsp;
|
||||
process.user_rsp = scheduler::user_rsp;
|
||||
|
||||
process.rip = header->e_entry;
|
||||
|
||||
process.code_selector = gdt::USER_CODE_SELECTOR + 3;
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include "system_calls.hpp"
|
||||
#include "console.hpp"
|
||||
#include "scheduler.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -41,7 +42,7 @@ void system_call_entry(const interrupt::syscall_regs& regs){
|
||||
break;
|
||||
|
||||
case 0x666:
|
||||
//TODO Indicate to the scheduler that the process is over
|
||||
scheduler::kill_current_process();
|
||||
break;
|
||||
|
||||
default:
|
||||
|
Loading…
x
Reference in New Issue
Block a user