SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ramfs::RamFs Class Reference

ramfs 文件系统实现 More...

#include <ramfs.hpp>

Inheritance diagram for ramfs::RamFs:
Inheritance graph
Collaboration diagram for ramfs::RamFs:
Collaboration graph

Classes

struct  RamDirEntry
 目录项结构(存储在目录的 data 中) More...
 
class  RamFsFileOps
 File 操作实现类 More...
 
class  RamFsInodeOps
 Inode 操作实现类 More...
 
struct  RamInode
 ramfs 内部 inode 数据 More...
 

Public Member Functions

auto GetName () const -> const char *override
 获取文件系统类型名
 
auto Mount (vfs::BlockDevice *device) -> Expected< vfs::Inode * > override
 挂载 ramfs
 
auto Unmount () -> Expected< void > override
 卸载 ramfs
 
auto Sync () -> Expected< void > override
 同步数据到磁盘(ramfs 无操作)
 
auto AllocateInode () -> Expected< vfs::Inode * > override
 分配新 inode
 
auto FreeInode (vfs::Inode *inode) -> Expected< void > override
 释放 inode
 
auto GetRootInode () const -> vfs::Inode *
 获取根 inode
 
auto GetFileOps () -> vfs::FileOps *
 获取文件操作实例
 
构造/析构函数
 RamFs ()
 构造函数
 
 ~RamFs () override
 析构函数
 
 RamFs (const RamFs &)=delete
 
 RamFs (RamFs &&)=delete
 
auto operator= (const RamFs &) -> RamFs &=delete
 
auto operator= (RamFs &&) -> RamFs &=delete
 
- Public Member Functions inherited from vfs::FileSystem
virtual ~FileSystem ()=default
 

Private Member Functions

auto FindInDirectory (RamInode *dir, const char *name) -> RamDirEntry *
 
auto AddToDirectory (RamInode *dir, const char *name, vfs::Inode *inode) -> Expected< void >
 
auto RemoveFromDirectory (RamInode *dir, const char *name) -> Expected< void >
 
auto IsDirectoryEmpty (RamInode *dir) -> bool
 
auto ExpandFile (RamInode *inode, size_t new_size) -> Expected< void >
 
auto AllocateFileData (size_t size) -> void *
 Bump-allocate size bytes from the file data pool.
 
auto AllocateDirEntries (size_t count) -> RamDirEntry *
 Bump-allocate space for count RamDirEntry from the dir pool.
 

Private Attributes

RamInode inodes_ [kMaxInodes]
 
RamInodefree_list_ {nullptr}
 空闲 inode 链表头
 
vfs::Inoderoot_inode_ {nullptr}
 根目录 inode
 
size_t used_inodes_ {0}
 已使用的 inode 数量
 
bool mounted_ {false}
 是否已挂载
 
uint8_t file_data_pool_ [kFileDataPoolSize]
 
size_t file_data_pool_used_ {0}
 
uint8_t dir_data_pool_ [kDirDataPoolSize]
 
size_t dir_data_pool_used_ {0}
 
RamFsInodeOps inode_ops_
 
RamFsFileOps file_ops_
 

Static Private Attributes

static constexpr size_t kMaxInodes = 1024
 
static constexpr size_t kInitialCapacity = 256
 初始文件容量
 
static constexpr size_t kFileDataPoolSize = 1024UL * 1024UL
 File data pool: 1 MB for regular file content.
 
static constexpr size_t kDirDataPoolSize = 256UL * 1024UL
 Dir data pool: 256 KB for directory entry arrays.
 

Friends

class RamFsInodeOps
 
class RamFsFileOps
 

Detailed Description

ramfs 文件系统实现

纯内存文件系统,所有数据存储在内存中,适合用作 rootfs

Definition at line 16 of file ramfs.hpp.

Constructor & Destructor Documentation

◆ RamFs() [1/3]

