]> Zhao Yanbai Git Server - kernel.git/commitdiff
完善sysc_open sysc_read sysc_write
authoracevest <zhaoyanbai@126.com>
Mon, 14 Oct 2024 13:28:09 +0000 (21:28 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 14 Oct 2024 13:28:09 +0000 (21:28 +0800)
fs/file.c
fs/fs.c
fs/open.c
fs/ramfs.c
fs/read.c
fs/vfs.h
fs/write.c
kernel/task_init.c

index dd032062123ff036ea00863528e1a91b77a1141d..779a11d15fb569bc1a8155d3030e3ca0ce11b4a3 100644 (file)
--- a/fs/file.c
+++ b/fs/file.c
@@ -117,3 +117,46 @@ void vfs_page_cache_init() {
     assert(page_hash_table != NULL);
     memset(page_hash_table, 0, PAGE_SIZE);
 }
+
+///
+#define MAX_FILES 1024
+static file_t g_files[MAX_FILES] = {
+    0,
+};
+
+void init_file(file_t *fp) {
+    fp->f_dentry = NULL;
+    fp->f_flags = 0;
+    fp->f_ops = NULL;
+    fp->f_pos = 0;
+
+    fp->f_state = 0;
+}
+
+void init_files() {
+    for (int i = 0; i < MAX_FILES; i++) {
+        init_file(g_files + i);
+    }
+}
+
+file_t *get_empty_filp() {
+    file_t *fp = NULL;
+
+    for (int i = 0; i < MAX_FILES; i++) {
+        file_t *p = g_files + i;
+        if (p->f_state == 0) {
+            ENTER_CRITICAL_ZONE(EFLAGS);
+
+            if (p->f_state == 0) {
+                p->f_state = 1;
+                fp = p;
+                EXIT_CRITICAL_ZONE(EFLAGS);
+                break;
+            }
+
+            EXIT_CRITICAL_ZONE(EFLAGS);
+        }
+    }
+
+    return fp;
+}
diff --git a/fs/fs.c b/fs/fs.c
index 9125c99a69fbe3af85dd698c771869b39d574094..b9bbe974d9901209a4bbbb37fac18d6e80e8de9a 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -42,6 +42,9 @@ dentry_t rootfs_root_dentry;
 void setup_fs() {
     // ext2_setup_fs();
 
+    void init_files();
+    init_files();
+
     void vfs_page_cache_init();
     vfs_page_cache_init();
 
index 86f941703933354b239321f677ea59bf7505c8b4..bf92c7334e57690ff93bf0e96e087a99b484a757 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -32,10 +32,30 @@ int get_unused_fd() {
     return -EMFILE;
 }
 
-file_t *filp_open(const char *path, int flags, int mode) {
+int filp_open(const char *path, int flags, int mode, file_t **fp) {
     int ret = 0;
 
-    return NULL;
+    assert(path != NULL);
+
+    *fp = get_empty_filp();
+    if (*fp == NULL) {
+        return -ENFILE;
+    }
+
+    namei_t ni;
+    path_open_namei(path, flags, mode, &ni);
+
+    (*fp)->f_dentry = ni.path.dentry;
+    (*fp)->f_flags = flags;
+    (*fp)->f_ops = (*fp)->f_dentry->d_inode->i_fops;
+    (*fp)->f_pos = 0;
+
+    assert((*fp)->f_ops != NULL);
+
+    // TODO: 添加open支持
+    assert((*fp)->f_ops->open == NULL);
+
+    return ret;
 }
 
 int sysc_open(const char *path, int flags, int mode) {
@@ -47,9 +67,14 @@ int sysc_open(const char *path, int flags, int mode) {
         return fd;
     }
 
-    file_t *fp = filp_open(path, flags, mode);
+    file_t *fp;
+
+    int ret = filp_open(path, flags, mode, &fp);
+    if (ret != 0) {
+        return ret;
+    }
 
     current->files.fds[fd] = fp;
 
-    return 0;
+    return fd;
 }
index 557fa9b9714ba01f92393368bae2f6fafeba5ec4..d58471b5873182fc91b4a4d3605f0b444372b01e 100644 (file)
@@ -41,7 +41,7 @@ inode_t *ramfs_get_inode(superblock_t *sb, umode_t mode, dev_t dev);
 // }
 
 static const file_operations_t ramfs_file_operations = {
-    .read = 0,
+    .read = vfs_generic_file_read,
     .write = vfs_generic_file_write,
 };
 
index 6d3e071a8c9cc6846ac1185425b7576885826ddc..4f7da19fbf89591e1bdc43f6971e25a9de042704 100644 (file)
--- a/fs/read.c
+++ b/fs/read.c
@@ -61,7 +61,7 @@ ssize_t vfs_generic_file_read(file_t *file, char *buf, size_t size, loff_t *p_po
         void *addr = page2va(page);
         // printk("memcpy bytes %u index %u\n", bytes, index);
         // printk("read addr %x bytes %u index %u offset %u\n", addr, bytes, index, offset);
-        memcpy(buf, addr, bytes);
+        memcpy(buf, addr + offset, bytes);
 
         buf += bytes;
         offset += bytes;
@@ -122,6 +122,8 @@ ssize_t sysc_read(int fd, void *buf, size_t count) {
     read = file->f_ops->read;
 
     loff_t pos = file->f_pos;
+    pos = 0;  // TODO add sysc_seek
+    // printk("%s  pos %lu\n", file->f_dentry->d_inline_name, pos);
     ret = read(file, buf, count, &pos);
 
     return ret;
index 712820f29c3a584977fbbd9fcd98c79330f2fc8f..effc7c2f020f220cfd171e9fec452b888db8d486 100644 (file)
--- a/fs/vfs.h
+++ b/fs/vfs.h
@@ -73,6 +73,8 @@ struct file {
 
     loff_t f_pos;
     uint32_t f_flags;
+
+    int f_state;  // 0 EMPTY 1 USED
 };
 
 // super block
@@ -323,3 +325,6 @@ int path_open_namei(const char *path, int flags, int mode, namei_t *ni);
 //
 ssize_t vfs_generic_file_read(file_t *file, char *buf, size_t size, loff_t *p_pos);
 ssize_t vfs_generic_file_write(file_t *file, const char *buf, size_t size, loff_t *p_pos);
+
+// file
+file_t *get_empty_filp();
index d3e70f11b39b2ee53e065f757833692b212461a3..1271fceb97a3f1be08442a5e7c1d8ada33e9f081 100644 (file)
@@ -68,7 +68,7 @@ ssize_t vfs_generic_file_write(file_t *file, const char *buf, size_t size, loff_
         // ...
 
         // 写入page
-        memcpy(addr, buf + pos, bytes);
+        memcpy(addr + offset, buf + pos, bytes);
         // printk("write addr %x bytes %u index %u offset %u\n", addr, bytes, index, offset);
 
         // TODO
index f5abc7ddffb4d0040bc25050d0774f1387eeddca..1bc234ec58fa9ec31df9d0aaa54e4a95d0931398 100644 (file)
@@ -241,12 +241,24 @@ void init_rootfs() {
         printk("\n");
 
         {
+            // TODO支持带多层目录的fe_name
+
             namei_t ni;
             const char *path = fe_name;
             const int flags = O_CREAT | O_APPEND;
+#define bufsz 5223
+            static char buf[bufsz] = {'b', 'u', 'f'};
+#if 1
+            int sysc_open(const char *path, int flags, int mode);
+            int fd = sysc_open(path, flags, 0700);
+            assert(fd >= 0);
 
-            // TODO支持带多层目录的fe_name
+            ssize_t sysc_write(int fd, const char *buf, size_t size);
+            sysc_write(fd, fc, fe_filesz);
 
+            ssize_t sysc_read(int fd, void *buf, size_t count);
+            sysc_read(fd, buf, bufsz);
+#else
             path_open_namei(path, flags, S_IFREG, &ni);
 
             file_t file;
@@ -259,9 +271,9 @@ void init_rootfs() {
             vfs_generic_file_write(&file, fc, fe_filesz, &file.f_pos);
 
             file.f_pos = 0;
-#define bufsz 5223
-            static char buf[bufsz] = {'b', 'u', 'f'};
+
             vfs_generic_file_read(&file, buf, bufsz, &file.f_pos);
+#endif
             for (int i = 0; i < bufsz; i++) {
                 printk("%c", buf[i]);
             }