Allocate kernel user stacks in kernel memory space

This commit is contained in:
Baptiste Wicht 2014-01-26 19:47:32 +01:00
parent 5f88766c83
commit 9b9d6bea2d
4 changed files with 17 additions and 15 deletions

View File

@ -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

View File

@ -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(){

View File

@ -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;

View File

@ -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: