From f99179014a2c7af11fb43793df39bc60f0a7d871 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Tue, 3 May 2022 15:12:02 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E7=A1=AE=E5=9C=B0=E5=BE=80=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=86=99=E5=85=A5=E6=95=B0=E6=8D=AE=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/common/glib.h | 8 +++-- kernel/driver/disk/ahci/ahci.c | 5 +-- kernel/filesystem/VFS/VFS.h | 4 +-- kernel/filesystem/fat32/fat32.c | 55 ++++++++++++++++++++------------ kernel/process/process.c | 56 +++++++++++++++++++++------------ tools/umount_virt_disk.sh | 4 +-- 6 files changed, 83 insertions(+), 49 deletions(-) diff --git a/kernel/common/glib.h b/kernel/common/glib.h index fe202c3b..53e8522e 100644 --- a/kernel/common/glib.h +++ b/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; } diff --git a/kernel/driver/disk/ahci/ahci.c b/kernel/driver/disk/ahci/ahci.c index bfee93fc..927f2675 100644 --- a/kernel/driver/disk/ahci/ahci.c +++ b/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; } diff --git a/kernel/filesystem/VFS/VFS.h b/kernel/filesystem/VFS/VFS.h index e26e7794..5e862760 100644 --- a/kernel/filesystem/VFS/VFS.h +++ b/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); }; diff --git a/kernel/filesystem/fat32/fat32.c b/kernel/filesystem/fat32/fat32.c index e5135bff..5d283111 100644 --- a/kernel/filesystem/fat32/fat32.c +++ b/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 diff --git a/kernel/process/process.c b/kernel/process/process.c index e36adeec..ab6efbac 100644 --- a/kernel/process/process.c +++ b/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,7 +155,37 @@ 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_close + __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_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"); + 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_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__( @@ -172,7 +203,7 @@ void user_level_function() : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx"); count = err_code; // 将读取到的数据打印出来 - addr = (ul)buf+20; + addr = (ul)buf; __asm__ __volatile__( "movq %2, %%r8 \n\t" "int $0x80 \n\t" @@ -183,21 +214,6 @@ void user_level_function() // Test Sys //} - // Test sys_close - __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_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"); - while (1) pause(); } diff --git a/tools/umount_virt_disk.sh b/tools/umount_virt_disk.sh index c68cfaae..bfd31b7c 100644 --- a/tools/umount_virt_disk.sh +++ b/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 \ No newline at end of file