Browse Source

:bug: 修复了无法正确地往文件写入数据的bug

fslongjin 2 years ago
parent
commit
f99179014a

+ 5 - 3
kernel/common/glib.h

@@ -478,7 +478,8 @@ static inline uint64_t copy_from_user(void *dst, void *src, uint64_t size)
                  "rep   \n\t"
                  "movsb \n\t"
                  : "=&c"(size), "=&D"(tmp0), "=&S"(tmp1)
-                 : "r"(size & 7), "0"(size >> 3), "1"(dst), "2"(src));
+                 : "r"(size & 7), "0"(size >> 3), "1"(dst), "2"(src)
+                 : "memory");
     return size;
 }
 
@@ -506,7 +507,8 @@ static inline uint64_t copy_to_user(void *dst, void *src, uint64_t size)
                  "rep   \n\t"
                  "movsb \n\t"
                  : "=&c"(size), "=&D"(tmp0), "=&S"(tmp1)
-                 : "r"(size & 7), "0"(size >> 3), "1"(dst), "2"(src));
+                 : "r"(size & 7), "0"(size >> 3), "1"(dst), "2"(src)
+                 : "memory");
     return size;
 }
 
@@ -524,7 +526,7 @@ long strnlen_user(void *src, unsigned long maxlen)
     // 地址不合法
     if (!verify_area((uint64_t)src, size))
         return 0;
-    
+
     return size <= maxlen ? size : maxlen;
 }
 

+ 3 - 2
kernel/driver/disk/ahci/ahci.c

@@ -312,6 +312,7 @@ static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t
 static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t count,
                        uint64_t buf)
 {
+    kdebug("ahci write");
     port->is = 0xffff; // Clear pending interrupt bits
     int slot = ahci_find_cmdslot(port);
     if (slot == -1)
@@ -361,7 +362,7 @@ static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_
     port->ci = 1; // Issue command
     
     current_pcb->flags |= PROC_NEED_SCHED;
-    sched_cfs();
+    //sched_cfs();
     int retval = AHCI_SUCCESS;
 
     while (1)
@@ -382,7 +383,7 @@ static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_
         kerror("Write disk error");
         retval = E_TASK_FILE_ERROR;
     }
-    
+    kdebug("ahci write retval=%d", retval);
     enter_syscall_int(SYS_AHCI_END_REQ, 0, 0, 0, 0, 0, 0, 0, 0);
     return retval;
 }

+ 2 - 2
kernel/filesystem/VFS/VFS.h

@@ -127,8 +127,8 @@ struct vfs_file_operations_t
 {
     long (*open)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr);
     long (*close)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr);
-    long (*read)(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *position);
-    long (*write)(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *position);
+    long (*read)(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position);
+    long (*write)(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position);
     long (*lseek)(struct vfs_file_t *file_ptr, long offset, long origin);
     long (*ioctl)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr, uint64_t cmd, uint64_t arg);
 };

+ 35 - 20
kernel/filesystem/fat32/fat32.c

