RAM File System (axfs_ramfs)
Relevant source files
Purpose and Scope
axfs_ramfs
implements a RAM-based file system for the axfs_crates ecosystem. It provides an in-memory storage solution that conforms to the Virtual File System (VFS) interfaces defined in axfs_vfs
. This document covers the architecture, components, and usage patterns of the RAM File System.
For information about the VFS interface that axfs_ramfs
implements, see Virtual File System Interface (axfs_vfs).
Sources: Cargo.toml(L4 - L8) README.md(L7 - L9)
System Architecture
The RAM File System is one of the concrete implementations in the axfs_crates ecosystem, alongside the Device File System (axfs_devfs
).
Integration with axfs_crates
flowchart TD A["Applications"] B["axfs_vfs: VfsOps & VfsNodeOps Traits"] C["axfs_ramfs: RamFileSystem"] D["axfs_devfs: DeviceFileSystem"] E["System Memory (RAM)"] F["Hardware Devices"] A --> B B --> C B --> D C --> E D --> F
This diagram illustrates how axfs_ramfs
fits within the overall architecture. Applications interact with file systems through the VFS interface, which delegates operations to the appropriate implementation based on mount points.
Sources: Cargo.toml(L4 - L8) README.md(L7 - L9)
Core Components
Based on the VFS interface requirements, the RAM File System likely consists of these core components:
Component Relationships
classDiagram class VfsOps { <<trait>> +mount(path, mount_point) +root_dir() } class VfsNodeOps { <<trait>> +get_attr() +lookup(path) +read_dir(start_idx, dirents) +read_at(offset, buf) +write_at(offset, buf) +create(path, type) +remove(path) +truncate(size) } class RamFileSystem { -root +new() +root_dir() +mount(path, mount_point) } class RamDirNode { -parent -children +new() +lookup(path) +create(name, type) } class RamFileNode { -parent -content +new() +read_at(offset, buf) +write_at(offset, buf) +truncate(size) } VfsOps ..|> RamFileSystem : implements VfsNodeOps ..|> RamDirNode : implements VfsNodeOps ..|> RamFileNode : implements RamFileSystem --> RamDirNode : contains RamDirNode --> RamDirNode RamDirNode --> RamDirNode : contains RamDirNode --> RamDirNode RamDirNode --> RamFileNode : contains
The key components likely include:
Component | Purpose | Key Responsibilities |
---|---|---|
RamFileSystem | Main file system implementation | ImplementsVfsOpstrait, manages mount operations, provides access to root directory |
RamDirNode | Directory node implementation | Stores hierarchical structure, manages children (files and subdirectories) |
RamFileNode | File node implementation | Stores file content in memory, handles read/write operations |
These components work together to provide a complete in-memory file system hierarchy with the same interface as other file systems.
Sources: Based on common Rust patterns and the VFS architecture shown in the high-level diagrams
In-Memory Hierarchy
A typical RAM file system hierarchy structure:
flowchart TD A["RamDirNode: Root '/'"] B["RamDirNode: '/tmp'"] C["RamDirNode: '/home'"] D["RamFileNode: 'temp.txt'"] E["RamDirNode: 'cache'"] F["RamFileNode: 'data.bin'"] G["RamDirNode: 'user1'"] H["RamFileNode: 'document.txt'"] I["RamFileNode: 'image.png'"] A --> B A --> C B --> D B --> E C --> G E --> F G --> H G --> I
This structure mirrors traditional file systems but exists entirely in memory. Each node (RamDirNode
or RamFileNode
) implements the VfsNodeOps
trait, providing a consistent interface regardless of node type.
Sources: Based on common file system hierarchy patterns
Operation Patterns
The RAM File System implements file system operations defined by the VFS traits:
File System Operations (VfsOpsTrait)
mount
: Attaches the RAM file system to a mount pointroot_dir
: Provides access to the root directory
Node Operations (VfsNodeOpsTrait)
Operation | Description | Implementation Considerations |
---|---|---|
get_attr | Get node attributes (size, type, etc.) | Return cached attributes or calculate on demand |
lookup | Find a node by path | Traverse directory hierarchy to locate node |
read_dir | List directory contents | Return entries from directory's children map |
read_at | Read file data from specified offset | Access in-memory buffer at offset |
write_at | Write file data at specified offset | Modify in-memory buffer, potentially resize |
create | Create new file or directory | Allocate new node, add to parent's children |
remove | Delete file or directory | Remove from parent's children, free memory |
truncate | Change file size | Resize in-memory buffer |
Sources: Based on VFS interface requirements
Usage Lifecycle
sequenceDiagram participant Application as "Application" participant VFSInterface as "VFS Interface" participant RamFileSystem as "RamFileSystem" participant RamDirNode as "RamDirNode" participant RamFileNode as "RamFileNode" Application ->> RamFileSystem: RamFileSystem::new() RamFileSystem ->> RamDirNode: RamDirNode::new() RamDirNode ->> RamFileSystem: Arc<RamDirNode> RamFileSystem ->> Application: RamFileSystem instance Application ->> VFSInterface: mount("/tmp", ramfs.root_dir()) VFSInterface ->> RamFileSystem: mount operation Application ->> VFSInterface: create("/tmp/file.txt", VfsNodeType::File) VFSInterface ->> RamFileSystem: create request RamFileSystem ->> RamDirNode: lookup("/tmp") RamDirNode ->> RamFileSystem: tmp directory node RamFileSystem ->> RamDirNode: create("file.txt", VfsNodeType::File) RamDirNode ->> RamFileNode: RamFileNode::new() RamFileNode ->> RamDirNode: Arc<RamFileNode> RamDirNode ->> RamFileSystem: Success RamFileSystem ->> VFSInterface: Success VFSInterface ->> Application: Success Application ->> VFSInterface: lookup("/tmp/file.txt") VFSInterface ->> RamFileSystem: lookup request RamFileSystem ->> RamDirNode: lookup("/tmp") RamDirNode ->> RamFileSystem: tmp directory node RamFileSystem ->> RamDirNode: lookup("file.txt") RamDirNode ->> RamFileNode: Get file node RamFileNode ->> RamDirNode: file node RamDirNode ->> RamFileSystem: file node RamFileSystem ->> VFSInterface: file node VFSInterface ->> Application: file node Application ->> VFSInterface: write_at(file, 0, data) VFSInterface ->> RamFileNode: write_at(0, data) RamFileNode ->> RamFileNode: Store data in memory buffer RamFileNode ->> VFSInterface: bytes_written VFSInterface ->> Application: bytes_written
This sequence diagram illustrates the typical lifecycle of RAM file system usage, from creation to file operations.
Sources: Based on common file system operation patterns
Implementation Considerations
The RAM File System implementation likely uses these Rust features:
Arc<T>
for shared ownership of nodesWeak<T>
references to prevent reference cycles (particularly for parent pointers)RwLock<T>
orMutex<T>
for concurrent access to mutable dataVec<u8>
or similar for storing file contentsBTreeMap<String, VfsNodeRef>
for directory entries
Advantages and Limitations
Advantages
- Performance: Memory operations are faster than disk I/O
- Simplicity: No need for persistent storage management
- Portability: Works in environments without storage devices
Limitations
- Volatility: All data is lost on system shutdown or restart
- Capacity: Limited by available RAM
- Concurrent Access: Requires careful synchronization for thread safety
Use Cases
- Temporary file storage
- Cache for frequently accessed data
- Test environments
- Embedded systems with limited storage
- Performance-critical applications
Sources: README.md(L9)