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