]> Zhao Yanbai Git Server - kernel.git/commitdiff
修复一些bug master
authoracevest <zhaoyanbai@126.com>
Sat, 31 Jan 2026 12:26:59 +0000 (20:26 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 31 Jan 2026 12:26:59 +0000 (20:26 +0800)
fs/read.c
include/types.h
kernel/ap.c
kernel/irq.c
kernel/task_init.c
mm/page.c

index 7bb1bfc0e7d65d7441eede07a2b117aadbfd2f7a..b7394fbe3fa705340300c93d05aba95fccdfd895 100644 (file)
--- a/fs/read.c
+++ b/fs/read.c
@@ -29,6 +29,8 @@ ssize_t vfs_generic_file_read(file_t* file, char* buf, size_t size, loff_t* p_po
     uint32_t offset = pos & (PAGE_SIZE - 1);
     size_t left = size;
 
+    ssize_t read_bytes = 0;
+
     while (left > 0) {
         page_t* page = NULL;
         uint32_t end_index = inode->i_size >> PAGE_SHIFT;
@@ -58,6 +60,7 @@ ssize_t vfs_generic_file_read(file_t* file, char* buf, size_t size, loff_t* p_po
 
         // copy data
         bytes = bytes < left ? bytes : left;
+        read_bytes += bytes;
         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);
@@ -80,7 +83,7 @@ ssize_t vfs_generic_file_read(file_t* file, char* buf, size_t size, loff_t* p_po
     no_cached_page_in_hash:
         page = alloc_one_page(0);
         if (page == NULL) {
-            return ENOMEM;
+            return -ENOMEM;
         }
 
         // TODO:可能已经有其它进程已经把数据读入内存了
@@ -91,7 +94,7 @@ ssize_t vfs_generic_file_read(file_t* file, char* buf, size_t size, loff_t* p_po
         assert(mapping->a_ops->read_page != NULL);
         ret = mapping->a_ops->read_page(file, page);
         if (0 != ret) {
-            return EIO;
+            return -EIO;
         }
 
         //
@@ -99,7 +102,7 @@ ssize_t vfs_generic_file_read(file_t* file, char* buf, size_t size, loff_t* p_po
         add_page_to_hash(page, mapping, index);
     }
 
-    return ret;
+    return read_bytes;
 }
 
 ssize_t sysc_read(int fd, void* buf, size_t count) {
index 7ebcc74173152fdbc5718fcf1f4e024c5fa5ebf1..60657d8508c428b5689de3c855dd8a35295ee439 100644 (file)
@@ -28,7 +28,6 @@ typedef signed long long s64;
 typedef unsigned char u8;
 typedef unsigned short u16;
 typedef unsigned long u32;
-typedef unsigned long u32;
 typedef unsigned long long u64;
 
 typedef signed char s8_t;
index bb059c4406086499c4d305f3380452eec4ec3902..36b2be1a5620a1ac4c13fac5b94cde4170a45264 100644 (file)
@@ -124,7 +124,7 @@ void ap_kernel_entry() {
         panic("local apic not supported\n");
     }
 
-    // 开时钟中断
+    // 开时钟中断
     lapic_t* lapic = system.lapic;
 
     uint32_t apic_base = 0;
index b40d7fb6b2608d6c09b7bfb5954eef80c4ca5767..48a5db159d3e3599b80c7a4a350470b26d1b7987 100644 (file)
@@ -48,7 +48,9 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t* regs) {
 
     // 在qemu启动后如果gdb有加断点,就很会一直触发中断重入
     reenter++;
-    reenter_count += reenter == 0 ? 0 : 1;
+    if (reenter > 1) {
+        reenter_count++;
+    }
     assert(irq_disabled());
     assert(reenter >= 0);
     assert(reenter <= 1);
index 89445a1987fa548f9c838da335ede50f941e8d97..985e31cae7d6cb00fc593066a8b9f07497818b94 100644 (file)
@@ -160,13 +160,14 @@ void init_task_entry() {
         file.f_dentry = ni.path.dentry;
         file.f_ops = file.f_dentry->d_inode->i_fops;
 
-        vfs_generic_file_write(&file, "aaa1234567", 10, &file.f_pos);
+        const char* init_elf_data = "aaa1234567abcdIII";
+        vfs_generic_file_write(&file, init_elf_data, strlen(init_elf_data), &file.f_pos);
 
         file.f_pos = 0;
         char buf[128] = {'b', 'u', 'f'};
-        vfs_generic_file_read(&file, buf, 4, &file.f_pos);
-        for (int i = 0; i < 16; i++) {
-            printk("%c ", buf[i]);
+        ssize_t ret = vfs_generic_file_read(&file, buf, 128, &file.f_pos);
+        for (int i = 0; i < ret; i++) {
+            printk("%c", buf[i]);
         }
         printk("\n");
     }
index 693c7c130dc8365117bd6c8b4bc45b1b9a65a02e..223c1289329c384a360071319adeb5a00fe32084 100644 (file)
--- a/mm/page.c
+++ b/mm/page.c
@@ -94,7 +94,6 @@ void do_wp_page(void* addr) {
         // 2. 拷贝页表
         pte_t* oldaddr = pa2va(PAGE_ALIGN(page_dir[npde]));
         memcpy((void*)newaddr, (void*)oldaddr, PAGE_SIZE);
-
         // 3. 解除PTE的写保护
         *pte |= PTE_RW;
     }