diff options
| author | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
| commit | 52dab7fc85d877e80e3032f0afabae906adebad8 (patch) | |
| tree | b6d56299b839413bb77b1b8c8fa9f7a682124a05 /kernel/vfs.rv | |
| parent | a8a35a00a3c3c57cfbef2311d0348376c2e83208 (diff) | |
feat: fs tree and free list alloc
Diffstat (limited to 'kernel/vfs.rv')
| -rw-r--r-- | kernel/vfs.rv | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/kernel/vfs.rv b/kernel/vfs.rv new file mode 100644 index 0000000..5d2d1de --- /dev/null +++ b/kernel/vfs.rv @@ -0,0 +1,57 @@ +# shitty vfs implementation +# proc and /bin arent on disk, theyre completely virtual + +const TASK_STATES = { "free", "ready", "dead", "blocked" } + +fn vfs_owns(path) do + if path == "/proc" or path:starts_with?("/proc/") return :true + if path == "/bin" or path:starts_with?("/bin/") return :true + return :false +end + +fn parse_pid(s) do + if s:len() == 0 return -1 + let n = 0 + for i in 0..s:len() do + const c = s[i]:ascii() + if c < 48 or c > 57 return -1 + n = n * 10 + (c - 48) + end + return n +end + +fn vfs_ls(path) do + if path == "/proc" do + puts(" uptime\n meminfo\n") + for i in 0..task_max() do + if task_state(i) != 0 puts(" #{i}\n") + end + end + else if path == "/bin" do + for i in 0..prog_count() do puts(" #{prog_name(i)}\n") end + end + else do puts("ls: #{path}: no such directory\n") end +end + +fn vfs_cat(path) do + if path == "/proc/uptime" do puts("#{math.floor(uptime() / 100)}s\n") return :nil end + if path == "/proc/meminfo" do puts("#{(mem_free() shr 20)} MiB free / #{(mem_total() shr 20)} MiB total\n") return :nil end + if path:starts_with?("/proc/") do + const pid = parse_pid(path[6..]) + if pid >= 0 and pid < task_max() and task_state(pid) != 0 do + puts("pid #{pid}: #{TASK_STATES[task_state(pid)]}\n") + return :nil + end + puts("cat: #{path}: no such file\n") + return :nil + end + if path:starts_with?("/bin/") do + const nm = path[5..] + for i in 0..prog_count() do + if prog_name(i) == nm do puts("#{nm}: elf program, #{prog_size(i)} bytes\n") return :nil end + end + puts("cat: #{path}: no such file\n") + return :nil + end + puts("cat: #{path}: no such file\n") +end |
