SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtio_blk_vfs_adapter.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <array>
8
9#include "block_device.hpp"
10#include "expected.hpp"
12
13namespace virtio::blk {
14
22 public:
24
27
32 explicit VirtioBlkVfsAdapter(VirtioBlkType* _dev, uint32_t _index = 0)
33 : dev_(_dev), index_(_index) {}
39 ~VirtioBlkVfsAdapter() override = default;
41
42 auto ReadSectors(uint64_t lba, uint32_t count, void* buf)
43 -> Expected<size_t> override {
44 auto* ptr = static_cast<uint8_t*>(buf);
45 for (uint32_t i = 0; i < count; ++i) {
46 auto result = dev_->Read(lba + i, ptr + i * kSectorSize);
47 if (!result) {
48 return std::unexpected(Error(result.error().code));
49 }
50 }
51 return static_cast<size_t>(count) * kSectorSize;
52 }
53
54 auto WriteSectors(uint64_t lba, uint32_t count, const void* buf)
55 -> Expected<size_t> override {
56 const auto* ptr = static_cast<const uint8_t*>(buf);
57 for (uint32_t i = 0; i < count; ++i) {
58 auto result = dev_->Write(lba + i, ptr + i * kSectorSize);
59 if (!result) {
60 return std::unexpected(Error(result.error().code));
61 }
62 }
63 return static_cast<size_t>(count) * kSectorSize;
64 }
65
66 [[nodiscard]] auto GetSectorSize() const -> uint32_t override {
67 return kSectorSize;
68 }
69
70 [[nodiscard]] auto GetSectorCount() const -> uint64_t override {
71 return dev_->GetCapacity();
72 }
73
74 [[nodiscard]] auto GetName() const -> const char* override {
75 static constexpr std::array<const char*, 4> kNames = {
76 "virtio-blk0", "virtio-blk1", "virtio-blk2", "virtio-blk3"};
77 return (index_ < kNames.size()) ? kNames[index_] : "virtio-blk?";
78 }
79
80 private:
81 static constexpr uint32_t kSectorSize = 512;
83 uint32_t index_{0};
84};
85
86} // namespace virtio::blk
块设备抽象基类
Adapts VirtioBlk<> to vfs::BlockDevice.
auto GetSectorCount() const -> uint64_t override
获取设备总扇区数
auto operator=(VirtioBlkVfsAdapter &&) -> VirtioBlkVfsAdapter &=delete
auto ReadSectors(uint64_t lba, uint32_t count, void *buf) -> Expected< size_t > override
读取连续扇区
auto GetSectorSize() const -> uint32_t override
获取扇区大小(通常为 512 字节)
~VirtioBlkVfsAdapter() override=default
auto WriteSectors(uint64_t lba, uint32_t count, const void *buf) -> Expected< size_t > override
写入连续扇区
VirtioBlkVfsAdapter(VirtioBlkVfsAdapter &&)=delete
auto GetName() const -> const char *override
获取设备名称(如 "virtio-blk0")
auto operator=(const VirtioBlkVfsAdapter &) -> VirtioBlkVfsAdapter &=delete
VirtioBlkVfsAdapter(const VirtioBlkVfsAdapter &)=delete
VirtioBlkVfsAdapter(VirtioBlkType *_dev, uint32_t _index=0)
构造函数
Virtio 块设备驱动
auto GetCapacity() const -> uint64_t
获取设备容量
auto Write(uint64_t sector, const uint8_t *data) -> Expected< void >
同步写入一个扇区
auto Read(uint64_t sector, uint8_t *data) -> Expected< void >
同步读取一个扇区
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
错误类型,用于 std::expected
Definition expected.hpp:343