[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:
2020-08-30 17:59:13 -07:00
parent 773617cbf3
commit f27b133089
6 changed files with 81 additions and 72 deletions

View 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);
}