ramfs::RamFs::RamFs ( )

构造函数

Definition at line 15 of file ramfs.cpp.

16 : inodes_{},
17 free_list_(nullptr),
18 root_inode_(nullptr),
19 used_inodes_(0),
20 mounted_(false),
25 inode_ops_(this),
26 file_ops_(this) {}
vfs::Inode * root_inode_
根目录 inode
Definition ramfs.hpp:162
size_t dir_data_pool_used_
Definition ramfs.hpp:172
RamInode inodes_[kMaxInodes]
Definition ramfs.hpp:158
RamFsFileOps file_ops_
Definition ramfs.hpp:176
uint8_t dir_data_pool_[kDirDataPoolSize]
Definition ramfs.hpp:171
uint8_t file_data_pool_[kFileDataPoolSize]
Definition ramfs.hpp:169
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

◆ ~RamFs()

ramfs::RamFs::~RamFs ( )
override

析构函数

Definition at line 28 of file ramfs.cpp.

28 {
29 if (mounted_) {
30 Unmount();
31 }
32}
auto Unmount() -> Expected< void > override
卸载 ramfs
Definition ramfs.cpp:77
Here is the call graph for this function:

◆ RamFs() [2/3]

ramfs::RamFs::RamFs ( const RamFs )
delete

◆ RamFs() [3/3]

ramfs::RamFs::RamFs ( RamFs &&  )
delete

Member Function Documentation

◆ AddToDirectory()

auto ramfs::RamFs::AddToDirectory ( RamInode dir,
const char *  name,
vfs::Inode inode 
) -> Expected<void>
private

Definition at line 497 of file ramfs.cpp.

498 {
499 if (dir == nullptr || name == nullptr || inode == nullptr) {
500 return std::unexpected(Error(ErrorCode::kInvalidArgument));
501 }
502
503 if (dir->inode.type != FileType::kDirectory) {
504 return std::unexpected(Error(ErrorCode::kFsNotADirectory));
505 }
506
507 // 检查是否已存在
508 if (FindInDirectory(dir, name) != nullptr) {
509 return std::unexpected(Error(ErrorCode::kFsFileExists));
510 }
511
512 // 扩展目录容量
513 size_t current_entries = dir->capacity / sizeof(RamDirEntry);
514 if (dir->child_count >= current_entries) {
515 size_t new_capacity = (current_entries == 0) ? 16 : current_entries * 2;
516 RamDirEntry* new_data = AllocateDirEntries(new_capacity);
517 if (new_data == nullptr) {
518 return std::unexpected(Error(ErrorCode::kOutOfMemory));
519 }
520
521 // 复制旧数据
522 if (dir->data != nullptr) {
523 memcpy(new_data, dir->data, dir->child_count * sizeof(RamDirEntry));
524 // Old allocation stays in pool (bump allocator — no per-entry free)
525 }
526
527 dir->data = new_data;
528 dir->capacity = new_capacity * sizeof(RamDirEntry);
529 }
530
531 // 添加新条目
532 RamDirEntry* entries = static_cast<RamDirEntry*>(dir->data);
533 RamDirEntry* new_entry = &entries[dir->child_count];
534 strncpy(new_entry->name, name, sizeof(new_entry->name) - 1);
535 new_entry->name[sizeof(new_entry->name) - 1] = '\0';
536 new_entry->inode = inode;
537
538 ++dir->child_count;
539 ++inode->link_count;
540
541 return {};
542}
auto FindInDirectory(RamInode *dir, const char *name) -> RamDirEntry *
Definition ramfs.cpp:481
auto AllocateDirEntries(size_t count) -> RamDirEntry *
Bump-allocate space for count RamDirEntry from the dir pool.
Definition ramfs.cpp:620
@ kInvalidArgument
@ kFsNotADirectory
#define memcpy
#define strncpy
错误类型,用于 std::expected
Definition expected.hpp:343
uint32_t link_count
硬链接计数
Definition vfs.hpp:26

