]> Zhao Yanbai Git Server - kernel.git/commitdiff
启用Wall、Werror、Wshadow编译选项
authoracevest <zhaoyanbai@126.com>
Mon, 26 Jan 2026 12:01:12 +0000 (20:01 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 26 Jan 2026 12:04:02 +0000 (20:04 +0800)
41 files changed:
Makefile
boot/acpi.c
boot/boot.c
boot/vbe.c
drivers/ahci.c
drivers/ata.c
drivers/console.c
drivers/ide.c
drivers/keyboard.c
drivers/pci.c
drivers/sata.c
fs/buffer.c
fs/ext2.c
fs/file.c
fs/inode.c
fs/mount.c
fs/open.c
fs/path.c
fs/ramfs.c
fs/vfs.c
fs/write.c
include/system.h
kernel/ap.c
kernel/apic.c
kernel/cpuid.c
kernel/exec.c
kernel/exit.c
kernel/fork.c
kernel/i8259.c
kernel/sched.c
kernel/syscall.c
kernel/task_init.c
kernel/task_user.c
lib/exit.c
lib/string.c
lib/vsprintf.c
lib/wait.c
mm/bootmem.c
mm/mm.c
mm/page.c
scripts/link.ld

index 3c0584ef42a8c0f71cde8de7d33be45ae85ff57d..1e523349deb3a6cd0509385a6c9ad939fba338e5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,9 @@ ifeq (,$(shell which $(CC) 2>/dev/null))
 endif
 
 CFLAGS := -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"' -std=gnu11
+CFLAGS += -Wall
+CFLAGS += -Werror
+CFLAGS += -Wshadow
 # 指示编译器禁止生成位置无关代码
 CFLAGS += -fno-pic
 # 指示编译器在生成目标文件时不省略函数调用栈帧指针: frame pointer
index 43e643f94dbe99d5540ea8d54de523ae0f0fb9be..fb00e21f9cad922cc39ca20f77cda84a400982a9 100644 (file)
@@ -89,7 +89,7 @@ void parse_madt(vaddr_t addr) {
         } break;
         case 1: {  // IO APIC
             uint8_t ioapic_id = ptr[2];
-            uint8_t reserved = ptr[3];
+            // uint8_t reserved = ptr[3];
             uint32_t ioapic_addr = *(uint32_t*)(ptr + 4);
             uint32_t global_irq_base = *(uint32_t*)(ptr + 8);
             ioapic_cnt++;
@@ -115,7 +115,7 @@ void parse_madt(vaddr_t addr) {
             printk("LAPIC non-uniform cpu %u apic %u flags %02x\n", cpu_id, apic_id, flags);
         } break;
         case 4: {  // 虚拟化APIC
-            uint16_t reserved = *(uint16_t*)(ptr + 2);
+            // uint16_t reserved = *(uint16_t*)(ptr + 2);
             uint32_t apic_addr = *(uint32_t*)(ptr + 4);
             printk("Virtual APIC addr %08x\n", apic_addr);
         } break;
index 9176addfda6c7d62d0da9e2f8184c5ed23be0098..0afe76f122db74663091da58f8b17b817d6c8540 100644 (file)
@@ -144,7 +144,7 @@ void check_kernel(unsigned long addr, unsigned long magic) {
     struct multiboot_tag_bootdev* bootdev = 0;
     struct multiboot_tag_mmap* mmap_tag = 0;
     struct multiboot_tag_vbe* vbe = 0;
-    struct multiboot_tag_framebuffer* fb = 0;
+    // struct multiboot_tag_framebuffer* fb = 0;
     struct multiboot_tag_elf_sections* elf = 0;
 
     boot_params.e820map.map_cnt = 0;
@@ -160,7 +160,7 @@ void check_kernel(unsigned long addr, unsigned long magic) {
             strlcpy(boot_params.bootloader, ((struct multiboot_tag_string*)tag)->string,
                     sizeof(boot_params.bootloader));
             break;
-        case MULTIBOOT_TAG_TYPE_MODULE:
+        case MULTIBOOT_TAG_TYPE_MODULE: {
             struct multiboot_tag_module* m = (struct multiboot_tag_module*)tag;
             void* mod_start = (void*)m->mod_start;
             printk("module 0x%08x - 0x%08x size %u cmdline %s\n", m->mod_start, m->mod_end, m->size, m->cmdline);
@@ -200,7 +200,7 @@ void check_kernel(unsigned long addr, unsigned long magic) {
                 printk("\n");
             }
 #endif
-            break;
+        } break;
         case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
             mminfo = (struct multiboot_tag_basic_meminfo*)tag;
             // KB to Bytes
@@ -263,21 +263,22 @@ void check_kernel(unsigned long addr, unsigned long magic) {
                     name = strtab + section->sh_name;
                 }
 
-                uint32_t addr = section->sh_addr;
-                uint32_t size = section->sh_size;
-                uint32_t type = section->sh_type;
-                uint32_t flags = section->sh_flags;
-                printk("%20s addr %08x size %08x type %08x flags %08x\n", name ? name : "(unnamed)", addr, size, type,
-                       flags);
+                uint32_t _addr = section->sh_addr;
+                uint32_t _size = section->sh_size;
+                uint32_t _type = section->sh_type;
+                uint32_t _flags = section->sh_flags;
+                printk("%20s addr %08x size %08x type %08x flags %08x\n", name ? name : "(unnamed)", _addr, _size,
+                       _type, _flags);
             }
         } break;
         case MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR:
             printk("load base addr %08x\n", ((struct multiboot_tag_load_base_addr*)tag)->load_base_addr);
             break;
-        case MULTIBOOT_TAG_TYPE_ACPI_OLD:
+        case MULTIBOOT_TAG_TYPE_ACPI_OLD: {
             extern void parse_acpi(void*);
-            parse_acpi(tag);
+            parse_acpi((void*)tag);
             break;
+        }
         case MULTIBOOT_TAG_TYPE_ACPI_NEW:
             printk("ACPI new\n");
             break;
index 140b994cc8377b05e9d1dc79090aab92f2ef6790..8c826dbca254822d0b5247078bacb44dd38bcc4b 100644 (file)
@@ -118,7 +118,7 @@ uint32_t segoff_to_addr(segoff_t sg) {
     return 0xC0000000 + (sg.segment << 4) + sg.offset;
 }
 
-vbe_mode_info_t* get_vbe_mode_info(uint16_t) {
+vbe_mode_info_t* get_vbe_mode_info(uint16_t mode) {
     // 设置并执行实模式代码以调用 VBE 函数 0x4F01
     // 返回指向 VBE 模式信息的指针
     return NULL;
index 087be6a8cf342ee03675c552cfe052155ecb0991..d682801b3a4995a27b4e923c746ae0ed182b6072 100644 (file)
@@ -134,7 +134,7 @@ void init_ahci_device(pci_device_t* pci, int index) {
             ahci_port_t* port = hba->ports + i;
             uint32_t sata_status = port->sata_status;
             uint32_t sata_det = (sata_status >> 0) & 0x0F;  // device detection
-            uint32_t sata_spd = (sata_status >> 4) & 0x0F;  // current interface speed
+            // uint32_t sata_spd = (sata_status >> 4) & 0x0F;  // current interface speed
             uint32_t sata_ipm = (sata_status >> 8) & 0x0F;  // interface power management
 
             if (sata_det != 3) {
@@ -146,12 +146,11 @@ void init_ahci_device(pci_device_t* pci, int index) {
             }
 
             switch (port->signature) {
-            case SATA_SIGNATURE_ATA:
+            case SATA_SIGNATURE_ATA: {
                 extern void init_sata_device(ahci_hba_t * hba, ahci_port_t * port, int index);
                 init_sata_device(hba, port, i);
                 printk("SATA device detected at port %d\n", i);
-
-                break;
+            } break;
             case SATA_SIGNATURE_ATAPI:
                 printk("SATAPI device detected\n");
                 break;
index 686ac0ac39fec632294013731bc487a4facdb54b..8e5669a8eb2318231cbf8082c7445f5ef7f73115 100644 (file)
@@ -42,7 +42,7 @@ void ata_test(uint64_t nr) {
 //  1. 若为0,就认为没有IDE
 //  2. 等到status的BSY位清除
 //  3. 等到status的DRQ位或ERR位设置
-u16 identify[256];
+
 void ata_send_read_identify_cmd(int drv) {
 }
 
@@ -153,7 +153,7 @@ extern unsigned int IDE_CHL0_CTL_BASE;
 extern unsigned int IDE_CHL1_CTL_BASE;
 
 // 《AT Attachment 8 - ATA/ATAPI Command Set》
-void ide_ata_init() {
+void ide_ata_init(uint16_t* identify) {
     printk("IDE %04X %04X %04X %04X\n", IDE_CHL0_CMD_BASE, IDE_CHL1_CMD_BASE, IDE_CHL0_CTL_BASE, IDE_CHL1_CTL_BASE);
     for (int i = 0; i < MAX_IDE_DRIVE_CNT; i++) {
         int drvid = i;
@@ -237,7 +237,7 @@ void ide_ata_init() {
         // Bit 2: 1 表示设备支持应急电源降级。
         // Bit 1: 1 表示设备支持硬件重置。
         // Bit 0: 1 表示设备支持软重置。
-        uint16_t devtype = identify[ATA_IDENT_DEVTYPE];
+        // uint16_t devtype = identify[ATA_IDENT_DEVTYPE];
 
         // printk("device type %04X\n", devtype);
 
@@ -454,7 +454,7 @@ void read_partition_table(ide_drive_t* drv, uint32_t mbr_ext_offset, uint64_t lb
 void ide_read_partions() {
     for (int i = 0; i < MAX_IDE_DRIVE_CNT; i++) {
         ide_drive_t* drv = ide_drives + i;
-        int channel = i >> 1;
+        // int channel = i >> 1;
 
         if (0 == drv->present) {
             continue;
@@ -557,7 +557,7 @@ void ata_dma_read_ext(int drvid, uint64_t pos, uint16_t count, void* dest) {
     outb((pos >> 16) & 0xFF, REG_LBAH(drvid));
 
     // 等待硬盘READY
-    while (inb(REG_STATUS(drvid)) & ATA_STATUS_RDY == 0) {
+    while ((inb(REG_STATUS(drvid)) & ATA_STATUS_RDY) == 0) {
         nop();
     }
 
@@ -629,7 +629,7 @@ int ata_pio_read_ext(int drvid, uint64_t pos, uint16_t count, int timeout, void*
     outb((pos >> 8) & 0xFF, REG_LBAM(drvid));
     outb((pos >> 16) & 0xFF, REG_LBAH(drvid));
 
-    while (inb(REG_STATUS(drvid)) & ATA_STATUS_RDY == 0) {
+    while ((inb(REG_STATUS(drvid)) & ATA_STATUS_RDY) == 0) {
         nop();
     }
 
index f6dd56d1123b13980bd125d29e831e0fb2e1c669..3f6645e3a70f68a62870fb8cefeabf56a7f8752c 100644 (file)
@@ -100,10 +100,12 @@ int cnsl_kbd_write(char ch) {
         // wake_up(&rdwq);
         up(&sem);
     }
+
+    return 0;
 }
 
 int cnsl_read(char* buf, size_t count) {
-    unsigned long flags;
+    // unsigned long flags;
 
     assert(count > 0);
     int cnt = 0;
index 19ee78ba5507e48717866c64b3f21c147c8e6050..72e6d439c53a131256f4f588fc2b03608087abd1 100644 (file)
@@ -269,7 +269,10 @@ extern void* mbr_buf;
 
 uint8_t ata_pci_bus_status();
 
-void ide_ata_init();
+uint16_t ata_identify[256];
+
+void ide_ata_init(uint16_t* identify);
+
 void ide_init() {
     memset(ide_pci_controller, 0, sizeof(ide_pci_controller[0]) * NR_IDE_CONTROLLER);
 
@@ -277,7 +280,7 @@ void ide_init() {
     init_pci_controller(0x0101);
 
     // 读IDE 硬盘的identity
-    ide_ata_init();
+    ide_ata_init(ata_identify);
 }
 
 ide_drive_t* ide_get_drive(dev_t dev) {
index 2315c4b899365ff987bbdbcf6201e7aef4b7cebd..3732c44b6c212a4df72dece1a63c325b44aca0a8 100644 (file)
@@ -51,19 +51,19 @@ char kbd_char_tbl[] = {
 };
 
 // TODO 改造成环形缓冲区
-uint8_t scan_code;
+uint8_t kbd_scan_code;
 void kbd_bh_handler(void* arg) {
-    kbd_debug(scan_code);
-    if (0x80 & scan_code) {  // break code
+    kbd_debug(kbd_scan_code);
+    if (0x80 & kbd_scan_code) {  // break code
         return;
     }
-    uint8_t inx = scan_code & 0xFF;
+    uint8_t inx = kbd_scan_code & 0xFF;
     char ch = kbd_char_tbl[inx];
     cnsl_kbd_write(ch);
 }
 
 void kbd_handler(unsigned int irq, pt_regs_t* regs, void* dev_id) {
-    scan_code = inb(0x60);
+    kbd_scan_code = inb(0x60);
     add_irq_bh_handler(kbd_bh_handler, NULL);
 }
 
index eb5482b281b0990b1e32495705c73b746bf44821..e11c5fdfa2e1937faa89d2c3894ce651aabdcbc5 100644 (file)
@@ -106,7 +106,7 @@ void scan_pci_bus(int bus) {
             pci->hdr_type &= PCI_HDRTYPE_MASK;
 
             for (i = 0; i < BARS_CNT; ++i) {
-                cmd = PCI_CMD(bus, dev, devfn, PCI_BAR0 + i * 4);
+                cmd = PCI_CMD(bus, dev, devfn, (PCI_BAR0 + i * 4));
                 pci->bars[i] = pci_read_config_long(cmd);
             }
 
@@ -116,7 +116,6 @@ void scan_pci_bus(int bus) {
 }
 
 pci_device_t* pci_find_device(unsigned int vendor, unsigned int device) {
-    int i;
     list_head_t* p;
     pci_device_t* pci = 0;
 
@@ -182,7 +181,6 @@ const char* pci_intr_pin(int pin) {
 
 void dump_pci_dev() {
     list_head_t* p;
-    int i;
 
     list_for_each(p, &pci_devs) {
         pci_device_t* pci = list_entry(p, pci_device_t, list);
index 36a9543b25e3cc4580e4c45917a51b723d996296..d6cc83f76276a36626e17ac3651b4c3c59927994 100644 (file)
@@ -261,7 +261,7 @@ void sata_identify(sata_device_t* sata) {
 
     uint32_t timeout = 1000000;
     while (timeout--) {
-        if ((port->cmd_issue) & (1 << 0) == 0) {
+        if (((port->cmd_issue) & (1 << 0)) == 0) {
             break;
         }
         // 不启用中断也仍然会设置
index 1dca92510f21c98935db1f7b282793e1e235abd7..2b4c2d09759321312f57c11cf07c3c125b3bb8d9 100644 (file)
@@ -90,6 +90,7 @@ bbuffer_t* get_from_hash_table(dev_t dev, uint64_t block, uint32_t size) {
 }
 
 bbuffer_t* getblk(dev_t dev, uint64_t block, uint32_t size) {
+    uint32_t iflags;
     assert(size == 1024 || size == 2048 || size == 4096);
 
     // 暂时先只支持hard disk
@@ -97,7 +98,6 @@ bbuffer_t* getblk(dev_t dev, uint64_t block, uint32_t size) {
 
     int retry = 0;
 again:
-    uint32_t iflags;
     irq_save(iflags);
 
     // 先尝试从hash里分配
index c399c8dd0419a2459e8a4117ecbe2ed46ef03ae6..b163d0936701daa558b5cf25cca0bd6b43811aa6 100644 (file)
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -45,8 +45,8 @@ kmem_cache_t* ext2_inode_cache;
 
 ext2_inode_t ext2_root_inode;
 
-static ext2_inode_t boot_inode;
-static ext2_inode_t krnl_inode;
+// static ext2_inode_t boot_inode;
+// static ext2_inode_t krnl_inode;
 
 unsigned long ext2_block_size() {
     return (EXT2_MIN_BLOCK_SIZE << (EXT2_SB)->s_log_block_size);
@@ -58,6 +58,7 @@ void* ext2_alloc_block() {
 
 void* ext2_free_block(void* blk) {
     kmem_cache_free(ext2_block_cache, blk);
+    return blk;
 }
 
 void* ext2_alloc_inode() {
@@ -71,7 +72,7 @@ void ext2_read_inode(unsigned int ino, ext2_inode_t* inode) {
 
     printd("read_inode %u\n", ino);
 
-    unsigned int in;  // inode number
+    // unsigned int in;  // inode number
     unsigned int gn;  // group number
     unsigned int gi;  // inode index in group
 
index 7ce701583dc421a9d52f03f28e8c0b306dff75c9..396ddec0012201cf28d8a3064b19a7832ca7002a 100644 (file)
--- a/fs/file.c
+++ b/fs/file.c
@@ -29,7 +29,7 @@ page_t** page_hash_table = NULL;
 
 static uint32_t page_hash_func(address_space_t* mapping, uint32_t index) {
     uint32_t i = (((uint32_t)mapping) / (sizeof(inode_t) & ~(sizeof(inode_t) - 1)));
-#define s(x) ((x) + (x) >> PAGE_HASH_BITS)
+#define s(x) ((x) + ((x) >> PAGE_HASH_BITS))
     return s(i + index) & (PAGE_HASH_SIZE - 1);
 #undef s
 }
index 1b903dcd023b43ef8cdbbbdfc73bfc9257c70eb9..a45d962fa12aa6a4ff6963c71ce3bf6d672b8f6e 100644 (file)
@@ -40,7 +40,7 @@ inode_t* alloc_inode(superblock_t* sb) {
     inode->i_size = 0;
     inode->i_mapping = &inode->i_as;
     inode->i_mapping->a_inode = inode;
-    inode->i_mapping->pages;
+    // inode->i_mapping->pages;
     INIT_LIST_HEAD(&inode->i_mapping->pages);
     inode->i_mapping->a_ops = 0;
     return inode;
index 0a747966aab9565ab8e2fe9d7b20fb94d8c783fb..09716ba4b2eff908b30f2db5f7de65114850e8d8 100644 (file)
@@ -49,6 +49,7 @@ vfsmount_t* vfs_kernel_mount(fs_type_t* type, int flags, const char* name, void*
     mnt = alloc_vfsmount(name);
 
     ret = type->read_super(type, flags, name, data, mnt);
+    assert(ret == 0);
 
     assert(mnt->mnt_sb != 0);
     assert(mnt->mnt_root != 0);
index 141d4e57372742e00d91dc8ec8a4551339bfa3f8..c6360f9429398d4229e7afcc247a24de3946dbad 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -19,7 +19,7 @@
 #include <types.h>
 
 int get_unused_fd() {
-    int fd;
+    // int fd;
     task_files_t* files = &(current->files);
 
     for (int i = 0; i < NR_TASK_OPEN_CNT; i++) {
index dbad1df3fa1cd63f0473f6a20ea27e579a4c7ea9..7e1a491544069f33bcb5516ba3e7216a9e9ec3c8 100644 (file)
--- a/fs/path.c
+++ b/fs/path.c
@@ -132,6 +132,7 @@ int follow_down(dentry_t** dentry, vfsmount_t** vfsmnt) {
     //         *dentry = dentry_get(tmp_mnt->mnt_root);
     //     }
     // }
+    return 0;
 }
 
 int path_walk(const char* path, namei_t* ni) {
index ef4c42cd98eb5120cf78c8830e6c2a5a7841c7f2..665a535201b657a16ae2b56d25fb15fc762ae0bc 100644 (file)
@@ -140,9 +140,9 @@ inode_t* ramfs_get_inode(superblock_t* sb, umode_t mode, dev_t dev) {
     return inode;
 }
 
-static sb_operations_t ramfs_ops = {
-    // .alloc_inode = ramfs_alloc_inode,
-};
+// static sb_operations_t ramfs_ops = {
+//     // .alloc_inode = ramfs_alloc_inode,
+// };
 
 int ramfs_fill_super_cb(superblock_t* sb, void* data) {
     int err = 0;
index 5ca52750f11bb26c4297ef099fbdb9404b8ac08c..93f8e3460e5fbe4b6d36c2cee33d0ea29c2476cd 100644 (file)
--- a/fs/vfs.c
+++ b/fs/vfs.c
@@ -52,7 +52,8 @@ int vfs_register_filesystem(fs_type_t* fs) {
 
     add->next = fs;
     fs->next = 0;
-    return 0;
+
+    return ret;
 }
 
 fs_type_t* vfs_find_filesystem(const char* name) {
index 2618a5b035612acc76546f6023bb2b75a0f50ed6..24347936006452fbfada530d17d5f7830b2f834c 100644 (file)
@@ -79,7 +79,7 @@ ssize_t vfs_generic_file_write(file_t* file, const char* buf, size_t size, loff_
         pos += bytes;
     }
 
-end:
+    // end:
     up(&inode->i_sem);
     *p_pos = pos;
 
index a0ca51a57a902571e2d5490e9d16acc8bcb1ee6b..40b982848c39868b6b6c4fede2d57b0971b8d57d 100644 (file)
@@ -59,7 +59,7 @@ void* kmalloc(size_t size, gfp_t gfpflags);
 void* kzalloc(size_t size, gfp_t gfpflags);
 void kfree(void* addr);
 
-extern char etext, edata, end;
+// extern char etext, edata, end;
 
 #define cli() asm volatile("cli")
 #define sti() asm volatile("sti")
index 23bcfc43f55cd89dedef1c72327dad97e3acd584..418c80de0df73c0bda632e883a9d77d3b69501af 100644 (file)
@@ -68,7 +68,8 @@ void ap_kernel_entry() {
     // 之前加载的被复制到1MB以下的ap_gdt需要废弃,因为它已经在内核地址空间之外了
     // 虽然他们是同一个ap_gdt
     extern char ap_gdtr;
-    asm("lgdt ap_gdtr");
+    // 最简单的写 asm("lgdt ap_gdtr"); 但是c编译器不通过
+    asm("lgdt %0" ::"m"(ap_gdtr));
 
     // tss
     // AP 暂时不服务用户特权级 所以暂时用不到tss
@@ -261,13 +262,13 @@ void do_ap_lapic_irq_handler() {
 void _system_monitor() {
     //
     extern volatile uint64_t jiffies;
-    extern volatile uint64_t hpet_ticks;  // jiffies 和 hpet_ticks 是同一个东西
+    // extern volatile uint64_t hpet_ticks;  // jiffies 和 hpet_ticks 是同一个东西
     printlxy(MPL_IRQ, MPO_HPET, "HPET: %lu", jiffies);
 
     //
-    extern volatile uint8_t scan_code;
+    extern volatile uint8_t kbd_scan_code;
     extern volatile uint64_t kbd_irq_cnt;
-    printlxy(MPL_IRQ, MPO_KEYBOARD, "KBD: %02x %lu", scan_code, kbd_irq_cnt);
+    printlxy(MPL_IRQ, MPO_KEYBOARD, "KBD: %02x %lu", kbd_scan_code, kbd_irq_cnt);
 
     //
     printlxy(MPL_IRQ, MPO_AP_CLOCK, "AP: %lu", ap_lapic_ticks);
index 7a157f59e909776ca5a90c0f1de11a43eba15f8e..0b2fe8bfbbc954d9332f935f0c9e736df9e95f7d 100644 (file)
@@ -212,6 +212,7 @@ void lapic_init() {
     // TPR是软件的“计划”,ISR是硬件的“现状”,而PPR是综合二者得出的“当前执行标准”。
     // 内核只能通过设置TPR来影响PPR
     uint32_t PPR = lapic->read(LAPIC_PPR);
+    printk("TPR: %08x PPR: %08x\n", TPR, PPR);
 }
 
 static ioapic_map_t ioapic_map;
@@ -308,11 +309,11 @@ void ioapic_init() {
         ioapic_rte_write(IOAPIC_RTE(i), IOAPIC_RTE_MASK | irq);
     }
 
-    uint32_t rcba_phys_base = (uint32_t)get_rcba_paddr();
+    // uint32_t rcba_phys_base = (uint32_t)get_rcba_paddr();
 
     ioapic_enable();
 
-    uint64_t dst_cpuid = 0;
+    // uint64_t dst_cpuid = 0;
 
     extern irq_chip_t ioapic_chip;
 #if 1
index 3fc1a24b5bf5a6c6720d26edebeafd9b9fb099c7..1543a2380e6425621fe39529c0040d36f0d24160 100644 (file)
@@ -33,8 +33,8 @@ cpuid_regs_t cpuid(unsigned long op) {
 
 void detect_cpu() {
     cpuid_regs_t r;
-    unsigned short int cpu_sn[6];  // serial number
-    int i;
+    // unsigned short int cpu_sn[6];  // serial number
+    // int i;
 
     /**********************Get CPU Name********************************/
     char cpu_name[13];
index 85e5d40697d9f69dcdc32931b0cd8d3bf1ecbba7..67dacb597d8b8ded35eab85d36fddc3d5714a2ec 100644 (file)
@@ -61,7 +61,7 @@ int sysc_exec(const char* path, char* const argv[]) {
     assert(ehdr != 0);
     ext2_read_data(&inode, 0, PAGE_SIZE, (char*)ehdr);
     printk("%08x\n", *((unsigned long*)ehdr->e_ident));
-    assert(strncmp(ELFMAG, ehdr->e_ident, sizeof(ELFMAG) - 1) == 0);
+    assert(strncmp(ELFMAG, (char*)ehdr->e_ident, sizeof(ELFMAG) - 1) == 0);
     printk("Elf Entry: %08x\n", ehdr->e_entry);
 
     int i, j;
index 19906dc64b37a9d3c4ba660ad40333cf7a3f23a5..75e5accfacb8aef8d270a923d326cb5c24bfa578 100644 (file)
@@ -19,7 +19,7 @@ int sysc_exit(int status) {
     irq_save(flags);
     current->state = TASK_EXITING;
 
-    task_t* t = current;
+    // task_t* t = current;
 
     irq_restore(flags);
 
index 278031b84d0b2a7d4de40c0f7fe6398a84b4199b..437e51d059c0b5f5365d9a1b46d22de0ddff0393 100644 (file)
@@ -40,15 +40,14 @@ int do_fork(pt_regs_t* regs, unsigned long flags) {
     tsk->cr3 = (uint32_t)page2pa(alloc_one_page(0));
     assert(tsk->cr3 != 0);
 
-    unsigned int i, j;
     pde_t* pde_src = (pde_t*)pa2va(current->cr3);
     pde_t* pde_dst = (pde_t*)pa2va(tsk->cr3);
 
     memcpy((void*)pa2va(tsk->cr3), (void*)pa2va(current->cr3), PAGE_SIZE);
 
-    for (i = 0; i < PAGE_PDE_CNT; ++i) {
-        unsigned long spde = (unsigned long)pde_src[i];
-        unsigned long dpde = 0;
+    for (int i = 0; i < PAGE_PDE_CNT; ++i) {
+        // unsigned long spde = (unsigned long)pde_src[i];
+        // unsigned long dpde = 0;
 
         if (i >= get_npde(PAGE_OFFSET)) {
             pde_dst[i] = pde_src[i];
index 04f2a398afea72623b216881a56a0cd42cce61e0..097a7819dea82e20a9c8c319b490493a012cdf7f 100644 (file)
@@ -59,6 +59,7 @@ int enable_i8259_irq(unsigned int irq) {
         mask &= inb(PIC_MASTER_IMR);
         outb_p(mask, PIC_MASTER_IMR);
     }
+    return 0;
 }
 
 int disable_i8259_irq(unsigned int irq) {
@@ -72,6 +73,7 @@ int disable_i8259_irq(unsigned int irq) {
         mask |= inb(PIC_MASTER_IMR);
         outb(mask, PIC_MASTER_IMR);
     }
+    return 0;
 }
 
 void mask_ack_i8259_irq(unsigned int irq) {
@@ -107,7 +109,7 @@ void mask_ack_i8259_irq(unsigned int irq) {
 }
 
 void ack_i8259_irq(unsigned int irq) {
-    unsigned char mask = 0;
+    // unsigned char mask = 0;
 
     if (irq & 8)  // Slave
     {
index 648b8f3d303d34a41271c7b35f321d29f28a996e..2bfb2e372be8f31363ba4a44c5c531524e06d3ad 100644 (file)
@@ -113,7 +113,7 @@ void switch_to() {
 }
 
 void context_switch(task_t* prev, task_t* next) {
-    unsigned long eax, ebx, ecx, edx, esi, edi;
+    unsigned long /*eax,*/ ebx, ecx, edx, esi, edi;
     asm volatile(
         "pushfl;"
         "pushl  %%ebp;"
index 7eab1e8de13cd5329bf1b2625413cb404bd263ea..218f5cc2c145ce20c9c800e62afca8f13e49e94e 100644 (file)
@@ -62,8 +62,10 @@ int sysc_wait(int ticks) {
 }
 
 int sysc_test() {
+    return 0;
 }
 int sysc_pause() {
+    return 0;
 }
 
 int sysc_debug(unsigned int v) {
index 88d67248ea3d0b32a6a869740db97a86029aed0a..89445a1987fa548f9c838da335ede50f941e8d97 100644 (file)
@@ -296,7 +296,7 @@ void init_rootfs() {
         {
             // TODO支持带多层目录的fe_name
 
-            namei_t ni;
+            // namei_t ni;
             const char* path = fe_name;
             const int flags = O_CREAT | O_APPEND;
 #define bufsz 5223
@@ -327,8 +327,8 @@ void init_rootfs() {
 
             vfs_generic_file_read(&file, buf, bufsz, &file.f_pos);
 #endif
-            for (int i = 0; i < bufsz; i++) {
-                printk("%c", buf[i]);
+            for (int k = 0; k < bufsz; k++) {
+                printk("%c", buf[k]);
             }
             printk("\n");
         }
index b43c3242a731a4356844067d0e1a88d57b908737..6400c7292a70cccc32c9cc067bbac4c5b5a0f476 100644 (file)
@@ -36,7 +36,7 @@ void user_task_entry() {
     extern uint8_t ring3_page_begin;
 
     paddr_t ring3_page_addr = (paddr_t)&ring3_page_begin;  // 不在内核空间的物理地址
-    paddr_t ring3_stack_top = ring3_page_addr + PAGE_SIZE;
+    // paddr_t ring3_stack_top = ring3_page_addr + PAGE_SIZE;
 
     vaddr_t ring3_page_vaddr = 0x08000000;  // 指定的ring3的虚拟地址
     vaddr_t ring3_stack_top_vaddr = PAGE_OFFSET - 0x100000;
index ef46e6ba113462179216ff55fbf7baa55a8deb1d..86c8846476123b8f734646e241cf242e700a93db 100644 (file)
@@ -13,4 +13,5 @@
 #include <syscall.h>
 int exit(int status) {
     syscall1(SYSC_EXIT, status);
+    return 0;
 }
index 8f6bdc6bfa1bd1654ef397e0221da33d67c65bba..c7ca91ccc0043e5a3b90d0e0588760c24ed3f8fc 100644 (file)
@@ -81,10 +81,19 @@ int strncmp(const char* a, const char* b, size_t count) {
 
 char* strcat(char* dest, const char* src) {
     char* tmp = dest;
-    while (*dest)
+    while (*dest) {
         dest++;
-    while (*dest++ = *src++)
-        ;
+    }
+    // while (*dest++ = *src++)
+    //     ;
+    while (1) {
+        *dest = *src;
+        dest++;
+        src++;
+        if (*dest == 0) {
+            break;
+        }
+    }
     return tmp;
 }
 void* memcpy(void* dest, const void* src, size_t size) {
index 58b17699bcd35e963d5bc5637346571d5a768d63..1129c0ac97b02ca6c655b53146ec5e1f80bc6514 100644 (file)
@@ -132,7 +132,6 @@ void swap_char(char* a, char* b) {
 }
 
 char* itoa(char* s, int n) {
-    int i = 0;
     char* p = 0;
 
     if (n & 0x80000000) {
@@ -154,6 +153,8 @@ char* itoa(char* s, int n) {
         s++;
         p--;
     }
+
+    return s;
 }
 
 char* i64tou(char* s, uint64_t n) {
@@ -163,10 +164,10 @@ char* i64tou(char* s, uint64_t n) {
         i = strlen(s);
     }
     itou(s + i, n & 0xFFFFFFFF);
+    return s;
 }
 
 char* itou(char* s, unsigned int n) {
-    char c;
     char* p = s;
 
     do {
@@ -181,6 +182,7 @@ char* itou(char* s, unsigned int n) {
         s++;
         p--;
     }
+    return s;
 }
 
 char* _itoo(char* s, uint64_t n, int bgn) {
index 83865d6091b7d3c52304015f3bfac7cd9e83dd50..f429265406758d2859b4fda6d955f6774b5d9a16 100644 (file)
@@ -10,4 +10,5 @@
 #include <syscall.h>
 int wait(unsigned long pid) {
     syscall1(SYSC_WAIT, pid);
+    return 0;
 }
index 99fcc5dbc03124730db09eb19c5dc3ee80381c46..2a5fa03ffed4a67f4ca775fc263f589d9477b551 100644 (file)
@@ -263,6 +263,10 @@ void init_bootmem() {
 // 由于只有在构建buddy system的时候才会用到
 // 所以这里就简单实现
 void* alloc_from_bootmem(unsigned long size, char* title) {
+    unsigned long free_pfn = 0;
+    unsigned long bgn_pfn = 0;
+    unsigned long end_pfn = 0;
+
     void* region = NULL;
     unsigned long pfn_cnt = PFN_UP(size);
 
@@ -273,7 +277,7 @@ void* alloc_from_bootmem(unsigned long size, char* title) {
 
 find_next_block:
     // 先找到第一个空闲的pfn
-    unsigned long free_pfn = pbd->max_pfn;
+    free_pfn = pbd->max_pfn;
     for (unsigned long pfn = search_bgn_pfn; pfn < pbd->max_pfn; pfn++) {
         if (bootmem_page_state(pfn) == BOOTMEM_PAGE_FREE) {
             free_pfn = pfn;
@@ -283,8 +287,8 @@ find_next_block:
     }
 
     // 检验接下来是否有足够的size
-    unsigned long bgn_pfn = free_pfn;
-    unsigned long end_pfn = bgn_pfn + pfn_cnt;
+    bgn_pfn = free_pfn;
+    end_pfn = bgn_pfn + pfn_cnt;
 
     // printk("free_pfn: %d end_pfn:%d max_pfn:%d \n", free_pfn, end_pfn, pbd->max_pfn);
 
diff --git a/mm/mm.c b/mm/mm.c
index cfb938d2d78c89348afe165e6d1d74b64044f0c1..717996327ef39daa826071074c27bd6943ac115e 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -24,7 +24,7 @@
 #include <task.h>
 #include <types.h>
 
-extern char etext, edata, end;
+// extern char etext, edata, end;
 
 pde_t __initdata init_pgd[PDECNT_PER_PAGE] __attribute__((__aligned__(PAGE_SIZE)));
 pte_t __initdata init_pgt[PTECNT_PER_PAGE * BOOT_INIT_PAGETBL_CNT] __attribute__((__aligned__(PAGE_SIZE)));
@@ -84,7 +84,7 @@ void init_paging() {
         }
 
         // 分配一个页表
-        pte_t* pg_table = (pte_t*)alloc_from_bootmem(PAGE_SIZE, paging_page);
+        pg_table = (pte_t*)alloc_from_bootmem(PAGE_SIZE, paging_page);
         if (0 == pg_table) {
             panic("no pages for paging...");
         }
index 2ad85532cae7c3e16d89291134baaa0e1ed73ba0..693c7c130dc8365117bd6c8b4bc45b1b9a65a02e 100644 (file)
--- a/mm/page.c
+++ b/mm/page.c
@@ -55,7 +55,7 @@ void do_wp_page(void* addr) {
     pde_t* pde = page_dir + npde;
 
     // 如果是因为PDE被写保护
-    if (*pde & PDE_RW == 0) {
+    if (((*pde) & PDE_RW) == 0) {
         // 1. 分配一个页表
         unsigned long newtbl = (unsigned long)page2va(alloc_one_page(0));
         assert(newtbl != 0);
@@ -86,7 +86,7 @@ void do_wp_page(void* addr) {
     pte_t* pte = page_tbl + npte;
 
     // 如果PTE的位置被写保护
-    if (*pte & PTE_RW == 0) {
+    if (((*pte) & PTE_RW) == 0) {
         // 1. 分配一个页表
         unsigned long newaddr = (unsigned long)page2va(alloc_one_page(0));
         assert(newaddr != 0);
@@ -179,7 +179,7 @@ void set_pte_pfn(vaddr_t vaddr, pfn_t pfn, uint32_t flags) {
     assert(pgd != 0);
 
     pde_t pde = pgd[npde];
-    assert(pde & PAGE_P == PAGE_P);
+    assert(((pde)&PAGE_P) == PAGE_P);
 
     pte_t* pgt = (pte_t*)pa2va(PAGE_ALIGN(pde));
     pte_t pte = pgt[npte];
index b25955eae22b045fc986a8f6a3ce834acd72edd4..c00322020b020fcc9f3b70106197540851395391 100644 (file)
@@ -72,7 +72,7 @@ SECTIONS
         *(.text)
         *(.sysexit) /* last */
     }
-    etext = .;
+    _etext = .;
 
     /* 后续节的物理地址(也就是 LMA: Load Memory Address 加载内存地址)会根据 .text 节的自动计算,不用再每个都写一遍 AT 指令了 */
 
@@ -81,7 +81,7 @@ SECTIONS
         data = .;
         *(.data)
     }
-    edata = .;
+    _edata = .;
 
 
     .bss : ALIGN(0x1000)
@@ -89,9 +89,9 @@ SECTIONS
         bss = .;
         *(.bss);
     }
-    ebss = .;
+    _ebss = .;
 
-    end = .;
+    /* end = .; */
     _end = .;
     kernel_end = .;