From 609495882fc2ff8bd1369167f31efd00fa19b700 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Aug 2019 21:04:27 +0200 Subject: [PATCH] Kernel: Add KBuffer, a simple byte buffer backed by kernel-only memory This memory is not accessible to userspace and comes from the kernel page allocator, not from the kmalloc heap. This makes it ideal for larger allocations. --- Kernel/KBuffer.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Kernel/KBuffer.h diff --git a/Kernel/KBuffer.h b/Kernel/KBuffer.h new file mode 100644 index 0000000000..95d1d5e51a --- /dev/null +++ b/Kernel/KBuffer.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + +class KBuffer : public RefCounted { +public: + static NonnullRefPtr create_with_size(size_t size) + { + auto region = MM.allocate_kernel_region(PAGE_ROUND_UP(size), "KBuffer"); + ASSERT(region); + return adopt(*new KBuffer(*region, size)); + } + + static NonnullRefPtr copy(const void* data, size_t size) + { + auto buffer = create_with_size(size); + memcpy(buffer->data(), data, size); + return buffer; + } + + u8* data() { return m_region->vaddr().as_ptr(); } + const u8* data() const { return m_region->vaddr().as_ptr(); } + size_t size() const { return m_size; } + size_t capacity() const { return m_region->size(); } + +private: + explicit KBuffer(NonnullRefPtr&& region, size_t size) + : m_size(size) + , m_region(move(region)) + { + } + + size_t m_size { 0 }; + NonnullRefPtr m_region; +};