]> Zhao Yanbai Git Server - kernel.git/commitdiff
清理代码
authoracevest <zhaoyanbai@126.com>
Sun, 28 May 2023 05:34:38 +0000 (13:34 +0800)
committeracevest <zhaoyanbai@126.com>
Sun, 28 May 2023 05:34:38 +0000 (13:34 +0800)
drivers/bak.ata [deleted file]
kernel/irq.c
kernel/sched.c
kernel/task_disk.c
kernel/task_init.c
kernel/task_root.c
kernel/wait.c

diff --git a/drivers/bak.ata b/drivers/bak.ata
deleted file mode 100644 (file)
index 01e32d1..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * ------------------------------------------------------------------------
- *   File Name: ata.c
- *      Author: Zhao Yanbai
- *              2021-11-10 13:55:27 Wednesday CST
- * Description: none
- * ------------------------------------------------------------------------
- */
-#include <ata.h>
-#include <ide.h>
-#include <io.h>
-#include <string.h>
-#include <system.h>
-#include <types.h>
-
-extern ide_pci_controller_t ide_pci_controller;
-
-#define ATA_TIMEOUT 10  // 10次时钟中断
-
-void ata_dma_read_ext(int dev, uint64_t pos, uint16_t count, void *dest);
-int ata_pio_read_ext(int dev, uint64_t pos, uint16_t count, int timeout, void *dest);
-
-void *mbr_buf;
-void ata_test(uint64_t nr) {
-    memset(mbr_buf, 0xAA, SECT_SIZE);
-    ata_dma_read_ext(0, nr, 1, mbr_buf);
-}
-
-// 本程序参考文档《AT Attachment with Packet Interface - 6》
-
-// 仅考虑ATA硬盘的情况
-// 一个IDE接口能接Master、Slave两个DRIVE。
-// 一个PC机上通常有两个IDE接口(IDE0, IDE1或ATA0, ATA1),通常称通道0、1
-// 对于同一个IDE通道的两个DRIVE,共享同一组寄存器,它们之间的区分是通过Device寄存器的第4个bit位来实现的。0为Master,1为Slave
-//
-// 使用IDENTIFY命令步骤:
-//  1. 选择DRIVE构造命令,发送到Device寄存器(发送到master: 0x00, 发送到slave: 0x40)
-//  2. 发送IDENTIFY(0xEC)命令到该通道的命令寄存器
-// 检查status寄存器:
-//  1. 若为0,就认为没有IDE
-//  2. 等到status的BSY位清除
-//  3. 等到status的DRQ位或ERR位设置
-u16 identify[256];
-void ata_read_identify(int dev) {  // 这里所用的dev是逻辑编号 ATA0、ATA1下的Master、Salve的dev分别为0,1,2,3
-
-    outb(ATA_CTL_NIEN, REG_CTL(dev));                   // 在读IDENTIFY的时候禁用硬盘中断
-    outb(0x00 | ((dev & 0x01) << 4), REG_DEVICE(dev));  // 根据文档P113,这里不用指定bit5, bit7,直接指示DRIVE就行
-    outb(ATA_CMD_IDENTIFY, REG_CMD(dev));
-    while (1) {
-        u8 status = inb(REG_STATUS(dev));
-        printk("hard disk status: %x %x\n", status, REG_STATUS(dev));
-        if (status == 0) {
-            panic("no ata device");
-        }
-        if ((status & ATA_STATUS_BSY) == 0 && (status & ATA_STATUS_DRQ) != 0) {
-            break;
-        }
-    }
-
-    insw(REG_DATA(dev), identify, SECT_SIZE / sizeof(u16));
-
-    // 第49个word的第8个bit位表示是否支持DMA
-    // 第83个word的第10个bit位表示是否支持LBA48,为1表示支持。
-    // 第100~103个word的八个字节表示user的LBA最大值
-    printk("%04x %04x %d %d\n", identify[49], 1 << 8, identify[49] & (1 << 8), (identify[49] & (1 << 8)) != 0);
-    if ((identify[49] & (1 << 8)) != 0) {
-        printk("support DMA\n");
-    }
-
-    if ((identify[83] & (1 << 10)) != 0) {
-        printk("support LBA48\n");
-
-        u64 lba = *(u64 *)(identify + 100);
-        printk("hard disk size: %u MB\n", (lba * 512) >> 20);
-    }
-
-    printk("bus iobase %x cmd %x status %x prdt %x \n", ide_pci_controller.bus_iobase, ide_pci_controller.bus_cmd,
-           ide_pci_controller.bus_status, ide_pci_controller.bus_prdt);
-
-    // TODO REMOVE
-    mbr_buf = kmalloc(SECT_SIZE, 0);
-    // ata_test(0);
-
-    // ata_pio_read_ext(0, 0, 1, ATA_TIMEOUT, mbr_buf);
-    // uint16_t *p = (uint16_t *)mbr_buf;
-    // for (int i = 0; i < 256; i++) {
-    //     if (i % 12 == 0) {
-    //         printk("\n>%03d ", i);
-    //     }
-    //     printk("%04x ", p[i]);
-    // }
-}
-
-// ATA_CMD_READ_DMA_EXT
-void ata_dma_read_ext(int dev, uint64_t pos, uint16_t count, void *dest) {
-    // 停止DMA
-    outb(PCI_IDE_CMD_STOP, ide_pci_controller.bus_cmd);
-
-    // 配置描述符表
-    unsigned long dest_paddr = va2pa(dest);
-    ide_pci_controller.prdt[0].phys_addr = dest_paddr;
-    ide_pci_controller.prdt[0].byte_count = SECT_SIZE;
-    ide_pci_controller.prdt[0].reserved = 0;
-    ide_pci_controller.prdt[0].eot = 1;
-    outl(va2pa(ide_pci_controller.prdt), ide_pci_controller.bus_prdt);
-
-    printk("paddr: %x prdt: %x %x prdte %x %x\n", dest_paddr, ide_pci_controller.prdt, va2pa(ide_pci_controller.prdt),
-           ide_pci_controller.prdt[0].phys_addr, *(((unsigned int *)ide_pci_controller.prdt) + 1));
-
-    // 清除中断位和错误位
-    // 这里清除的方式是是设置1后清除
-    outb(PCI_IDE_STATUS_INTR | PCI_IDE_STATUS_ERR, ide_pci_controller.bus_status);
-
-    // 不再设置nIEN,DMA需要中断
-    outb(0x00, REG_CTL(dev));
-
-    // 等待硬盘不BUSY
-    while (inb(REG_STATUS(dev)) & ATA_STATUS_BSY) {
-        nop();
-    }
-
-    // 选择DRIVE
-    outb(ATA_LBA48_DEVSEL(dev), REG_DEVICE(dev));
-
-    // 先写扇区数的高字节
-    outb((count >> 8) & 0xFF, REG_NSECTOR(dev));
-
-    // 接着写LBA48,高三个字节
-    outb((pos >> 24) & 0xFF, REG_LBAL(dev));
-    outb((pos >> 32) & 0xFF, REG_LBAM(dev));
-    outb((pos >> 40) & 0xFF, REG_LBAH(dev));
-
-    // 再写扇区数的低字节
-    outb((count >> 0) & 0xFF, REG_NSECTOR(dev));
-
-    // 接着写LBA48,低三个字节
-    outb((pos >> 0) & 0xFF, REG_LBAL(dev));
-    outb((pos >> 8) & 0xFF, REG_LBAM(dev));
-    outb((pos >> 16) & 0xFF, REG_LBAH(dev));
-
-    // 等待硬盘READY
-    while (inb(REG_STATUS(dev)) & ATA_STATUS_RDY == 0) {
-        nop();
-    }
-
-    outb(ATA_CMD_READ_DMA_EXT, REG_CMD(dev));
-
-    // 这一句非常重要,如果不加这一句
-    // 在qemu中用DMA的方式读数据就会读不到数据,而只触是发中断,然后寄存器(Bus Master IDE Status
-    // Register)的值会一直是5 也就是INTERRUPT和和ACTIVE位是1,正常应该是4,也就是只有INTERRUPT位为1
-    // 在bochs中则加不加这一句不会有影响,都能正常读到数据
-    unsigned int v = pci_read_config_word(pci_cmd(ide_pci_controller.pci, PCI_COMMAND));
-    printk(" ide pci command %04x\n", v);
-    pci_write_config_word(v | PCI_COMMAND_MASTER, pci_cmd(ide_pci_controller.pci, PCI_COMMAND));
-
-    // 指定DMA操作为读取硬盘操作,内核用DMA读取,对硬盘而言是写出
-    // 并设置DMA的开始位,开始DMA
-    outb(PCI_IDE_CMD_WRITE | PCI_IDE_CMD_START, ide_pci_controller.bus_cmd);
-}
-
-// ATA_CMD_READ_PIO_EXT
-int ata_pio_read_ext(int dev, uint64_t pos, uint16_t count, int timeout, void *dest) {
-    // PIO读,禁用中断
-    outb(ATA_CTL_NIEN, REG_CTL(dev));
-
-    // 等待硬盘不BUSY
-    while (inb(REG_STATUS(dev)) & ATA_STATUS_BSY) {
-        nop();
-    }
-
-    // 选择DRIVE
-    outb(ATA_LBA48_DEVSEL(dev), REG_DEVICE(dev));
-
-    // 先写扇区数的高字节
-    outb((count >> 8) & 0xFF, REG_NSECTOR(dev));
-
-    // 接着写LBA48,高三个字节
-    outb((pos >> 24) & 0xFF, REG_LBAL(dev));
-    outb((pos >> 32) & 0xFF, REG_LBAM(dev));
-    outb((pos >> 40) & 0xFF, REG_LBAH(dev));
-
-    // 再写扇区数的低字节
-    outb((count >> 0) & 0xFF, REG_NSECTOR(dev));
-
-    // 接着写LBA48,低三个字节
-    outb((pos >> 0) & 0xFF, REG_LBAL(dev));
-    outb((pos >> 8) & 0xFF, REG_LBAM(dev));
-    outb((pos >> 16) & 0xFF, REG_LBAH(dev));
-
-    while (inb(REG_STATUS(dev)) & ATA_STATUS_RDY == 0) {
-        nop();
-    }
-
-    outb(ATA_CMD_READ_PIO_EXT, REG_CMD(dev));
-
-    while (timeout > 0) {
-        timeout--;
-
-        u8 status = inb(REG_STATUS(dev));
-        if ((status & ATA_STATUS_BSY) == 0 && (status & ATA_STATUS_DRQ) != 0) {
-            break;
-        }
-
-        asm("sti;hlt;");
-    }
-    asm("cli");
-
-    if (timeout == 0) {
-        return -1;
-    }
-
-    insl(REG_DATA(dev), dest, (SECT_SIZE * count) / sizeof(uint32_t));
-
-    return 0;
-}
-
-uint8_t ata_pci_bus_status() {
-    uint8_t st = 0;
-    st = inb(ide_pci_controller.bus_status);
-
-    outb(PCI_IDE_STATUS_INTR, ide_pci_controller.bus_status);
-
-    return st;
-}
-
-unsigned int ATA_CHL0_CMD_BASE = 0x1F0;
-unsigned int ATA_CHL1_CMD_BASE = 0x170;
-
-unsigned int ATA_CHL0_CTL_BASE = 0x3F6;
-unsigned int ATA_CHL1_CTL_BASE = 0x376;
\ No newline at end of file
index b5e683403860d7bb93e71db1b46a98ff25b473e4..b7a093c089b29ad5a0d5d332651a2e1dfd1dda11 100644 (file)
@@ -30,6 +30,7 @@ irq_chip_t no_irq_chip = {.name = "none", .enable = enable_no_irq_chip, .disable
 
 irq_desc_t no_irq_desc = {.chip = &no_irq_chip, .action = NULL, .status = 0, .depth = 0};
 
+#if 0
 unsigned int irq_nr_stack[64] = {1, 2, 3, 4};
 uint32_t irq_nr_jiffies_stack[64] = {
     0,
@@ -48,6 +49,7 @@ unsigned int pop_irq_nr_stack() {
     return irq_nr_stack[irq_nr_stack_pos];
 }
 
+
 int vsprintf(char *buf, const char *fmt, char *args);
 void dump_irq_nr_stack() {
     if (irq_nr_stack_pos == 0) {
@@ -75,6 +77,7 @@ void dump_irq_nr_stack() {
     strcat(buf, "\n");
     printk(buf);
 }
+#endif
 
 __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     unsigned int irq = regs->irq;
@@ -96,20 +99,6 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
 
     assert(current->magic == TASK_MAGIC);
 
-#if 0
-    push_irq_nr_stack(irq);
-
-    // if (irq_nr_stack_pos >= 2) {
-    dump_irq_nr_stack();
-    //     panic("sdfasd");
-    // }
-#endif
-
-#if 0
-    // 开中断执行中断处理函数
-    enable_irq();
-#endif
-
 #if 1
     unsigned long esp;
     asm("movl %%esp, %%eax" : "=a"(esp));
@@ -122,15 +111,6 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
         action = action->next;
     }
 
-#if 0
-    // 关全局中断
-    disable_irq();
-#endif
-
-#if 0
-    pop_irq_nr_stack();
-#endif
-
     // 解除屏蔽当前中断
     p->chip->enable(irq);
 
@@ -162,7 +142,6 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     assert(irq_disabled());
     assert(reenter == 0);
     reenter--;
-    assert(reenter == -1);
 
     // 考察如果不需要调度程序,直接退出
     if (current->ticks != 0) {
index 8849bda1b756dbe421d006d910f88abb5d551fbb..e464e5e9b554fdaf231dc2efee2d6ba057f4c19d 100644 (file)
@@ -202,13 +202,9 @@ void schedule() {
         current->state = TASK_READY;
     }
 
-    // printk("-----\n");
     list_for_each_safe(pos, t, &all_tasks) {
         p = list_entry(pos, task_union, list);
 
-        // printk("%s state: %s ticks %u\n", current->name, task_state(current->state), current->ticks);
-        // printk("%s state: %s\n", p->name, task_state(p->state));
-
         if (p == &root_task) {
             continue;
         }
@@ -223,7 +219,7 @@ void schedule() {
             sel = p;
             continue;
         }
-#if 1
+
         // 考察三个量
         // priority 越大越优先
         // jiffies  越小越优先
@@ -237,23 +233,6 @@ void schedule() {
                 sel = p;
             }
         }
-#else
-        if (sel->jiffies < p->jiffies) {
-            continue;
-        }
-
-        uint64_t delta = sel->jiffies - p->jiffies;
-
-        if (sel->priority <= p->priority) {
-            if (delta > (1 * p->ticks)) {
-                sel = p;
-            }
-        } else if (sel->priority > p->priority) {
-            if (delta > (5 * p->ticks)) {
-                sel = p;
-            }
-        }
-#endif
     }
 
     task_union *prev = current;
@@ -261,16 +240,6 @@ void schedule() {
 
     next->state = TASK_RUNNING;
 
-#if 1
-    // debug_print_all_tasks();
-#else
-    printl(MPL_TASK_TITLE, "         NAME     STATE TK/PI TURN       SCHED      KEEP");
-    list_for_each_safe(pos, t, &all_tasks) {
-        p = list_entry(pos, task_union, list);
-        printl(MPL_TASK_0 + p->pid, "%08x%s%4s:%d %s %02u/%02d %-10u %-10u %-10u", p, next == p ? ">" : " ", p->name,
-               p->pid, task_state(p->state), p->ticks, p->priority, p->turn, p->sched_cnt, p->sched_keep_cnt);
-    }
-#endif
     if (prev != next) {
         next->sched_cnt++;
         context_switch(prev, next);
index 2b94b1c5fb1e36ec2d6878bae08a7fe8e97a2023..8bc22f58daa96bfec9d0a501f31cba9858f5d5c5 100644 (file)
@@ -47,18 +47,10 @@ void send_disk_request(disk_request_t *r) {
         panic("disk DMA read cross 64K");
     }
 
-#if 1
     mutex_lock(&disk_request_mutex);
     disk_request_cnt++;
     list_add_tail(&r->list, &disk_request_queue.list);
     mutex_unlock(&disk_request_mutex);
-#else
-    // 发送命令
-    unsigned long flags;
-    irq_save(flags);
-    list_add_tail(&r->list, &disk_request_queue.list);
-    irq_restore(flags);
-#endif
 
     // 唤醒task_disk
     up(&disk_request_queue.sem);
@@ -74,7 +66,6 @@ void disk_task_entry() {
         down(&disk_request_queue.sem);
         // printk("hard disk request: %d\n", disk_request_queue.count++);
 
-#if 1
         mutex_lock(&disk_request_mutex);
         disk_request_t *r;
         r = list_first_entry(&disk_request_queue.list, disk_request_t, list);
@@ -85,24 +76,6 @@ void disk_task_entry() {
         list_del(&r->list);
         disk_handled_cnt++;
         mutex_unlock(&disk_request_mutex);
-#else
-        unsigned long flags;
-        irq_save(flags);
-
-        disk_request_t *r;
-        if (list_empty(&disk_request_queue.list)) {
-            panic("disk request should not empty");
-        }
-
-        r = list_first_entry(&disk_request_queue.list, disk_request_t, list);
-        if (NULL == r) {
-            panic("no disk request");
-        }
-
-        printk("disk request[%d]: dev %d pos %ld count %d cmd %d\n", r_cnt++, r->dev, r->pos, r->count, r->command);
-        list_del(&r->list);
-        irq_restore(flags);
-#endif
 
         switch (r->command) {
         case DISK_REQ_IDENTIFY:
index fbc0c03d07d73ece224227910d8b0d5ed19981de..94effeb77bd6fb92d465f1a4b98aab17ca1489f3 100644 (file)
@@ -9,8 +9,8 @@
 #include <syscall.h>
 #include <system.h>
 #include <types.h>
-
-void init_task_entry() {
+int sysc_wait(unsigned long cnt);
+kernel / task_init.c void init_task_entry() {
     current->priority = 10;
 
     // 继续内核未完成的初始化
index f48d1c1df2b280885f13dca6109546cfaee5d7a8..fcde446d8f3bf3bbff07866401f78765cf1fb51b 100644 (file)
@@ -21,6 +21,7 @@
 #include <types.h>
 
 int do_fork(pt_regs_t *regs, unsigned long flags);
+int sysc_wait(unsigned long cnt);
 
 void kernel_task(char *name, void *entry) {
     pt_regs_t regs;
index 016792d09b7fd5c7610e17f22c894644a0e47c80..aee71040382b6d123df7367d775fc40a47c3a138 100644 (file)
@@ -123,8 +123,7 @@ int debug_wait_queue_put(unsigned int v) {
 
 DECLARE_WAIT_QUEUE_HEAD(sysc_wait_queue_head);
 
-#if 1
-extern unsigned int jiffies;
+extern uint32_t jiffies;
 int sysc_wait(unsigned long cnt) {
     unsigned long flags;
     irq_save(flags);
@@ -135,39 +134,3 @@ int sysc_wait(unsigned long cnt) {
 
     schedule();
 }
-#else
-int sysc_wait(unsigned long pid) {
-    task_union *p = find_task(pid);
-
-    if (p == 0) {
-        return 0;
-    }
-
-    if (p->state == TASK_EXITING) {
-        return 0;
-    }
-
-    task_union *task = current;
-    DECLARE_WAIT_QUEUE(wait, task);
-    add_wait_queue(&p->wait, &wait);
-
-    while (true) {
-        // task->state = TASK_WAIT;
-
-        unsigned long flags;
-        irq_save(flags);
-        unsigned int state = p->state;
-        irq_restore(flags);
-
-        if (state == TASK_EXITING)  // no need irq_save
-            break;
-
-        schedule();
-    }
-
-    task->state = TASK_READY;
-    del_wait_queue(&p->wait, &wait);
-
-    return 0;
-}
-#endif