From 3622277143967b6ca715a7d4c74784e2fce800f5 Mon Sep 17 00:00:00 2001 From: xu_zh <xuzhihao20@mails.ucas.ac.cn> Date: Sat, 6 May 2023 17:23:16 +0800 Subject: [PATCH 1/3] feat: fs_get_root --- kernel/fs/fat32/fs.cpp | 4 ++++ kernel/fs/fs.cpp | 4 ++++ kernel/include/fs.h | 1 + kernel/include/fs/fat32.h | 1 + 4 files changed, 10 insertions(+) diff --git a/kernel/fs/fat32/fs.cpp b/kernel/fs/fat32/fs.cpp index 27ec9e6d..dba8aa0d 100644 --- a/kernel/fs/fat32/fs.cpp +++ b/kernel/fs/fat32/fs.cpp @@ -145,6 +145,10 @@ bool init() { return true; } +fdesp_t get_root() { + return root_fd; +} + // NOTE: the return value / params / usage of this API is under consideration /* lookup file or directory in dir * param: in - cluster number of dir diff --git a/kernel/fs/fs.cpp b/kernel/fs/fs.cpp index 1abc99f1..8bae4a0a 100644 --- a/kernel/fs/fs.cpp +++ b/kernel/fs/fs.cpp @@ -12,6 +12,10 @@ void init_fs() { fmt::info(" SUCCESS\n"); } +fdesp_t fs_get_root() { + return FAT32::get_root(); +} + int fs_openat(int dirfd, const char *pathname, int flags) { return FAT32::openat(dirfd, pathname, flags); } diff --git a/kernel/include/fs.h b/kernel/include/fs.h index ef5c79f6..53316462 100644 --- a/kernel/include/fs.h +++ b/kernel/include/fs.h @@ -20,6 +20,7 @@ typedef FAT32::internal_dentry_t dentry_t; typedef FAT32::fdesp_t fdesp_t; void init_fs(); +fdesp_t fs_get_root(); int fs_openat(int dirfd, const char *pathname, int flags); int fs_open(const char *pathname, int flags); ssize_t fs_read(int fd, void *buf, size_t len); diff --git a/kernel/include/fs/fat32.h b/kernel/include/fs/fat32.h index 0b2f6f0b..c3703863 100644 --- a/kernel/include/fs/fat32.h +++ b/kernel/include/fs/fat32.h @@ -127,6 +127,7 @@ struct fdesp_t { }; bool init(); +fdesp_t get_root(); internal_dentry_t lookup(internal_dentry_t dir, const char *name); internal_dentry_t lookup(const char *name); int openat(int dirfd, const char *pathname, int flags); -- GitLab From 50b0f2c37d97d3228886b9b5762ad8659c39bbd3 Mon Sep 17 00:00:00 2001 From: xu_zh <xuzhihao20@mails.ucas.ac.cn> Date: Sat, 6 May 2023 17:25:45 +0800 Subject: [PATCH 2/3] feat: fd allocator --- kernel/fs/fat32/fs.cpp | 6 +++--- kernel/include/sched.h | 3 ++- kernel/scheduler/sched.cpp | 9 +++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/kernel/fs/fat32/fs.cpp b/kernel/fs/fat32/fs.cpp index dba8aa0d..e0fd2789 100644 --- a/kernel/fs/fat32/fs.cpp +++ b/kernel/fs/fat32/fs.cpp @@ -76,7 +76,7 @@ char *namencat(char *dst, const uint16_t *src, size_t dstn, size_t srcn) { fdesp_t *get_fdesp(int fd, pcb_t *pcb) { if (fd == AT_FDCWD) - return pcb->cwd; + return &pcb->cwd; for (auto it : pcb->fd_list) { if (it->idx == fd) return it; @@ -227,10 +227,10 @@ int openat(int dirfd, const char *pathname, int flags) { } fdesp_t *new_fd = fdesp_allocator.create(); new_fd->dentry = new_entry; - new_fd->idx = 4; // FIXME + new_fd->idx = pcb->nfd++; new_fd->offset = 0; pcb->fd_list.push_back(new_fd); - return 4; + return new_fd->idx; } ssize_t read(int fd, void *buf, size_t count) { diff --git a/kernel/include/sched.h b/kernel/include/sched.h index 693c9d36..00e5097c 100644 --- a/kernel/include/sched.h +++ b/kernel/include/sched.h @@ -32,7 +32,8 @@ struct pcb_t list::list <uintptr_t> memory_list; - fdesp_t *cwd; + fdesp_t cwd; + int nfd; // this count includes stdin/out/err, but they are not in fd_list list::list<fdesp_t *> fd_list; uint64_t wakeup_time; diff --git a/kernel/scheduler/sched.cpp b/kernel/scheduler/sched.cpp index 3f677619..0861ec77 100644 --- a/kernel/scheduler/sched.cpp +++ b/kernel/scheduler/sched.cpp @@ -79,12 +79,17 @@ void init_pcb(hartid_t hartid) { proc->kernel_sp = alloc_page(proc) + PAGE_SIZE; proc->user_sp = alloc_page(proc) + PAGE_SIZE; proc->status = RUNNING; + + // fs + proc->cwd = fs_get_root(); + proc->nfd = 3; } extern "C" void ret_from_interrupt(); pid_t exec(const char *name, int argc, char *const argv[]) { + pcb_t *pproc = get_current_proc(); pcb_t *proc = alloc_pcb(); proc->kernel_satp = make_satp(pa2ppn(reinterpret_cast<uint64_t>(kernel_pgdir))); proc->user_pgdir = reinterpret_cast<uintptr_t*>(alloc_page(proc)); @@ -150,6 +155,10 @@ pid_t exec(const char *name, int argc, char *const argv[]) proc->kernel_sp = reinterpret_cast<uint64_t> (kernel_stack); proc->user_sp = user_stack; + // fs + proc->cwd = pproc->cwd; + proc->nfd = 3; + return proc->pid; } -- GitLab From 07d4722de6e39fc8dd313d86b7b8a7727f47ea2b Mon Sep 17 00:00:00 2001 From: xu_zh <xuzhihao20@mails.ucas.ac.cn> Date: Sat, 6 May 2023 17:48:19 +0800 Subject: [PATCH 3/3] feat: init proc->cwd --- kernel/fs/fat32/fs.cpp | 6 +----- kernel/fs/fs.cpp | 4 ---- kernel/include/fs.h | 3 ++- kernel/include/fs/fat32.h | 1 - kernel/include/sched.h | 3 ++- kernel/main.cpp | 4 +++- kernel/scheduler/sched.cpp | 12 +++++++++--- 7 files changed, 17 insertions(+), 16 deletions(-) diff --git a/kernel/fs/fat32/fs.cpp b/kernel/fs/fat32/fs.cpp index e0fd2789..3da86e3f 100644 --- a/kernel/fs/fat32/fs.cpp +++ b/kernel/fs/fat32/fs.cpp @@ -76,7 +76,7 @@ char *namencat(char *dst, const uint16_t *src, size_t dstn, size_t srcn) { fdesp_t *get_fdesp(int fd, pcb_t *pcb) { if (fd == AT_FDCWD) - return &pcb->cwd; + fd = pcb->cwd; for (auto it : pcb->fd_list) { if (it->idx == fd) return it; @@ -145,10 +145,6 @@ bool init() { return true; } -fdesp_t get_root() { - return root_fd; -} - // NOTE: the return value / params / usage of this API is under consideration /* lookup file or directory in dir * param: in - cluster number of dir diff --git a/kernel/fs/fs.cpp b/kernel/fs/fs.cpp index 8bae4a0a..1abc99f1 100644 --- a/kernel/fs/fs.cpp +++ b/kernel/fs/fs.cpp @@ -12,10 +12,6 @@ void init_fs() { fmt::info(" SUCCESS\n"); } -fdesp_t fs_get_root() { - return FAT32::get_root(); -} - int fs_openat(int dirfd, const char *pathname, int flags) { return FAT32::openat(dirfd, pathname, flags); } diff --git a/kernel/include/fs.h b/kernel/include/fs.h index 53316462..92f08a33 100644 --- a/kernel/include/fs.h +++ b/kernel/include/fs.h @@ -15,12 +15,13 @@ #define AT_FDCWD -100 +#define RESV_FD 3 // stdin, stdout, stderr + // FIXME: replace these ? typedef FAT32::internal_dentry_t dentry_t; typedef FAT32::fdesp_t fdesp_t; void init_fs(); -fdesp_t fs_get_root(); int fs_openat(int dirfd, const char *pathname, int flags); int fs_open(const char *pathname, int flags); ssize_t fs_read(int fd, void *buf, size_t len); diff --git a/kernel/include/fs/fat32.h b/kernel/include/fs/fat32.h index c3703863..0b2f6f0b 100644 --- a/kernel/include/fs/fat32.h +++ b/kernel/include/fs/fat32.h @@ -127,7 +127,6 @@ struct fdesp_t { }; bool init(); -fdesp_t get_root(); internal_dentry_t lookup(internal_dentry_t dir, const char *name); internal_dentry_t lookup(const char *name); int openat(int dirfd, const char *pathname, int flags); diff --git a/kernel/include/sched.h b/kernel/include/sched.h index 00e5097c..6a3a704e 100644 --- a/kernel/include/sched.h +++ b/kernel/include/sched.h @@ -32,7 +32,7 @@ struct pcb_t list::list <uintptr_t> memory_list; - fdesp_t cwd; + int cwd; int nfd; // this count includes stdin/out/err, but they are not in fd_list list::list<fdesp_t *> fd_list; @@ -54,6 +54,7 @@ extern hart_t hart[NUM_HART]; void scheduler(); void init_pcb(hartid_t hart_id); +void init_pcb_cwd(); pid_t exec(const char *name, int argc, char *const argv[]); int kill(pid_t pid); void exit(); diff --git a/kernel/main.cpp b/kernel/main.cpp index e8fac6e3..7ece6460 100644 --- a/kernel/main.cpp +++ b/kernel/main.cpp @@ -38,8 +38,10 @@ int main() { init_fs(); + init_pcb_cwd(); + const char *argv[] = {"hello", "anything"}; - exec("/hello", 2, const_cast<char **>(argv)); + exec("hello", 2, const_cast<char **>(argv)); set_timer(); diff --git a/kernel/scheduler/sched.cpp b/kernel/scheduler/sched.cpp index 0861ec77..8618c608 100644 --- a/kernel/scheduler/sched.cpp +++ b/kernel/scheduler/sched.cpp @@ -81,8 +81,13 @@ void init_pcb(hartid_t hartid) { proc->status = RUNNING; // fs - proc->cwd = fs_get_root(); - proc->nfd = 3; + proc->nfd = RESV_FD; + // init_fs relies on init_pcb, so we can't use fs_open to init proc->cwd here +} + +void init_pcb_cwd() { + pcb_t *proc = get_current_proc(); + proc->cwd = fs_open("/", 0); } extern "C" void ret_from_interrupt(); @@ -156,8 +161,9 @@ pid_t exec(const char *name, int argc, char *const argv[]) proc->user_sp = user_stack; // fs + proc->nfd = pproc->nfd; proc->cwd = pproc->cwd; - proc->nfd = 3; + proc->fd_list = pproc->fd_list; return proc->pid; } -- GitLab