SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ramfs.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include "filesystem.hpp"
8#include "vfs.hpp"
9
10namespace ramfs {
11
16class RamFs : public vfs::FileSystem {
17 public:
20
24 RamFs();
25
29 ~RamFs() override;
30
31 // 禁止拷贝和移动
32 RamFs(const RamFs&) = delete;
33 RamFs(RamFs&&) = delete;
34 auto operator=(const RamFs&) -> RamFs& = delete;
35 auto operator=(RamFs&&) -> RamFs& = delete;
36
38
42 [[nodiscard]] auto GetName() const -> const char* override;
43
50 auto Mount(vfs::BlockDevice* device) -> Expected<vfs::Inode*> override;
51
57 auto Unmount() -> Expected<void> override;
58
63 auto Sync() -> Expected<void> override;
64
69 auto AllocateInode() -> Expected<vfs::Inode*> override;
70
76 auto FreeInode(vfs::Inode* inode) -> Expected<void> override;
77
82 [[nodiscard]] auto GetRootInode() const -> vfs::Inode*;
83
88 [[nodiscard]] auto GetFileOps() -> vfs::FileOps*;
89
91 class RamFsInodeOps : public vfs::InodeOps {
92 public:
93 explicit RamFsInodeOps(RamFs* fs) : fs_(fs) {}
94 auto Lookup(vfs::Inode* dir, const char* name)
95 -> Expected<vfs::Inode*> override;
96 auto Create(vfs::Inode* dir, const char* name, vfs::FileType type)
97 -> Expected<vfs::Inode*> override;
98 auto Unlink(vfs::Inode* dir, const char* name) -> Expected<void> override;
99 auto Mkdir(vfs::Inode* dir, const char* name)
100 -> Expected<vfs::Inode*> override;
101 auto Rmdir(vfs::Inode* dir, const char* name) -> Expected<void> override;
102
103 private:
105 };
106
108 class RamFsFileOps : public vfs::FileOps {
109 public:
110 explicit RamFsFileOps(RamFs* fs) : fs_(fs) {}
111 auto Read(vfs::File* file, void* buf, size_t count)
112 -> Expected<size_t> override;
113 auto Write(vfs::File* file, const void* buf, size_t count)
114 -> Expected<size_t> override;
115 auto Seek(vfs::File* file, int64_t offset, vfs::SeekWhence whence)
116 -> Expected<uint64_t> override;
117 auto Close(vfs::File* file) -> Expected<void> override;
118 auto ReadDir(vfs::File* file, vfs::DirEntry* dirent, size_t count)
119 -> Expected<size_t> override;
120
121 private:
123 };
124
125 friend class RamFsInodeOps;
126 friend class RamFsFileOps;
127
128 private:
141
143 struct RamDirEntry {
144 char name[256];
146 };
147
148 static constexpr size_t kMaxInodes = 1024;
150 static constexpr size_t kInitialCapacity = 256;
151
152 // Static pool constants — zero heap allocation
154 static constexpr size_t kFileDataPoolSize = 1024UL * 1024UL;
156 static constexpr size_t kDirDataPoolSize = 256UL * 1024UL;
157
164 size_t used_inodes_{0};
166 bool mounted_{false};
167
168 // Static pools (bump allocator, reset on Unmount)
169 alignas(16) uint8_t file_data_pool_[kFileDataPoolSize];
171 alignas(alignof(RamDirEntry)) uint8_t dir_data_pool_[kDirDataPoolSize];
173
174 // 操作实例
177
178 // 辅助函数
179 auto FindInDirectory(RamInode* dir, const char* name) -> RamDirEntry*;
180 auto AddToDirectory(RamInode* dir, const char* name, vfs::Inode* inode)
182 auto RemoveFromDirectory(RamInode* dir, const char* name) -> Expected<void>;
183 auto IsDirectoryEmpty(RamInode* dir) -> bool;
184 auto ExpandFile(RamInode* inode, size_t new_size) -> Expected<void>;
186 auto AllocateFileData(size_t size) -> void*;
188 auto AllocateDirEntries(size_t count) -> RamDirEntry*;
189};
190
191} // namespace ramfs
File 操作实现类
Definition ramfs.hpp:108
auto Read(vfs::File *file, void *buf, size_t count) -> Expected< size_t > override
从文件读取数据
Definition ramfs.cpp:299
auto Write(vfs::File *file, const void *buf, size_t count) -> Expected< size_t > override
向文件写入数据
Definition ramfs.cpp:334
auto Close(vfs::File *file) -> Expected< void > override
关闭文件
Definition ramfs.cpp:415
auto ReadDir(vfs::File *file, vfs::DirEntry *dirent, size_t count) -> Expected< size_t > override
读取目录项
Definition ramfs.cpp:425
auto Seek(vfs::File *file, int64_t offset, vfs::SeekWhence whence) -> Expected< uint64_t > override
调整文件偏移量
Definition ramfs.cpp:372
Inode 操作实现类
Definition ramfs.hpp:91
ramfs 文件系统实现
Definition ramfs.hpp:16
vfs::Inode * root_inode_
根目录 inode
Definition ramfs.hpp:162
auto IsDirectoryEmpty(RamInode *dir) -> bool
Definition ramfs.cpp:571
auto AllocateFileData(size_t size) -> void *
Bump-allocate size bytes from the file data pool.
Definition ramfs.cpp:609
static constexpr size_t kFileDataPoolSize
File data pool: 1 MB for regular file content.
Definition ramfs.hpp:154
auto AllocateInode() -> Expected< vfs::Inode * > override
分配新 inode
Definition ramfs.cpp:109
size_t dir_data_pool_used_
Definition ramfs.hpp:172
RamInode inodes_[kMaxInodes]
Definition ramfs.hpp:158
auto operator=(RamFs &&) -> RamFs &=delete
auto Unmount() -> Expected< void > override
卸载 ramfs
Definition ramfs.cpp:77
auto FindInDirectory(RamInode *dir, const char *name) -> RamDirEntry *
Definition ramfs.cpp:481
~RamFs() override
析构函数
Definition ramfs.cpp:28
auto Sync() -> Expected< void > override
同步数据到磁盘(ramfs 无操作)
Definition ramfs.cpp:104
auto Mount(vfs::BlockDevice *device) -> Expected< vfs::Inode * > override
挂载 ramfs
Definition ramfs.cpp:36
auto GetFileOps() -> vfs::FileOps *
获取文件操作实例
Definition ramfs.cpp:167
auto AddToDirectory(RamInode *dir, const char *name, vfs::Inode *inode) -> Expected< void >
Definition ramfs.cpp:497
auto GetRootInode() const -> vfs::Inode *
获取根 inode
Definition ramfs.cpp:165
RamFsFileOps file_ops_
Definition ramfs.hpp:176
auto GetName() const -> const char *override
获取文件系统类型名
Definition ramfs.cpp:34
static constexpr size_t kInitialCapacity
初始文件容量
Definition ramfs.hpp:150
auto ExpandFile(RamInode *inode, size_t new_size) -> Expected< void >
Definition ramfs.cpp:580
auto FreeInode(vfs::Inode *inode) -> Expected< void > override
释放 inode
Definition ramfs.cpp:136
static constexpr size_t kDirDataPoolSize
Dir data pool: 256 KB for directory entry arrays.
Definition ramfs.hpp:156
static constexpr size_t kMaxInodes
Definition ramfs.hpp:148
RamFs(RamFs &&)=delete
RamFs(const RamFs &)=delete
auto AllocateDirEntries(size_t count) -> RamDirEntry *
Bump-allocate space for count RamDirEntry from the dir pool.
Definition ramfs.cpp:620
uint8_t dir_data_pool_[kDirDataPoolSize]
Definition ramfs.hpp:171
uint8_t file_data_pool_[kFileDataPoolSize]
Definition ramfs.hpp:169
auto operator=(const RamFs &) -> RamFs &=delete
RamFs()
构造函数
Definition ramfs.cpp:15
RamInode * free_list_
空闲 inode 链表头
Definition ramfs.hpp:160
RamFsInodeOps inode_ops_
Definition ramfs.hpp:175
bool mounted_
是否已挂载
Definition ramfs.hpp:166
size_t used_inodes_
已使用的 inode 数量
Definition ramfs.hpp:164
size_t file_data_pool_used_
Definition ramfs.hpp:170
auto RemoveFromDirectory(RamInode *dir, const char *name) -> Expected< void >
Definition ramfs.cpp:544
块设备抽象基类
File 操作接口
文件系统类型基类
Inode 操作接口
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
FileType
文件类型
Definition vfs_types.hpp:22
auto Unlink(const char *path) -> Expected< void >
删除文件
Definition unlink.cpp:15
SeekWhence
文件 seek 基准
Definition vfs_types.hpp:94
auto Lookup(const char *path) -> Expected< Dentry * >
路径解析,查找 dentry
Definition lookup.cpp:14
目录项结构(存储在目录的 data 中)
Definition ramfs.hpp:143
ramfs 内部 inode 数据
Definition ramfs.hpp:130
RamInode * next_free
空闲链表指针
Definition ramfs.hpp:139
void * data
文件数据(普通文件)或子项列表(目录)
Definition ramfs.hpp:133
size_t capacity
数据缓冲区容量
Definition ramfs.hpp:135
size_t child_count
子项数量(仅目录)
Definition ramfs.hpp:137
目录项结构(用于 readdir)
File — 打开的文件实例(每次 open 产生一个)
Definition vfs.hpp:65
Inode — 文件元数据(独立于路径名)
Definition vfs.hpp:16