This commit is contained in:
2026-04-18 18:03:52 +08:00
parent 97a65b3580
commit 8803d5a5d4
15 changed files with 138 additions and 5 deletions

View File

@@ -55,6 +55,9 @@ enum clks_exec_fd_kind {
CLKS_EXEC_FD_KIND_NONE = 0,
CLKS_EXEC_FD_KIND_TTY = 1,
CLKS_EXEC_FD_KIND_FILE = 2,
CLKS_EXEC_FD_KIND_DEV_NULL = 3,
CLKS_EXEC_FD_KIND_DEV_ZERO = 4,
CLKS_EXEC_FD_KIND_DEV_RANDOM = 5,
};
enum clks_exec_proc_state {
@@ -159,6 +162,7 @@ static u64 clks_exec_requests = 0ULL;
static u64 clks_exec_success = 0ULL;
static u32 clks_exec_running_depth = 0U;
static clks_bool clks_exec_pending_dispatch_active = CLKS_FALSE;
static u64 clks_exec_random_state = 0xA5A55A5A12345678ULL;
static struct clks_exec_proc_record clks_exec_proc_table[CLKS_EXEC_MAX_PROCS];
static u64 clks_exec_next_pid = 1ULL;
@@ -800,6 +804,34 @@ static clks_bool clks_exec_path_is_dev_tty(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/dev/tty") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_exec_path_is_dev_null(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/dev/null") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_exec_path_is_dev_zero(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/dev/zero") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_exec_path_is_dev_random(const char *path) {
if (path == CLKS_NULL) {
return CLKS_FALSE;
}
if (clks_strcmp(path, "/dev/random") == 0) {
return CLKS_TRUE;
}
return (clks_strcmp(path, "/dev/urandom") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static u8 clks_exec_random_next_byte(void) {
clks_exec_random_state ^= (clks_interrupts_timer_ticks() + 0x9E3779B97F4A7C15ULL);
clks_exec_random_state ^= (clks_exec_random_state << 13);
clks_exec_random_state ^= (clks_exec_random_state >> 7);
clks_exec_random_state ^= (clks_exec_random_state << 17);
return (u8)(clks_exec_random_state & 0xFFULL);
}
static void clks_exec_fd_init_defaults(struct clks_exec_proc_record *proc) {
if (proc == CLKS_NULL) {
return;
@@ -1457,6 +1489,7 @@ void clks_exec_init(void) {
clks_exec_success = 0ULL;
clks_exec_running_depth = 0U;
clks_exec_pending_dispatch_active = CLKS_FALSE;
clks_exec_random_state = 0xA5A55A5A12345678ULL;
clks_exec_next_pid = 1ULL;
clks_exec_pid_stack_depth = 0U;
clks_memset(clks_exec_pid_stack, 0, sizeof(clks_exec_pid_stack));
@@ -1647,6 +1680,29 @@ u64 clks_exec_fd_open(const char *path, u64 flags, u64 mode) {
return (u64)fd_slot;
}
if (clks_exec_path_is_dev_null(path) == CLKS_TRUE ||
clks_exec_path_is_dev_zero(path) == CLKS_TRUE ||
clks_exec_path_is_dev_random(path) == CLKS_TRUE) {
struct clks_exec_fd_entry *entry = &proc->fds[(u32)fd_slot];
clks_memset(entry, 0, sizeof(*entry));
entry->used = CLKS_TRUE;
entry->flags = flags;
entry->offset = 0ULL;
entry->tty_index = proc->tty_index;
entry->path[0] = '\0';
if (clks_exec_path_is_dev_null(path) == CLKS_TRUE) {
entry->kind = CLKS_EXEC_FD_KIND_DEV_NULL;
} else if (clks_exec_path_is_dev_zero(path) == CLKS_TRUE) {
entry->kind = CLKS_EXEC_FD_KIND_DEV_ZERO;
} else {
entry->kind = CLKS_EXEC_FD_KIND_DEV_RANDOM;
}
return (u64)fd_slot;
}
if (clks_fs_stat(path, &info) == CLKS_FALSE) {
if ((flags & CLKS_EXEC_O_CREAT) == 0ULL || clks_exec_fd_can_write(flags) == CLKS_FALSE) {
return (u64)-1;
@@ -1722,6 +1778,28 @@ u64 clks_exec_fd_read(u64 fd, void *out_buffer, u64 size) {
return count;
}
if (entry->kind == CLKS_EXEC_FD_KIND_DEV_NULL) {
return 0ULL;
}
if (entry->kind == CLKS_EXEC_FD_KIND_DEV_ZERO) {
clks_memset(out_buffer, 0, (usize)size);
entry->offset += size;
return size;
}
if (entry->kind == CLKS_EXEC_FD_KIND_DEV_RANDOM) {
u8 *dst = (u8 *)out_buffer;
u64 i;
for (i = 0ULL; i < size; i++) {
dst[(usize)i] = clks_exec_random_next_byte();
}
entry->offset += size;
return size;
}
if (entry->kind == CLKS_EXEC_FD_KIND_FILE) {
return clks_exec_fd_file_read(entry, out_buffer, size);
}
@@ -1756,6 +1834,13 @@ u64 clks_exec_fd_write(u64 fd, const void *buffer, u64 size) {
return size;
}
if (entry->kind == CLKS_EXEC_FD_KIND_DEV_NULL ||
entry->kind == CLKS_EXEC_FD_KIND_DEV_ZERO ||
entry->kind == CLKS_EXEC_FD_KIND_DEV_RANDOM) {
entry->offset += size;
return size;
}
if (entry->kind == CLKS_EXEC_FD_KIND_FILE) {
return clks_exec_fd_file_write(entry, buffer, size);
}

View File

@@ -535,8 +535,12 @@ void clks_fs_init(void) {
return;
}
if (clks_fs_require_directory("/dev") == CLKS_FALSE) {
return;
}
clks_fs_ready = CLKS_TRUE;
clks_log(CLKS_LOG_INFO, "FS", "LAYOUT /SYSTEM /SHELL /TEMP /DRIVER OK");
clks_log(CLKS_LOG_INFO, "FS", "LAYOUT /SYSTEM /SHELL /TEMP /DRIVER /DEV OK");
}
clks_bool clks_fs_is_ready(void) {
@@ -915,4 +919,4 @@ u64 clks_fs_node_count(void) {
}
return used;
}
}

View File

@@ -1173,6 +1173,7 @@ static clks_bool clks_shell_cmd_fsstat(void) {
clks_shell_print_kv_hex(" SHELL_CHILDREN", clks_fs_count_children("/shell"));
clks_shell_print_kv_hex(" TEMP_CHILDREN", clks_fs_count_children("/temp"));
clks_shell_print_kv_hex(" DRIVER_CHILDREN", clks_fs_count_children("/driver"));
clks_shell_print_kv_hex(" DEV_CHILDREN", clks_fs_count_children("/dev"));
return CLKS_TRUE;
}

View File

@@ -279,6 +279,20 @@ static clks_bool clks_syscall_procfs_is_root(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/proc") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_syscall_fs_is_root(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_syscall_fs_has_real_proc_dir(void) {
struct clks_fs_node_info info;
if (clks_fs_stat("/proc", &info) == CLKS_FALSE) {
return CLKS_FALSE;
}
return (info.type == CLKS_FS_NODE_DIR) ? CLKS_TRUE : CLKS_FALSE;
}
static clks_bool clks_syscall_procfs_is_self(const char *path) {
return (path != CLKS_NULL && clks_strcmp(path, "/proc/self") == 0) ? CLKS_TRUE : CLKS_FALSE;
}
@@ -1059,6 +1073,7 @@ static clks_bool clks_syscall_procfs_render_file(const char *path,
static u64 clks_syscall_fs_child_count(u64 arg0) {
char path[CLKS_SYSCALL_PATH_MAX];
u64 base_count;
if (clks_syscall_copy_user_string(arg0, path, sizeof(path)) == CLKS_FALSE) {
return (u64)-1;
@@ -1068,7 +1083,17 @@ static u64 clks_syscall_fs_child_count(u64 arg0) {
return 2ULL + clks_exec_proc_count();
}
return clks_fs_count_children(path);
base_count = clks_fs_count_children(path);
if (base_count == (u64)-1) {
return (u64)-1;
}
if (clks_syscall_fs_is_root(path) == CLKS_TRUE && clks_syscall_fs_has_real_proc_dir() == CLKS_FALSE) {
return base_count + 1ULL;
}
return base_count;
}
static u64 clks_syscall_fs_get_child_name(u64 arg0, u64 arg1, u64 arg2) {
@@ -1117,6 +1142,20 @@ static u64 clks_syscall_fs_get_child_name(u64 arg0, u64 arg1, u64 arg2) {
}
}
if (clks_syscall_fs_is_root(path) == CLKS_TRUE && clks_syscall_fs_has_real_proc_dir() == CLKS_FALSE) {
if (arg1 == 0ULL) {
clks_memset((void *)arg2, 0, CLKS_SYSCALL_NAME_MAX);
clks_memcpy((void *)arg2, "proc", 5U);
return 1ULL;
}
if (clks_fs_get_child_name(path, arg1 - 1ULL, (char *)arg2, (usize)CLKS_SYSCALL_NAME_MAX) == CLKS_FALSE) {
return 0ULL;
}
return 1ULL;
}
if (clks_fs_get_child_name(path, arg1, (char *)arg2, (usize)CLKS_SYSCALL_NAME_MAX) == CLKS_FALSE) {
return 0ULL;
}