# CLeonOS Stage21 ## Stage Goal - Add writable runtime filesystem capability without touching ELF execution path. - Restrict write operations to `/temp` to keep system area read-only. - Extend kernel shell with practical file/dir operations for daily debugging. ## What Was Implemented - New writable VFS APIs: - `clks_fs_mkdir(const char *path)` - `clks_fs_write_all(const char *path, const void *data, u64 size)` - `clks_fs_append(const char *path, const void *data, u64 size)` - `clks_fs_remove(const char *path)` - Write guard policy: - Only `/temp` subtree is writable. - `/system`, `/shell`, `/driver` remain read-only. - Non-empty directory delete is rejected. - Runtime file payload management: - Dynamically written file data uses kernel heap. - Overwrite/append paths release previous heap-backed payload safely. - Kernel shell command expansion: - `pwd` - `cd [dir]` - `mkdir ` - `touch ` - `write ` - `append ` - `rm ` - Shell path handling upgraded: - relative path support - `.` and `..` handling - shell-maintained current working directory ## Acceptance Criteria - Boot completes and kernel shell is interactive. - `help` output includes new file commands. - Writable flow under `/temp` works: - create dir - create file - write and append text - read with `cat` - remove file/empty dir - Write operation outside `/temp` fails with safe message. - No regression in scheduler/service/syscall/interrupt initialization logs. ## Suggested Validation Script (Manual) - `pwd` - `cd /temp` - `mkdir demo` - `cd demo` - `touch a.txt` - `write a.txt hello` - `append a.txt _world` - `cat a.txt` (expect `hello_world`) - `cd /` - `write /system/x.txt bad` (expect failure) - `rm /temp/demo/a.txt` - `rm /temp/demo` ## Build Targets - `make setup` - `make userapps` - `make iso` - `make run` - `make debug` ## QEMU Command - `qemu-system-x86_64 -M q35 -m 1024M -cdrom build/CLeonOS-x86_64.iso -serial stdio` ## Common Bugs and Debugging - `mkdir/write/touch` always fails: - Confirm target path resolves under `/temp`. - Use `pwd` and absolute paths to verify current directory. - `rm` fails for directory: - Stage21 only allows removing empty directories. - `cat` prints truncated data: - Current shell output keeps bounded preview buffer by design. - Unexpected write behavior after repeated overwrite: - Check heap stats and ensure no panic; Stage21 releases old heap payload before replacing.