◆ AllocateDirEntries()

auto ramfs::RamFs::AllocateDirEntries ( size_t  count) -> RamDirEntry*
private

Bump-allocate space for count RamDirEntry from the dir pool.

Definition at line 620 of file ramfs.cpp.

620 {
621 size_t bytes = count * sizeof(RamDirEntry);
622 // Align up to alignof(RamDirEntry)
623 static constexpr size_t kAlign = alignof(RamDirEntry);
624 size_t aligned = (bytes + kAlign - 1UL) & ~(kAlign - 1UL);
625 if (dir_data_pool_used_ + aligned > kDirDataPoolSize) {
626 return nullptr;
627 }
628 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
629 auto* ptr =
630 reinterpret_cast<RamDirEntry*>(&dir_data_pool_[dir_data_pool_used_]);
631 dir_data_pool_used_ += aligned;
632 return ptr;
633}
static constexpr size_t kDirDataPoolSize
Dir data pool: 256 KB for directory entry arrays.
Definition ramfs.hpp:156

◆ AllocateFileData()

auto ramfs::RamFs::AllocateFileData ( size_t  size) -> void*
private

Bump-allocate size bytes from the file data pool.

Definition at line 609 of file ramfs.cpp.

609 {
610 // Align up to 16 bytes
611 size_t aligned = (size + 15UL) & ~15UL;
612 if (file_data_pool_used_ + aligned > kFileDataPoolSize) {
613 return nullptr;
614 }
616 file_data_pool_used_ += aligned;
617 return ptr;
618}
static constexpr size_t kFileDataPoolSize
File data pool: 1 MB for regular file content.
Definition ramfs.hpp:154

◆ AllocateInode()

auto ramfs::RamFs::AllocateInode ( ) -> Expected<vfs::Inode*>
overridevirtual

分配新 inode

Returns
Expected<vfs::Inode*> 新分配的 inode 或错误

Implements vfs::FileSystem.

Definition at line 109 of file ramfs.cpp.

109 {
110 if (free_list_ == nullptr) {
111 return std::unexpected(Error(ErrorCode::kOutOfMemory));
112 }
113
114 RamInode* ram_inode = free_list_;
116
117 // 初始化 inode
118 ram_inode->inode.ino = reinterpret_cast<uint64_t>(&ram_inode->inode);
119 ram_inode->inode.type = FileType::kUnknown;
120 ram_inode->inode.size = 0;
121 ram_inode->inode.permissions = 0644;
122 ram_inode->inode.link_count = 1;
123 ram_inode->inode.fs_private = ram_inode;
124 ram_inode->inode.fs = this;
125 ram_inode->inode.ops = &inode_ops_;
126
127 ram_inode->data = nullptr;
128 ram_inode->capacity = 0;
129 ram_inode->child_count = 0;
130 ram_inode->next_free = nullptr;
131
132 ++used_inodes_;
133 return &ram_inode->inode;
134}
RamInode * next_free
空闲链表指针
Definition ramfs.hpp:139
uint64_t ino
inode 编号(文件系统内唯一)
Definition vfs.hpp:18

◆ ExpandFile()

auto ramfs::RamFs::ExpandFile ( RamInode inode,
size_t  new_size 
) -> Expected<void>
private

Definition at line 580 of file ramfs.cpp.

580 {
581 if (inode == nullptr) {
582 return std::unexpected(Error(ErrorCode::kInvalidArgument));
583 }
584
585 if (new_size <= inode->capacity) {
586 return {};
587 }
588
589 // 计算新容量(按 256 字节对齐)
590 size_t new_capacity = ((new_size + 255) / 256) * 256;
591
592 uint8_t* new_data = static_cast<uint8_t*>(AllocateFileData(new_capacity));
593 if (new_data == nullptr) {
594 return std::unexpected(Error(ErrorCode::kOutOfMemory));
595 }
596
597 // 复制旧数据
598 if (inode->data != nullptr) {
599 memcpy(new_data, inode->data, inode->inode.size);
600 // Old allocation stays in pool (bump allocator — no per-block free)
601 }
602
603 inode->data = new_data;
604 inode->capacity = new_capacity;
605
606 return {};
607}
auto AllocateFileData(size_t size) -> void *
Bump-allocate size bytes from the file data pool.
Definition ramfs.cpp:609