@@ -73,9 +73,9 @@ uint32_t fat32_write_FAT_entry(fat32_sb_info_t *fsbi, uint32_t cluster, uint32_t
 {
     // 计算每个扇区内含有的FAT表项数
     // FAT每项4bytes
-    uint32_t fat_ent_per_sec = (fsbi->bootsector.BPB_BytesPerSec >> 2); // 该值应为2的n次幂
+    uint32_t fat_ent_per_sec = (fsbi->bytes_per_sec >> 2); // 该值应为2的n次幂
     uint32_t buf[256];
-    memset(buf, 0, fsbi->bootsector.BPB_BytesPerSec);
+    memset(buf, 0, fsbi->bytes_per_sec);
 
     ahci_operation.transfer(AHCI_CMD_READ_DMA_EXT, fsbi->FAT1_base_sector + (cluster / fat_ent_per_sec), 1,
                             (uint64_t)&buf, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
@@ -335,6 +335,8 @@ find_lookup_success:; // 找到目标dentry
     finode->first_clus = ((tmp_dEntry->DIR_FstClusHI << 16) | tmp_dEntry->DIR_FstClusLO) & 0x0fffffff;
     finode->dEntry_location_clus = cluster;
     finode->dEntry_location_clus_offset = tmp_dEntry - (struct fat32_Directory_t *)buf; //计算dentry的偏移量
+    kdebug("finode->dEntry_location_clus=%#018lx", finode->dEntry_location_clus);
+    kdebug("finode->dEntry_location_clus_offset=%#018lx", finode->dEntry_location_clus_offset);
     finode->create_date = tmp_dEntry->DIR_CrtDate;
     finode->create_time = tmp_dEntry->DIR_CrtTime;
     finode->write_date = tmp_dEntry->DIR_WrtDate;
@@ -482,19 +484,24 @@ void fat32_write_inode(struct vfs_index_node_t *inode)
 
     // 计算目标inode对应数据区的LBA地址
     uint64_t fLBA = fsbi->first_data_sector + (finode->dEntry_location_clus - 2) * fsbi->sec_per_clus;
+    kdebug("fLBA=%d", fLBA);
+    kdebug("fsbi->first_data_sector=%d", fsbi->first_data_sector);
 
-    uint8_t *buf = (uint8_t *)kmalloc(fsbi->bytes_per_clus, 0);
-    memset(buf, 0, sizeof(fsbi->bytes_per_clus));
+    struct fat32_Directory_t *buf = (struct fat32_Directory_t *)kmalloc(fsbi->bytes_per_clus, 0);
+    memset(buf, 0, fsbi->bytes_per_clus);
     ahci_operation.transfer(AHCI_CMD_READ_DMA_EXT, fLBA, fsbi->sec_per_clus, (uint64_t)buf, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
 
     // 计算目标dEntry所在的位置
-    struct fat32_Directory_t *fdEntry = (struct fat32_Directory_t *)((uint64_t)buf + finode->dEntry_location_clus_offset);
+    struct fat32_Directory_t *fdEntry = buf + finode->dEntry_location_clus_offset;
 
     // 写入fat32文件系统的dir_entry
+    kdebug("inode->file_size=%#018lx", inode->file_size);
+    kdebug("before   fdEntry->DIR_FileSize=%d", fdEntry->DIR_FileSize);
     fdEntry->DIR_FileSize = inode->file_size;
     fdEntry->DIR_FstClusLO = finode->first_clus & 0xffff;
     fdEntry->DIR_FstClusHI = (finode->first_clus >> 16) | (fdEntry->DIR_FstClusHI & 0xf000);
 
+    kdebug("middle   fdEntry->DIR_FileSize=%d", fdEntry->DIR_FileSize);
     // 将dir entry写回磁盘
     ahci_operation.transfer(AHCI_CMD_WRITE_DMA_EXT, fLBA, fsbi->sec_per_clus, (uint64_t)buf, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
 
@@ -558,7 +565,7 @@ long fat32_close(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr)
  * @param position 文件指针位置
  * @return long 执行成功:传输的字节数量    执行失败:错误码(小于0)
  */
-long fat32_read(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *position)
+long fat32_read(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position)
 {
 
     struct fat32_inode_info_t *finode = (struct fat32_inode_info_t *)(file_ptr->dEntry->dir_inode->private_inode_info);
@@ -566,6 +573,7 @@ long fat32_read(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *po
 
     // First cluster num of the file
     uint64_t cluster = finode->first_clus;
+    // kdebug("fsbi->bytes_per_clus=%d fsbi->sec_per_clus=%d finode->first_clus=%d cluster=%d", fsbi->bytes_per_clus, fsbi->sec_per_clus, finode->first_clus, cluster);
 
     // kdebug("fsbi->bytes_per_clus=%d", fsbi->bytes_per_clus);
 
@@ -586,7 +594,7 @@ long fat32_read(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *po
         count = file_ptr->dEntry->dir_inode->file_size - *position;
 
     // 剩余还需要传输的字节数量
-    uint64_t bytes_remain = count;
+    int64_t bytes_remain = count;
 
     // alloc buffer memory space for ahci transfer
     void *tmp_buffer = kmalloc(fsbi->bytes_per_clus, 0);
@@ -597,6 +605,7 @@ long fat32_read(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *po
 
         memset(tmp_buffer, 0, fsbi->bytes_per_clus);
         uint64_t sector = fsbi->first_data_sector + (cluster - 2) * fsbi->sec_per_clus;
+
         // 读取一个簇的数据
         int errno = ahci_operation.transfer(AHCI_CMD_READ_DMA_EXT, sector, fsbi->sec_per_clus, (uint64_t)tmp_buffer, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
         if (errno != AHCI_SUCCESS)
@@ -671,7 +680,7 @@ uint64_t fat32_find_available_cluster(fat32_sb_info_t *fsbi)
  * @param position 文件指针位置
  * @return long 执行成功:传输的字节数量    执行失败:错误码(小于0)
  */
-long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *position)
+long fat32_write(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position)
 {
     struct fat32_inode_info_t *finode = (struct fat32_inode_info_t *)file_ptr->dEntry->dir_inode->private_inode_info;
     fat32_sb_info_t *fsbi = (fat32_sb_info_t *)(file_ptr->dEntry->dir_inode->sb->private_sb_info);
@@ -680,7 +689,8 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
     uint64_t cluster = finode->first_clus;
     int64_t flags = 0;
 
-    kdebug("fsbi->bytes_per_clus=%d", fsbi->bytes_per_clus);
+    // kdebug("fsbi->bytes_per_clus=%d fsbi->sec_per_clus=%d finode->first_clus=%d *position=%d", fsbi->bytes_per_clus, fsbi->sec_per_clus, finode->first_clus, *position);
+    // kdebug("buf=%s", buf);
     // clus offset in file
     uint64_t clus_offset_in_file = (*position) / fsbi->bytes_per_clus;
     // bytes offset in clus
@@ -698,37 +708,41 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
         for (uint64_t i = 0; i < clus_offset_in_file; ++i)
             cluster = fat32_read_FAT_entry(fsbi, cluster);
     }
-    kdebug("hhhhhhhh");
-    // 没有可用的磁盘空间
+    // kdebug("cluster(start)=%d", cluster);
+    //  没有可用的磁盘空间
     if (!cluster)
         return -ENOSPC;
 
     if (flags) // 空文件
     {
+        // kdebug("empty file");
         finode->first_clus = cluster;
         // 写入目录项
         file_ptr->dEntry->dir_inode->sb->sb_ops->write_inode(file_ptr->dEntry->dir_inode);
-        fat32_write_FAT_entry(fsbi, cluster, 0x0fffffff8); // 写入fat表项
+        fat32_write_FAT_entry(fsbi, cluster, 0x0ffffff8); // 写入fat表项
     }
 
-    uint64_t bytes_remain = count;
+    int64_t bytes_remain = count;
+
+    if (count < 0) // 要写入的字节数小于0
+        return -EINVAL;
+
     uint64_t sector;
     int64_t retval = 0;
 
     void *tmp_buffer = kmalloc(fsbi->bytes_per_clus, 0);
-    kdebug("ggggg");
     do
     {
         memset(tmp_buffer, 0, fsbi->bytes_per_clus);
         sector = fsbi->first_data_sector + (cluster - 2) * fsbi->sec_per_clus; // 计算对应的扇区
-        
         if (!flags)                                                            // 当前簇已分配
         {
-            // 读取一个簇的数据
+            // kdebug("read existed sec=%ld", sector);
+            //  读取一个簇的数据
             int errno = ahci_operation.transfer(AHCI_CMD_READ_DMA_EXT, sector, fsbi->sec_per_clus, (uint64_t)tmp_buffer, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
             if (errno != AHCI_SUCCESS)
             {
-                kerror("FAT32 FS(write)  read disk error!");
+                // kerror("FAT32 FS(write)  read disk error!");
                 retval = -EIO;
                 break;
             }
@@ -740,6 +754,7 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
         else
             step_trans_len = bytes_remain;
 
+        // kdebug("step_trans_len=%d, bytes_offset=%d", step_trans_len, bytes_offset);
         if (((uint64_t)buf) < USER_MAX_LINEAR_ADDR)
             copy_from_user(tmp_buffer + bytes_offset, buf, step_trans_len);
         else
@@ -749,7 +764,7 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
         int errno = ahci_operation.transfer(AHCI_CMD_WRITE_DMA_EXT, sector, fsbi->sec_per_clus, (uint64_t)tmp_buffer, fsbi->ahci_ctrl_num, fsbi->ahci_port_num);
         if (errno != AHCI_SUCCESS)
         {
-            kerror("FAT32 FS(write)  read disk error!");
+            kerror("FAT32 FS(write)  write disk error!");
             retval = -EIO;
             break;
         }
@@ -759,7 +774,7 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
         bytes_offset -= bytes_offset;
 
         *position += step_trans_len; // 更新文件指针
-        kdebug("step_trans_len=%d", step_trans_len);
+        // kdebug("step_trans_len=%d", step_trans_len);
 
         int next_clus = 0;
         if (bytes_remain)
@@ -794,7 +809,7 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
     kfree(tmp_buffer);
     if (!bytes_remain)
         retval = count;
-    kdebug("retval=%lld", retval);
+    // kdebug("retval=%lld", retval);
     return retval;
 }
 // todo: lseek

+ 35 - 19
kernel/process/process.c

@@ -88,9 +88,10 @@ void user_level_function()
     while (1)
     {
         // 测试sys_open
-        char string[] = "a.txt";
+        char string[] = "333.txt";
         long err_code = 1;
         int zero = 0;
+
         uint64_t addr = (ul)string;
         __asm__ __volatile__(
             "movq %2, %%r8 \n\t"
@@ -108,7 +109,7 @@ void user_level_function()
 
         int fd_num = err_code;
 
-        int count = 16;
+        int count = 128;
         // while (count)
         //{
         uchar buf[128] = {0};
@@ -137,10 +138,10 @@ void user_level_function()
             : "a"(SYS_PUT_STRING), "m"(addr)
             : "memory", "r8");
         // SYS_WRITE
-        char test1[] = "Test11111111jdjdjdjdjdjd\n";
+        char test1[] = "GGGGHHHHHHHHh112343";
 
         addr = (uint64_t)&test1;
-        count = 26;
+        count = 19;
         __asm__ __volatile__(
             "movq %2, %%r8 \n\t"
             "movq %3, %%r9 \n\t"
@@ -154,9 +155,7 @@ void user_level_function()
             : "=a"(err_code)
             : "a"(SYS_WRITE), "m"(fd_num), "m"(addr), "m"(count), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
             : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx");
-
-        // Test sys_read
-        addr = (uint64_t)&buf;
+        // Test sys_close
         __asm__ __volatile__(
             "movq %2, %%r8 \n\t"
             "movq %3, %%r9 \n\t"
@@ -168,22 +167,27 @@ void user_level_function()
             "movq %9, %%r15 \n\t"
             "int $0x80   \n\t"
             : "=a"(err_code)
-            : "a"(SYS_READ), "m"(fd_num), "m"(addr), "m"(count), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
+            : "a"(SYS_CLOSE), "m"(fd_num), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
             : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx");
-        count = err_code;
-        // 将读取到的数据打印出来
-        addr = (ul)buf+20;
+
+        addr = (ul)string;
         __asm__ __volatile__(
             "movq %2, %%r8 \n\t"
+            "movq %3, %%r9 \n\t"
+            "movq %4, %%r10 \n\t"
+            "movq %5, %%r11 \n\t"
+            "movq %6, %%r12 \n\t"
+            "movq %7, %%r13 \n\t"
+            "movq %8, %%r14 \n\t"
+            "movq %9, %%r15 \n\t"
             "int $0x80   \n\t"
             : "=a"(err_code)
-            : "a"(SYS_PUT_STRING), "m"(addr)
-            : "memory", "r8");
-
-        // Test Sys
-        //}
-
-        // Test sys_close
+            : "a"(SYS_OPEN), "m"(addr), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
+            : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx");
+        fd_num = err_code;
+        count = 128;
+        // Test sys_read
+        addr = (uint64_t)&buf;
         __asm__ __volatile__(
             "movq %2, %%r8 \n\t"
             "movq %3, %%r9 \n\t"
@@ -195,8 +199,20 @@ void user_level_function()
             "movq %9, %%r15 \n\t"
             "int $0x80   \n\t"
             : "=a"(err_code)
-            : "a"(SYS_CLOSE), "m"(fd_num), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
+            : "a"(SYS_READ), "m"(fd_num), "m"(addr), "m"(count), "m"(zero), "m"(zero), "m"(zero), "m"(zero), "m"(zero)
             : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx");
+        count = err_code;
+        // 将读取到的数据打印出来
+        addr = (ul)buf;
+        __asm__ __volatile__(
+            "movq %2, %%r8 \n\t"
+            "int $0x80   \n\t"
+            : "=a"(err_code)
+            : "a"(SYS_PUT_STRING), "m"(addr)
+            : "memory", "r8");
+
+        // Test Sys
+        //}
 
         while (1)
             pause();

+ 2 - 2
tools/umount_virt_disk.sh

@@ -1,3 +1,3 @@
-sudo umount ../bin/disk_mount/
-rm -rf ../bin/disk_mount/
+sudo umount -f ../bin/disk_mount/
+# rm -rf ../bin/disk_mount/
 sudo losetup -d /dev/loop1