Kernel: Make ext2 block buffers page aligned

This commit is contained in:
2026-07-11 14:23:35 +03:00
parent cf9a495f1d
commit 19c228362b
2 changed files with 21 additions and 8 deletions

View File

@@ -28,7 +28,7 @@ namespace Kernel
BAN_NON_COPYABLE(BlockBufferWrapper);
public:
BlockBufferWrapper(BAN::Span<uint8_t> buffer, void (*callback)(void*, const uint8_t*), void* argument)
BlockBufferWrapper(BAN::ByteSpan buffer, void (*callback)(void*, const uint8_t*), void* argument)
: m_buffer(buffer)
, m_callback(callback)
, m_argument(argument)
@@ -60,13 +60,13 @@ namespace Kernel
const uint8_t* data() const { return m_buffer.data(); }
BAN::ByteSpan span() { return m_buffer; }
BAN::ConstByteSpan span() const { return m_buffer.as_const(); }
BAN::ConstByteSpan span() const { return m_buffer; }
uint8_t& operator[](size_t index) { return m_buffer[index]; }
uint8_t operator[](size_t index) const { return m_buffer[index]; }
private:
BAN::Span<uint8_t> m_buffer;
BAN::ByteSpan m_buffer;
void (*m_callback)(void*, const uint8_t*);
void* m_argument;
};
@@ -128,7 +128,7 @@ namespace Kernel
private:
struct BlockBuffer
{
BAN::Vector<uint8_t> buffer;
BAN::ByteSpan buffer;
bool used { false };
};
@@ -144,6 +144,7 @@ namespace Kernel
Mutex m_buffer_mutex;
ThreadBlocker m_buffer_blocker;
BAN::UniqPtr<VirtualRange> m_buffer_data;
BAN::Array<BlockBuffer, max_threads * max_buffers_per_thread> m_buffers;
BAN::Array<ThreadInfo, max_threads> m_thread_infos;
};

View File

@@ -624,7 +624,7 @@ namespace Kernel
continue;
buffer.used = true;
return Ext2FS::BlockBufferWrapper {
buffer.buffer.span(),
buffer.buffer,
[](void* self, const uint8_t* buffer) { static_cast<BlockBufferManager*>(self)->destroy_callback(buffer); },
this
};
@@ -635,11 +635,23 @@ namespace Kernel
BAN::ErrorOr<void> Ext2FS::BlockBufferManager::initialize(size_t block_size)
{
for (auto& buffer : m_buffers)
m_buffer_data = TRY(VirtualRange::create_to_vaddr_range(
PageTable::kernel(),
{ KERNEL_OFFSET, BAN::numeric_limits<vaddr_t>::max() },
block_size * m_buffers.size(),
PageTable::ReadWrite | PageTable::Present,
false
));
auto buffer_data_span = BAN::ByteSpan { reinterpret_cast<uint8_t*>(m_buffer_data->vaddr()), m_buffer_data->size() };
for (size_t i = 0; i < m_buffers.size(); i++)
{
TRY(buffer.buffer.resize(block_size));
buffer.used = false;
m_buffers[i] = {
.buffer = buffer_data_span.slice(i * block_size, block_size),
.used = false,
};
}
return {};
}