SimpleKernel 1.17.0
Loading...
Searching...
No Matches
io_buffer_mock.cpp
Go to the documentation of this file.
1
7#include <cstdlib>
8#include <cstring>
9#include <span>
10#include <utility>
11
12#include "io_buffer.hpp"
13
14IoBuffer::IoBuffer(size_t size, size_t /*alignment*/)
15 : data_{static_cast<uint8_t*>(malloc(size))}, size_{size} {
16 if (data_ != nullptr) {
17 memset(data_, 0, size);
18 }
19}
20
22 free(data_);
23 data_ = nullptr;
24 size_ = 0;
25}
26
28 : data_{std::exchange(other.data_, nullptr)},
29 size_{std::exchange(other.size_, 0)} {}
30
31auto IoBuffer::operator=(IoBuffer&& other) noexcept -> IoBuffer& {
32 if (this != &other) {
33 free(data_);
34 data_ = std::exchange(other.data_, nullptr);
35 size_ = std::exchange(other.size_, 0);
36 }
37 return *this;
38}
39
40auto IoBuffer::GetBuffer() const -> std::span<const uint8_t> {
41 return {data_, size_};
42}
43
44auto IoBuffer::GetBuffer() -> std::span<uint8_t> { return {data_, size_}; }
45
46auto IoBuffer::IsValid() const -> bool { return data_ != nullptr; }
47
49 return DmaRegion{
50 .virt = data_,
51 .phys = v2p(reinterpret_cast<uintptr_t>(data_)),
52 .size = size_,
53 };
54}
动态分配、对齐 IO 缓冲区的 RAII 封装
Definition io_buffer.hpp:85
auto GetBuffer() const -> std::span< const uint8_t >
获取缓冲区数据与大小 (只读)
Definition io_buffer.cpp:48
uint8_t * data_
缓冲区数据指针
auto ToDmaRegion(VirtToPhysFunc v2p=IdentityVirtToPhys) const -> DmaRegion
创建此缓冲区的 DmaRegion 视图
Definition io_buffer.cpp:56
size_t size_
缓冲区大小
IoBuffer()=default
auto operator=(const IoBuffer &) -> IoBuffer &=delete
auto IsValid() const -> bool
检查缓冲区是否有效
Definition io_buffer.cpp:54
auto(*)(uintptr_t virt) -> uintptr_t VirtToPhysFunc
虚拟地址到物理地址转换回调类型
Definition io_buffer.hpp:18
void * malloc(size_t size)
Definition memory.cpp:31
void free(void *ptr)
Definition memory.cpp:38
#define memset
DMA 可访问内存区域的非拥有描述符
Definition io_buffer.hpp:37
void * virt
虚拟(CPU 可访问)基地址
Definition io_buffer.hpp:39