◆ FindInDirectory()

auto ramfs::RamFs::FindInDirectory ( RamInode dir,
const char *  name 
) -> RamDirEntry*
private

Definition at line 481 of file ramfs.cpp.

481 {
482 if (dir == nullptr || dir->inode.type != FileType::kDirectory ||
483 dir->data == nullptr) {
484 return nullptr;
485 }
486
487 RamDirEntry* entries = static_cast<RamDirEntry*>(dir->data);
488 for (size_t i = 0; i < dir->child_count; ++i) {
489 if (strcmp(entries[i].name, name) == 0) {
490 return &entries[i];
491 }
492 }
493
494 return nullptr;
495}
#define strcmp

◆ FreeInode()

auto ramfs::RamFs::FreeInode ( vfs::Inode inode) -> Expected<void>
overridevirtual

释放 inode

Parameters
inode要释放的 inode
Returns
Expected<void> 成功或错误

Implements vfs::FileSystem.

Definition at line 136 of file ramfs.cpp.

136 {
137 if (inode == nullptr) {
138 return std::unexpected(Error(ErrorCode::kInvalidArgument));
139 }
140
141 RamInode* ram_inode = static_cast<RamInode*>(inode->fs_private);
142
143 // Data lives in static pools; just clear the pointer (no individual reclaim)
144 if (ram_inode->data != nullptr) {
145 ram_inode->data = nullptr;
146 }
147
148 // 重置 inode
149 ram_inode->inode.type = FileType::kUnknown;
150 ram_inode->inode.size = 0;
151 ram_inode->inode.fs_private = nullptr;
152 ram_inode->inode.ops = nullptr;
153
154 ram_inode->capacity = 0;
155 ram_inode->child_count = 0;
156
157 // 加入空闲链表
158 ram_inode->next_free = free_list_;
159 free_list_ = ram_inode;
160
161 --used_inodes_;
162 return {};
163}
void * fs_private
文件系统私有数据指针
Definition vfs.hpp:28

◆ GetFileOps()

auto ramfs::RamFs::GetFileOps ( ) -> vfs::FileOps*
virtual

获取文件操作实例

Returns
vfs::FileOps* 文件操作实例指针

Implements vfs::FileSystem.

Definition at line 167 of file ramfs.cpp.

167{ return &file_ops_; }

◆ GetName()

auto ramfs::RamFs::GetName ( ) const -> const char*
overridevirtual

获取文件系统类型名

Returns
"ramfs"

Implements vfs::FileSystem.

Definition at line 34 of file ramfs.cpp.

34{ return "ramfs"; }

◆ GetRootInode()

auto ramfs::RamFs::GetRootInode ( ) const -> vfs::Inode*

获取根 inode

Returns
vfs::Inode* 根目录 inode

Definition at line 165 of file ramfs.cpp.

165{ return root_inode_; }

◆ IsDirectoryEmpty()

auto ramfs::RamFs::IsDirectoryEmpty ( RamInode dir) -> bool
private

Definition at line 571 of file ramfs.cpp.

571 {
572 if (dir == nullptr || dir->inode.type != FileType::kDirectory) {
573 return true;
574 }
575
576 // 只包含 . 和 .. 的目录也是空的
577 return dir->child_count == 0;
578}

◆ Mount()

auto ramfs::RamFs::Mount ( vfs::BlockDevice device) -> Expected<vfs::Inode*>
overridevirtual

