Add sysfs VFS driver, SYS_OPEN/CLOSE syscalls, cat app

Sysfs:
- New VFS driver mounted at /sys that lets kernel drivers expose
  virtual text files via namespace registration
- Drivers call sysfs_register(name, ops, ctx) with list/read/write
  callbacks for their namespace
- IDE driver registers 'ide' namespace exposing per-device attributes:
  model, type, channel, drive, sectors, sector_size
- Tested: ls /sys -> ide, ls /sys/ide -> hdd1 cd1,
  cat /sys/ide/hdd1/model -> QEMU HARDDISK

Syscalls:
- Added SYS_OPEN (11) and SYS_CLOSE (12) for file I/O from userspace
- Extended SYS_READ/SYS_WRITE to handle VFS file descriptors (fd >= 3)
- Updated userspace syscalls.h with open()/close() wrappers

Apps:
- New 'cat' app: reads and displays file contents via open/read/close
- Updated 'ls' to accept path argument via ARG1 env var
- Updated shell to pass ARG1 env var to external commands
This commit is contained in:
AI
2026-02-23 14:26:52 +00:00
parent d064e67a8f
commit d1bf69ce0d
12 changed files with 729 additions and 10 deletions

View File

@@ -105,7 +105,7 @@ static void builtin_help(void) {
}
/** Execute an external command via fork+exec. */
static void run_command(const char *cmd) {
static void run_command(const char *cmd, const char *arg) {
int32_t pid = fork();
if (pid < 0) {
puts("sh: fork failed\n");
@@ -113,7 +113,14 @@ static void run_command(const char *cmd) {
}
if (pid == 0) {
/* Child: exec the command */
/* Child: set ARG1 if there's an argument */
if (arg && *arg) {
setenv("ARG1", arg);
} else {
setenv("ARG1", "");
}
/* exec the command */
int32_t ret = exec(cmd);
if (ret < 0) {
puts("sh: ");
@@ -172,7 +179,7 @@ int main(void) {
builtin_help();
} else {
/* External command */
run_command(line);
run_command(line, arg);
}
}