summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-04 14:12:24 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-04 14:12:24 +0800
commita64d25c07b31d57f8706073e11cd774d0880d6dd (patch)
treea4bbae6cff94fa69eea30db865267b211eb4c86b /include
parent210025560c80b48af4875af199f183ad709e3bf0 (diff)
parentd3cf3f08d1343d6b265516d5a79ce2d197b59d26 (diff)
downloadlume-a64d25c07b31d57f8706073e11cd774d0880d6dd.tar.gz
lume-a64d25c07b31d57f8706073e11cd774d0880d6dd.tar.xz
Merge pull request #5 from Richard-Qin-001/dev/file-system
feat(file-system): implement read and write FAT32 File System and basic shell
Diffstat (limited to 'include')
-rw-r--r--include/drivers/uart.h9
-rw-r--r--include/drivers/uart_color.h7
-rw-r--r--include/fs/fat32.h10
-rw-r--r--include/fs/file.h39
-rw-r--r--include/fs/fs.h4
-rw-r--r--include/kernel/proc.h2
-rw-r--r--include/kernel/proc_def.h1
-rw-r--r--include/kernel/sbi.h24
-rw-r--r--include/kernel/syscall.h49
-rw-r--r--include/kernel/timer.h5
-rw-r--r--include/user/user.h1
11 files changed, 116 insertions, 35 deletions
diff --git a/include/drivers/uart.h b/include/drivers/uart.h
index 26c2394..85b04b0 100644
--- a/include/drivers/uart.h
+++ b/include/drivers/uart.h
@@ -1,5 +1,6 @@
#pragma once
#include "common/types.h"
+#include "drivers/uart_color.h"
#define UART0 0x10000000L
#define RHR 0 // Receive Holding Register (read mode)
@@ -15,14 +16,6 @@
#define UART_RX_BUF_SIZE 128
-// ANSI Escape Codes for Modern Terminal Colors
-#define ANSI_RESET "\033[0m"
-#define ANSI_RED "\033[31m"
-#define ANSI_GREEN "\033[32m"
-#define ANSI_YELLOW "\033[33m"
-#define ANSI_BLUE "\033[34m"
-#define ANSI_CLEAR "\033[2J\033[1;1H"
-
namespace Drivers
{
void uart_init();
diff --git a/include/drivers/uart_color.h b/include/drivers/uart_color.h
new file mode 100644
index 0000000..a63d57a
--- /dev/null
+++ b/include/drivers/uart_color.h
@@ -0,0 +1,7 @@
+// ANSI Escape Codes for Modern Terminal Colors
+#define ANSI_RESET "\033[0m"
+#define ANSI_RED "\033[31m"
+#define ANSI_GREEN "\033[32m"
+#define ANSI_YELLOW "\033[33m"
+#define ANSI_BLUE "\033[34m"
+#define ANSI_CLEAR "\033[2J\033[1;1H" \ No newline at end of file
diff --git a/include/fs/fat32.h b/include/fs/fat32.h
index c794bd7..1bd60ef 100644
--- a/include/fs/fat32.h
+++ b/include/fs/fat32.h
@@ -74,6 +74,8 @@ public:
uint32 first_clus; // The starting cluster number of the file
uint32 parent_clus; // Starting cluster number of the parent directory
uint32 dir_offset; // The byte offset of this directory entry in the parent directory
+ uint32 ent_sec; // Sector number of the directory entry
+ uint32 ent_off; // Offset of the directory entry within the sector
FAT32Inode() : fs(nullptr), first_clus(0) {}
// Implement VFS Interface
@@ -83,6 +85,7 @@ public:
Inode *lookup(const char *name) override;
Inode *create(const char *name, short type, short major, short minor) override;
void truncate() override;
+ int unlink(const char *name) override;
};
class FAT32FileSystem : public FileSystem
@@ -93,17 +96,20 @@ public:
uint32 root_cluster;
uint32 sectors_per_cluster;
uint32 bytes_per_cluster;
+ uint32 fat_sz; // Size of the FAT table (number of sectors)
void init() override;
Inode* root() override;
// Helper functions
- uint32 next_cluster(uint32 cluster); // Check the FAT table for the next cluster
- uint32 alloc_cluster(); // Assign a new cluster
+ uint32 next_cluster(uint32 cluster); // Check the FAT table for the next cluster
+ uint32 alloc_cluster(); // Assign a new cluster
uint32 cluster_to_sector(uint32 cluster);
// directory entry parsing
void read_dir_ent(struct FAT32_DirEnt *de, char *filename);
+ // Release the entire cluster chain starting from the cluster
+ void free_cluster_chain(uint32 cluster);
};
extern FAT32FileSystem fat32_fs;
diff --git a/include/fs/file.h b/include/fs/file.h
index 2f23176..a92d8f8 100644
--- a/include/fs/file.h
+++ b/include/fs/file.h
@@ -10,6 +10,8 @@ enum FileType
FD_PIPE
};
+class Pipe;
+
struct file
{
enum FileType type;
@@ -17,11 +19,46 @@ struct file
char readable;
char writable;
- struct pipe *pipe; // pipeline pointer
+ Pipe *pipe; // pipeline pointer
Inode *ip; // VFS Inode
uint32 off; // Current Offset
};
+class Pipe
+{
+public:
+ static constexpr uint32_t SIZE = 512;
+
+ Pipe() : nread(0), nwrite(0), read_open(true), write_open(true)
+ {
+ lock.init("pipe");
+ }
+
+ // forbid copy
+ Pipe(const Pipe &) = delete;
+ Pipe &operator=(const Pipe &) = delete;
+
+ ~Pipe()
+ {
+ //
+ }
+
+ // creates a pair of connected file objects
+ static int create_pair(struct file **f0, struct file **f1);
+
+ int read(uint64_t addr, int n);
+ int write(uint64_t addr, int n);
+ void close(bool is_writer);
+
+private:
+ Spinlock lock;
+ char data[SIZE];
+ uint32_t nread; // read
+ uint32_t nwrite; // write
+ bool read_open;
+ bool write_open;
+};
+
namespace FileTable
{
void init();
diff --git a/include/fs/fs.h b/include/fs/fs.h
index f40bc0c..235ec80 100644
--- a/include/fs/fs.h
+++ b/include/fs/fs.h
@@ -57,6 +57,8 @@ public:
virtual void getattr(struct kstat *st);
// Truncate file (set size to 0, release all data blocks)
virtual void truncate() = 0;
+ // Delete the file named 'name' from the directory (Unlink)
+ virtual int unlink(const char *name) = 0;
};
// File System Abstraction (SuperBlock)
@@ -90,4 +92,6 @@ namespace VFS
Inode *get_root();
// Path Analysis
Inode *namei(const char *path);
+ // Find the parent directory inode of the path, and copy the last part of the path (the file name) into the name buffer
+ Inode *nameiparent(const char *path, char *name);
} // namespace VFS
diff --git a/include/kernel/proc.h b/include/kernel/proc.h
index cbf2902..c740d53 100644
--- a/include/kernel/proc.h
+++ b/include/kernel/proc.h
@@ -19,6 +19,8 @@ namespace ProcManager
void wakeup(void *chan);
int growproc(int n);
+
+ int kill(int pid);
}
void forkret();
diff --git a/include/kernel/proc_def.h b/include/kernel/proc_def.h
index 5ce4c03..c671f8d 100644
--- a/include/kernel/proc_def.h
+++ b/include/kernel/proc_def.h
@@ -53,6 +53,7 @@ struct Proc
struct Proc *parent;
void *chan;
int xstate;
+ int killed;
Inode *cwd;
struct file *ofile[NOFILE];
diff --git a/include/kernel/sbi.h b/include/kernel/sbi.h
new file mode 100644
index 0000000..ec262ee
--- /dev/null
+++ b/include/kernel/sbi.h
@@ -0,0 +1,24 @@
+#pragma once
+#include "common/types.h"
+
+// SBI Extension IDs
+#define SBI_EID_SRST 0x53525354
+
+// SBI Function IDs for SRST
+#define SBI_FID_SRST_RESET 0
+
+// Reset Types
+#define SBI_SRST_TYPE_SHUTDOWN 0
+#define SBI_SRST_TYPE_COLD_REBOOT 1
+#define SBI_SRST_TYPE_WARM_REBOOT 2
+
+// Reset Reasons
+#define SBI_SRST_REASON_NONE 0
+#define SBI_SRST_REASON_SYSTEM_FAILURE 1
+
+namespace SBI
+{
+ void set_timer(uint64 stime_value);
+ void sbi_shutdown();
+ void sbi_reboot();
+} // namespace SBI
diff --git a/include/kernel/syscall.h b/include/kernel/syscall.h
index c0c9082..348fd63 100644
--- a/include/kernel/syscall.h
+++ b/include/kernel/syscall.h
@@ -1,29 +1,30 @@
#pragma once
-#define SYS_putc 1
-#define SYS_fork 2
-#define SYS_exit 3
-#define SYS_wait 4
-#define SYS_pipe 5
-#define SYS_read 6
-#define SYS_kill 7
-#define SYS_exec 8
-#define SYS_fstat 9
-#define SYS_chdir 10
-#define SYS_dup 11
-#define SYS_getpid 12
-#define SYS_sbrk 13
-#define SYS_sleep 14
-#define SYS_uptime 15
-#define SYS_open 16
-#define SYS_write 17
-#define SYS_mknod 18
-#define SYS_unlink 19
-#define SYS_link 20
-#define SYS_mkdir 21
-#define SYS_close 22
-#define SYS_disk_test 23
-#define SYS_lseek 24
+#define SYS_putc 1
+#define SYS_fork 2
+#define SYS_exit 3
+#define SYS_wait 4
+#define SYS_pipe 5
+#define SYS_read 6
+#define SYS_kill 7
+#define SYS_exec 8
+#define SYS_fstat 9
+#define SYS_chdir 10
+#define SYS_dup 11
+#define SYS_getpid 12
+#define SYS_sbrk 13
+#define SYS_sleep 14
+#define SYS_uptime 15
+#define SYS_open 16
+#define SYS_write 17
+#define SYS_mknod 18
+#define SYS_unlink 19
+#define SYS_link 20
+#define SYS_mkdir 21
+#define SYS_close 22
+#define SYS_disk_test 23
+#define SYS_lseek 24
+#define SYS_shutdown 25
#ifndef __ASSEMBLER__
void syscall();
diff --git a/include/kernel/timer.h b/include/kernel/timer.h
index c35e874..193c47d 100644
--- a/include/kernel/timer.h
+++ b/include/kernel/timer.h
@@ -4,4 +4,9 @@ namespace Timer{
uint64 get_time();
void set_next_trigger();
void init();
+
+ void tick();
+ uint64 get_ticks();
+ Spinlock *get_lock();
+ void *get_tick_chan();
} \ No newline at end of file
diff --git a/include/user/user.h b/include/user/user.h
index 7624a21..345f8be 100644
--- a/include/user/user.h
+++ b/include/user/user.h
@@ -23,6 +23,7 @@ extern "C" {
char *sbrk(int n);
int sleep(int ticks);
int uptime();
+ int shutdown();
// Debug
void putc(char c);