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 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 user_stack_size = 2 * paging::PAGE_SIZE;
|
||||||
constexpr const auto kernel_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 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
|
} //end of namespace scheduler
|
||||||
|
|
||||||
|
@ -58,7 +58,6 @@ void switch_to_process(size_t index){
|
|||||||
|
|
||||||
k_printf("Switched to %u\n", index);
|
k_printf("Switched to %u\n", index);
|
||||||
|
|
||||||
//TODO Move that to scheduler
|
|
||||||
auto& process = processes[current_index];
|
auto& process = processes[current_index];
|
||||||
|
|
||||||
gdt::tss.rsp0_low = process.kernel_rsp & 0xFFFFFFFF;
|
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");
|
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"
|
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
|
: //No outputs
|
||||||
: "r" (process.data_selector), "r" (process.user_rsp), "r" (process.code_selector), "r" (process.rip)
|
: "r" (process.data_selector), "r" (process.user_rsp), "r" (process.code_selector), "r" (process.rip)
|
||||||
: "rax");
|
: "rax", "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t select_next_process(){
|
size_t select_next_process(){
|
||||||
|
@ -809,11 +809,9 @@ bool create_paging(char* buffer, scheduler::process_t& process){
|
|||||||
|
|
||||||
//2.1 Allocate user stack
|
//2.1 Allocate user stack
|
||||||
allocate_user_memory(process, scheduler::user_stack_start, scheduler::user_stack_size, process.physical_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
|
//2.2 Allocate all user segments
|
||||||
allocate_user_memory(process, scheduler::kernel_stack_start, scheduler::kernel_stack_size, process.physical_kernel_stack);
|
|
||||||
|
|
||||||
//2.3 Allocate all user segments
|
|
||||||
|
|
||||||
auto header = reinterpret_cast<elf::elf_header*>(buffer);
|
auto header = reinterpret_cast<elf::elf_header*>(buffer);
|
||||||
auto program_header_table = reinterpret_cast<elf::program_header*>(buffer + header->e_phoff);
|
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
|
//3. Clear stacks
|
||||||
clear_physical_memory(process.physical_user_stack, scheduler::user_stack_size / paging::PAGE_SIZE);
|
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);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
process.kernel_rsp = scheduler::kernel_rsp;
|
|
||||||
process.user_rsp = scheduler::user_rsp;
|
|
||||||
|
|
||||||
process.rip = header->e_entry;
|
process.rip = header->e_entry;
|
||||||
|
|
||||||
process.code_selector = gdt::USER_CODE_SELECTOR + 3;
|
process.code_selector = gdt::USER_CODE_SELECTOR + 3;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "system_calls.hpp"
|
#include "system_calls.hpp"
|
||||||
#include "console.hpp"
|
#include "console.hpp"
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ void system_call_entry(const interrupt::syscall_regs& regs){
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x666:
|
case 0x666:
|
||||||
//TODO Indicate to the scheduler that the process is over
|
scheduler::kill_current_process();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user