挂载 ramfs

Parameters
device必须为 nullptr(ramfs 不需要块设备)
Returns
Expected<vfs::Inode*> 根目录 inode
Postcondition
返回的 inode->type == vfs::FileType::kDirectory

Implements vfs::FileSystem.

Definition at line 36 of file ramfs.cpp.

36 {
37 if (mounted_) {
38 return std::unexpected(Error(ErrorCode::kFsAlreadyMounted));
39 }
40
41 if (device != nullptr) {
42 return std::unexpected(Error(ErrorCode::kInvalidArgument));
43 }
44
45 klog::Info("RamFs: mounting...");
46
47 // 初始化 inode 空闲链表
48 free_list_ = nullptr;
49 for (int i = kMaxInodes - 1; i >= 0; --i) {
51 free_list_ = &inodes_[i];
52 }
53
54 // 分配根目录 inode
55 auto root_result = AllocateInode();
56 if (!root_result.has_value()) {
57 return std::unexpected(root_result.error());
58 }
59
60 root_inode_ = root_result.value();
61 root_inode_->type = FileType::kDirectory;
63
64 // 初始化根目录数据
65 RamInode* ram_root = static_cast<RamInode*>(root_inode_->fs_private);
66 ram_root->data = nullptr;
67 ram_root->capacity = 0;
68 ram_root->child_count = 0;
69
70 used_inodes_ = 1;
71 mounted_ = true;
72
73 klog::Info("RamFs: mounted successfully");
74 return root_inode_;
75}
auto AllocateInode() -> Expected< vfs::Inode * > override
分配新 inode
Definition ramfs.cpp:109
static constexpr size_t kMaxInodes
Definition ramfs.hpp:148
@ kFsAlreadyMounted
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
uint32_t permissions
权限位(简化版)
Definition vfs.hpp:24
FileType type
文件类型
Definition vfs.hpp:20
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=() [1/2]

auto ramfs::RamFs::operator= ( const RamFs ) -> RamFs &=delete
delete

◆ operator=() [2/2]

auto ramfs::RamFs::operator= ( RamFs &&  ) -> RamFs &=delete
delete

◆ RemoveFromDirectory()

auto ramfs::RamFs::RemoveFromDirectory ( RamInode dir,
const char *  name 
) -> Expected<void>
private

Definition at line 544 of file ramfs.cpp.

545 {
546 if (dir == nullptr || name == nullptr) {
547 return std::unexpected(Error(ErrorCode::kInvalidArgument));
548 }
549
550 RamDirEntry* entry = FindInDirectory(dir, name);
551 if (entry == nullptr) {
552 return std::unexpected(Error(ErrorCode::kFsFileNotFound));
553 }
554
555 // 减少链接计数
556 if (entry->inode != nullptr) {
557 --entry->inode->link_count;
558 }
559
560 // 移除条目(将最后一个条目移到此处)
561 RamDirEntry* entries = static_cast<RamDirEntry*>(dir->data);
562 size_t last_idx = dir->child_count - 1;
563 if (entry != &entries[last_idx]) {
564 *entry = entries[last_idx];
565 }
566
567 --dir->child_count;
568 return {};
569}

◆ Sync()

auto ramfs::RamFs::Sync ( ) -> Expected<void>
overridevirtual

同步数据到磁盘(ramfs 无操作)

Returns
Expected<void> 成功

Implements vfs::FileSystem.

Definition at line 104 of file ramfs.cpp.

104 {
105 // ramfs 是纯内存文件系统,无需同步
106 return {};
107}

◆ Unmount()

auto ramfs::RamFs::Unmount ( ) -> Expected<void>
overridevirtual

卸载 ramfs

Returns
Expected<void> 成功或错误
Precondition
没有打开的文件引用此文件系统

Implements vfs::FileSystem.

Definition at line 77 of file ramfs.cpp.

