mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
[kernel] Rename stack_cache to buffer_cache
Renamed and genericized the stack_cache class to manage any address range area of buffers or memory regions. Removed singleton and created some globals that map to different address regions (kernel stacks, kernel buffers). Tags: vmem virtual memeory
This commit is contained in:
@@ -46,7 +46,7 @@ modules:
|
|||||||
- src/kernel/scheduler.cpp
|
- src/kernel/scheduler.cpp
|
||||||
- src/kernel/screen.cpp
|
- src/kernel/screen.cpp
|
||||||
- src/kernel/serial.cpp
|
- src/kernel/serial.cpp
|
||||||
- src/kernel/stack_cache.cpp
|
- src/kernel/buffer_cache.cpp
|
||||||
- src/kernel/symbol_table.cpp
|
- src/kernel/symbol_table.cpp
|
||||||
- src/kernel/syscall.cpp
|
- src/kernel/syscall.cpp
|
||||||
- src/kernel/syscall.s
|
- src/kernel/syscall.s
|
||||||
|
|||||||
48
src/kernel/buffer_cache.cpp
Normal file
48
src/kernel/buffer_cache.cpp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include "kutil/assert.h"
|
||||||
|
#include "kutil/vm_space.h"
|
||||||
|
#include "kernel_memory.h"
|
||||||
|
#include "page_manager.h"
|
||||||
|
#include "buffer_cache.h"
|
||||||
|
|
||||||
|
extern kutil::vm_space g_kernel_space;
|
||||||
|
|
||||||
|
using memory::frame_size;
|
||||||
|
using memory::kernel_stack_pages;
|
||||||
|
using memory::kernel_buffer_pages;
|
||||||
|
|
||||||
|
static constexpr size_t stack_bytes = kernel_stack_pages * frame_size;
|
||||||
|
static constexpr size_t buffer_bytes = kernel_buffer_pages * frame_size;
|
||||||
|
|
||||||
|
buffer_cache g_kstack_cache {memory::stacks_start, stack_bytes, memory::kernel_max_stacks};
|
||||||
|
buffer_cache g_kbuffer_cache {memory::buffers_start, buffer_bytes, memory::kernel_max_buffers};
|
||||||
|
|
||||||
|
buffer_cache::buffer_cache(uintptr_t start, size_t size, size_t length) :
|
||||||
|
m_next(start), m_end(start+length), m_size(size)
|
||||||
|
{
|
||||||
|
kassert((size % frame_size) == 0, "buffer_cache given a non-page-multiple size!");
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t
|
||||||
|
buffer_cache::get_buffer()
|
||||||
|
{
|
||||||
|
uintptr_t addr = 0;
|
||||||
|
if (m_cache.count() > 0) {
|
||||||
|
addr = m_cache.pop();
|
||||||
|
} else {
|
||||||
|
addr = m_next;
|
||||||
|
m_next += m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_kernel_space.commit(addr, m_size);
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
buffer_cache::return_buffer(uintptr_t addr)
|
||||||
|
{
|
||||||
|
void *ptr = reinterpret_cast<void*>(addr);
|
||||||
|
size_t page_count = page_manager::page_count(m_size);
|
||||||
|
page_manager::get()->unmap_pages(ptr, page_count);
|
||||||
|
g_kernel_space.unreserve(addr, m_size);
|
||||||
|
m_cache.append(addr);
|
||||||
|
}
|
||||||
29
src/kernel/buffer_cache.h
Normal file
29
src/kernel/buffer_cache.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <kutil/vector.h>
|
||||||
|
|
||||||
|
/// A cache of kernel stack address ranges
|
||||||
|
class buffer_cache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor.
|
||||||
|
/// \args start Start of virtual memory area to contain buffers
|
||||||
|
/// \args size Size of individual buffers in bytes
|
||||||
|
/// \args length Size of virtual memory area in bytes
|
||||||
|
buffer_cache(uintptr_t start, size_t size, size_t length);
|
||||||
|
|
||||||
|
/// Get an available stack address
|
||||||
|
uintptr_t get_buffer();
|
||||||
|
|
||||||
|
/// Return a buffer address to the available pool
|
||||||
|
void return_buffer(uintptr_t addr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
kutil::vector<uintptr_t> m_cache;
|
||||||
|
uintptr_t m_next;
|
||||||
|
const uintptr_t m_end;
|
||||||
|
const size_t m_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern buffer_cache g_kstack_cache;
|
||||||
|
extern buffer_cache g_kbuffer_cache;
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "objects/thread.h"
|
#include "objects/thread.h"
|
||||||
#include "objects/process.h"
|
#include "objects/process.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
#include "stack_cache.h"
|
#include "buffer_cache.h"
|
||||||
|
|
||||||
extern "C" void kernel_to_user_trampoline();
|
extern "C" void kernel_to_user_trampoline();
|
||||||
static constexpr j6_signal_t thread_default_signals = 0;
|
static constexpr j6_signal_t thread_default_signals = 0;
|
||||||
@@ -29,7 +29,7 @@ thread::thread(process &parent, uint8_t pri, uintptr_t rsp0) :
|
|||||||
|
|
||||||
thread::~thread()
|
thread::~thread()
|
||||||
{
|
{
|
||||||
stack_cache::get().return_stack(m_tcb.kernel_stack);
|
g_kstack_cache.return_buffer(m_tcb.kernel_stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
thread *
|
thread *
|
||||||
@@ -150,7 +150,7 @@ thread::setup_kernel_stack()
|
|||||||
constexpr unsigned null_frame_entries = 2;
|
constexpr unsigned null_frame_entries = 2;
|
||||||
constexpr size_t null_frame_size = null_frame_entries * sizeof(uint64_t);
|
constexpr size_t null_frame_size = null_frame_entries * sizeof(uint64_t);
|
||||||
|
|
||||||
uintptr_t stack_addr = stack_cache::get().get_stack();
|
uintptr_t stack_addr = g_kstack_cache.get_buffer();
|
||||||
uintptr_t stack_end = stack_addr + stack_bytes;
|
uintptr_t stack_end = stack_addr + stack_bytes;
|
||||||
|
|
||||||
uint64_t *null_frame = reinterpret_cast<uint64_t*>(stack_end - null_frame_size);
|
uint64_t *null_frame = reinterpret_cast<uint64_t*>(stack_end - null_frame_size);
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
#include "kutil/vm_space.h"
|
|
||||||
#include "kernel_memory.h"
|
|
||||||
#include "page_manager.h"
|
|
||||||
#include "stack_cache.h"
|
|
||||||
|
|
||||||
extern kutil::vm_space g_kernel_space;
|
|
||||||
|
|
||||||
using memory::frame_size;
|
|
||||||
using memory::kernel_stack_pages;
|
|
||||||
static constexpr size_t stack_bytes = kernel_stack_pages * frame_size;
|
|
||||||
|
|
||||||
stack_cache stack_cache::s_instance(memory::stacks_start, memory::kernel_max_stacks);
|
|
||||||
|
|
||||||
stack_cache::stack_cache(uintptr_t start, size_t size) :
|
|
||||||
m_next(start), m_end(start+size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t
|
|
||||||
stack_cache::get_stack()
|
|
||||||
{
|
|
||||||
uintptr_t stack = 0;
|
|
||||||
if (m_cache.count() > 0) {
|
|
||||||
stack = m_cache.pop();
|
|
||||||
} else {
|
|
||||||
stack = m_next;
|
|
||||||
m_next += stack_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_kernel_space.commit(stack, stack_bytes);
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
stack_cache::return_stack(uintptr_t addr)
|
|
||||||
{
|
|
||||||
void *ptr = reinterpret_cast<void*>(addr);
|
|
||||||
page_manager::get()->unmap_pages(ptr, kernel_stack_pages);
|
|
||||||
g_kernel_space.unreserve(addr, stack_bytes);
|
|
||||||
m_cache.append(addr);
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <kutil/vector.h>
|
|
||||||
|
|
||||||
/// A cache of kernel stack address ranges
|
|
||||||
class stack_cache
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/// Constructor.
|
|
||||||
/// \args start Start of virtual memory area to contain stacks
|
|
||||||
/// \args size Size of virtual memory area in bytes
|
|
||||||
stack_cache(uintptr_t start, size_t size);
|
|
||||||
|
|
||||||
/// Get an available stack address
|
|
||||||
uintptr_t get_stack();
|
|
||||||
|
|
||||||
/// Return a stack address to the available pool
|
|
||||||
void return_stack(uintptr_t addr);
|
|
||||||
|
|
||||||
static stack_cache & get() { return s_instance; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
kutil::vector<uintptr_t> m_cache;
|
|
||||||
uintptr_t m_next;
|
|
||||||
const uintptr_t m_end;
|
|
||||||
static stack_cache s_instance;
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user