From d3cf3f08d1343d6b265516d5a79ce2d197b59d26 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sun, 4 Jan 2026 14:05:49 +0800 Subject: feat(file-system): implement read and write FAT32 File System and basic shell --- include/drivers/uart.h | 9 +------- include/drivers/uart_color.h | 7 +++++++ include/fs/fat32.h | 10 +++++++-- include/fs/file.h | 39 ++++++++++++++++++++++++++++++++++- include/fs/fs.h | 4 ++++ include/kernel/proc.h | 2 ++ include/kernel/proc_def.h | 1 + include/kernel/sbi.h | 24 ++++++++++++++++++++++ include/kernel/syscall.h | 49 ++++++++++++++++++++++---------------------- include/kernel/timer.h | 5 +++++ include/user/user.h | 1 + 11 files changed, 116 insertions(+), 35 deletions(-) create mode 100644 include/drivers/uart_color.h create mode 100644 include/kernel/sbi.h (limited to 'include') 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); -- cgit v1.2.3