77 {
78 if (!mounted_) {
79 return std::unexpected(Error(ErrorCode::kFsNotMounted));
80 }
81
82 klog::Info("RamFs: unmounting...");
83
84 // Clear all inode data pointers (data lives in static pools)
85 for (size_t i = 0; i < kMaxInodes; ++i) {
86 if (inodes_[i].inode.type != FileType::kUnknown &&
87 inodes_[i].data != nullptr) {
88 inodes_[i].data = nullptr;
89 }
90 }
91
92 // 重置状态并释放静态池
93 free_list_ = nullptr;
94 root_inode_ = nullptr;
95 used_inodes_ = 0;
96 mounted_ = false;
99
100 klog::Info("RamFs: unmounted");
101 return {};
102}
void * data
文件数据(普通文件)或子项列表(目录)
Definition ramfs.hpp:133
Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Symbol Documentation

◆ RamFsFileOps

friend class RamFsFileOps
friend

Definition at line 126 of file ramfs.hpp.

◆ RamFsInodeOps

friend class RamFsInodeOps
friend

Definition at line 125 of file ramfs.hpp.

Member Data Documentation

◆ dir_data_pool_

uint8_t ramfs::RamFs::dir_data_pool_[kDirDataPoolSize]
private

Definition at line 171 of file ramfs.hpp.

◆ dir_data_pool_used_

size_t ramfs::RamFs::dir_data_pool_used_ {0}
private

Definition at line 172 of file ramfs.hpp.

172{0};

◆ file_data_pool_

uint8_t ramfs::RamFs::file_data_pool_[kFileDataPoolSize]
private

Definition at line 169 of file ramfs.hpp.

◆ file_data_pool_used_

size_t ramfs::RamFs::file_data_pool_used_ {0}
private

Definition at line 170 of file ramfs.hpp.

170{0};

◆ file_ops_

RamFsFileOps ramfs::RamFs::file_ops_
private

Definition at line 176 of file ramfs.hpp.

◆ free_list_

RamInode* ramfs::RamFs::free_list_ {nullptr}
private

空闲 inode 链表头

Definition at line 160 of file ramfs.hpp.

160{nullptr};

◆ inode_ops_

RamFsInodeOps ramfs::RamFs::inode_ops_
private

Definition at line 175 of file ramfs.hpp.

◆ inodes_

RamInode ramfs::RamFs::inodes_[kMaxInodes]
private

Definition at line 158 of file ramfs.hpp.

◆ kDirDataPoolSize

constexpr size_t ramfs::RamFs::kDirDataPoolSize = 256UL * 1024UL
staticconstexprprivate

Dir data pool: 256 KB for directory entry arrays.

Definition at line 156 of file ramfs.hpp.

◆ kFileDataPoolSize

constexpr size_t ramfs::RamFs::kFileDataPoolSize = 1024UL * 1024UL
staticconstexprprivate

File data pool: 1 MB for regular file content.

Definition at line 154 of file ramfs.hpp.

◆ kInitialCapacity

constexpr size_t ramfs::RamFs::kInitialCapacity = 256
staticconstexprprivate

初始文件容量

Definition at line 150 of file ramfs.hpp.

◆ kMaxInodes

constexpr size_t ramfs::RamFs::kMaxInodes = 1024
staticconstexprprivate

Definition at line 148 of file ramfs.hpp.

◆ mounted_

bool ramfs::RamFs::mounted_ {false}
private

是否已挂载

Definition at line 166 of file ramfs.hpp.

166{false};

◆ root_inode_

vfs::Inode* ramfs::RamFs::root_inode_ {nullptr}
private

根目录 inode

Definition at line 162 of file ramfs.hpp.

162{nullptr};

◆ used_inodes_

size_t ramfs::RamFs::used_inodes_ {0}
private

已使用的 inode 数量

Definition at line 164 of file ramfs.hpp.

164{0};

The documentation for this class was generated from the following files: