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

This commit is contained in:
fslongjin 2022-05-03 15:12:02 +08:00
parent 9db1c3f74e
commit f99179014a
6 changed files with 83 additions and 49 deletions

View File

@ -478,7 +478,8 @@ static inline uint64_t copy_from_user(void *dst, void *src, uint64_t size)
"rep \n\t" "rep \n\t"
"movsb \n\t" "movsb \n\t"
: "=&c"(size), "=&D"(tmp0), "=&S"(tmp1) : "=&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; return size;
} }
@ -506,7 +507,8 @@ static inline uint64_t copy_to_user(void *dst, void *src, uint64_t size)
"rep \n\t" "rep \n\t"
"movsb \n\t" "movsb \n\t"
: "=&c"(size), "=&D"(tmp0), "=&S"(tmp1) : "=&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; return size;
} }

View File

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

View File

@ -127,8 +127,8 @@ struct vfs_file_operations_t
{ {
long (*open)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr); 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 (*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 (*read)(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position);
long (*write)(struct vfs_file_t *file_ptr, char *buf, uint64_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 (*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); long (*ioctl)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr, uint64_t cmd, uint64_t arg);
}; };

View File

@ -73,9 +73,9 @@ uint32_t fat32_write_FAT_entry(fat32_sb_info_t *fsbi, uint32_t cluster, uint32_t
{ {
// 计算每个扇区内含有的FAT表项数 // 计算每个扇区内含有的FAT表项数
// FAT每项4bytes // 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]; 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, 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); (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->first_clus = ((tmp_dEntry->DIR_FstClusHI << 16) | tmp_dEntry->DIR_FstClusLO) & 0x0fffffff;
finode->dEntry_location_clus = cluster; finode->dEntry_location_clus = cluster;
finode->dEntry_location_clus_offset = tmp_dEntry - (struct fat32_Directory_t *)buf; //计算dentry的偏移量 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_date = tmp_dEntry->DIR_CrtDate;
finode->create_time = tmp_dEntry->DIR_CrtTime; finode->create_time = tmp_dEntry->DIR_CrtTime;
finode->write_date = tmp_dEntry->DIR_WrtDate; finode->write_date = tmp_dEntry->DIR_WrtDate;
@ -482,19 +484,24 @@ void fat32_write_inode(struct vfs_index_node_t *inode)
// 计算目标inode对应数据区的LBA地址 // 计算目标inode对应数据区的LBA地址
uint64_t fLBA = fsbi->first_data_sector + (finode->dEntry_location_clus - 2) * fsbi->sec_per_clus; 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); struct fat32_Directory_t *buf = (struct fat32_Directory_t *)kmalloc(fsbi->bytes_per_clus, 0);
memset(buf, 0, sizeof(fsbi->bytes_per_clus)); 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); 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所在的位置 // 计算目标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 // 写入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_FileSize = inode->file_size;
fdEntry->DIR_FstClusLO = finode->first_clus & 0xffff; fdEntry->DIR_FstClusLO = finode->first_clus & 0xffff;
fdEntry->DIR_FstClusHI = (finode->first_clus >> 16) | (fdEntry->DIR_FstClusHI & 0xf000); fdEntry->DIR_FstClusHI = (finode->first_clus >> 16) | (fdEntry->DIR_FstClusHI & 0xf000);
kdebug("middle fdEntry->DIR_FileSize=%d", fdEntry->DIR_FileSize);
// 将dir entry写回磁盘 // 将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); 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 * @param position
* @return long 0 * @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); 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 // First cluster num of the file
uint64_t cluster = finode->first_clus; 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); // 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; 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 // alloc buffer memory space for ahci transfer
void *tmp_buffer = kmalloc(fsbi->bytes_per_clus, 0); 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); memset(tmp_buffer, 0, fsbi->bytes_per_clus);
uint64_t sector = fsbi->first_data_sector + (cluster - 2) * fsbi->sec_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); 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) if (errno != AHCI_SUCCESS)
@ -671,7 +680,7 @@ uint64_t fat32_find_available_cluster(fat32_sb_info_t *fsbi)
* @param position * @param position
* @return long 0 * @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; 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); 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; uint64_t cluster = finode->first_clus;
int64_t flags = 0; 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 // clus offset in file
uint64_t clus_offset_in_file = (*position) / fsbi->bytes_per_clus; uint64_t clus_offset_in_file = (*position) / fsbi->bytes_per_clus;
// bytes offset in 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) for (uint64_t i = 0; i < clus_offset_in_file; ++i)
cluster = fat32_read_FAT_entry(fsbi, cluster); cluster = fat32_read_FAT_entry(fsbi, cluster);
} }
kdebug("hhhhhhhh"); // kdebug("cluster(start)=%d", cluster);
// 没有可用的磁盘空间 // 没有可用的磁盘空间
if (!cluster) if (!cluster)
return -ENOSPC; return -ENOSPC;
if (flags) // 空文件 if (flags) // 空文件
{ {
// kdebug("empty file");
finode->first_clus = cluster; finode->first_clus = cluster;
// 写入目录项 // 写入目录项
file_ptr->dEntry->dir_inode->sb->sb_ops->write_inode(file_ptr->dEntry->dir_inode); 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; uint64_t sector;
int64_t retval = 0; int64_t retval = 0;
void *tmp_buffer = kmalloc(fsbi->bytes_per_clus, 0); void *tmp_buffer = kmalloc(fsbi->bytes_per_clus, 0);
kdebug("ggggg");
do do
{ {
memset(tmp_buffer, 0, fsbi->bytes_per_clus); memset(tmp_buffer, 0, fsbi->bytes_per_clus);
sector = fsbi->first_data_sector + (cluster - 2) * fsbi->sec_per_clus; // 计算对应的扇区 sector = fsbi->first_data_sector + (cluster - 2) * fsbi->sec_per_clus; // 计算对应的扇区
if (!flags) // 当前簇已分配 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); 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) if (errno != AHCI_SUCCESS)
{ {
kerror("FAT32 FS(write) read disk error!"); // kerror("FAT32 FS(write) read disk error!");
retval = -EIO; retval = -EIO;
break; break;
} }
@ -740,6 +754,7 @@ long fat32_write(struct vfs_file_t *file_ptr, char *buf, uint64_t count, long *p
else else
step_trans_len = bytes_remain; 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) if (((uint64_t)buf) < USER_MAX_LINEAR_ADDR)
copy_from_user(tmp_buffer + bytes_offset, buf, step_trans_len); copy_from_user(tmp_buffer + bytes_offset, buf, step_trans_len);
else 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); 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) if (errno != AHCI_SUCCESS)
{ {
kerror("FAT32 FS(write) read disk error!"); kerror("FAT32 FS(write) write disk error!");
retval = -EIO; retval = -EIO;
break; 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; bytes_offset -= bytes_offset;
*position += step_trans_len; // 更新文件指针 *position += step_trans_len; // 更新文件指针
kdebug("step_trans_len=%d", step_trans_len); // kdebug("step_trans_len=%d", step_trans_len);
int next_clus = 0; int next_clus = 0;
if (bytes_remain) 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); kfree(tmp_buffer);
if (!bytes_remain) if (!bytes_remain)
retval = count; retval = count;
kdebug("retval=%lld", retval); // kdebug("retval=%lld", retval);
return retval; return retval;
} }
// todo: lseek // todo: lseek

View File

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

View File

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