]> Zhao Yanbai Git Server - kernel.git/commitdiff
硬盘提示信息修改
authoracevest <zhaoyanbai@126.com>
Wed, 17 May 2023 14:58:28 +0000 (22:58 +0800)
committeracevest <zhaoyanbai@126.com>
Wed, 17 May 2023 14:58:35 +0000 (22:58 +0800)
Makefile
drivers/ata.c
kernel/exec.c
qemu.sh

index c4903f07989a6ae7f99929105667a07017339ac6..70fc7562f93a03b2cb2a67c440cdeacbcf433595 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,9 @@ else ifeq ($(OS), Linux)
 endif
 
 
-CFLAGS         = -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"' -DFIX_SYSENTER_ESP_MODE=1
+CFLAGS         = -g -c -fno-builtin -m32 -DBUILDER='"$(shell whoami)"'
+CFLAGS     += -DFIX_SYSENTER_ESP_MODE=1
+#CFLAGS     += -DPCI_RW_ALIGN_MODE
 SYSTEMMAP      = System.map
 KERNELBIN      = KERNEL.BIN
 LINKSCRIPT     = scripts/link.ld
index 3c2162583e631e8c1ee6c15adee22532f5071061..a981df9e262a2e0eefb12b782ead08dce2974f38 100644 (file)
@@ -75,14 +75,13 @@ void ide_ata_init() {
 
         uint8_t status = inb(REG_STATUS(dev));
         if (status == 0 || (status & ATA_STATUS_ERR) || (status & ATA_STATUS_RDY == 0)) {
-            printk("ata[%d] not exists: %x\n", i, status);
             ide_drives[i].present = 0;
             continue;
         } else {
             ide_drives[i].present = 1;
         }
 
-        printk("ata[%d] exists: %x\n", i, status);
+        printk("ata[%d] status %x %s exists\n", i, status, ide_drives[i].present == 1 ? "" : "not");
         insl(REG_DATA(dev), identify, SECT_SIZE / sizeof(uint32_t));
 
         // 第49个word的第8个bit位表示是否支持DMA
@@ -90,17 +89,18 @@ void ide_ata_init() {
         // 第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");
             ide_drives[i].dma = 1;
         }
 
+        u64 max_lba = *(u64 *)(identify + 100);
+
         if ((identify[83] & (1 << 10)) != 0) {
-            printk("support LBA48\n");
             ide_drives[i].lba48 = 1;
-            u64 lba = *(u64 *)(identify + 100);
-            ide_drives[i].max_lba = lba;
-            printk("hard disk size: %u MB\n", (lba * 512) >> 20);
+            ide_drives[i].max_lba = max_lba;
         }
+
+        printk("hard disk %s %s size: %u MB\n", ide_drives[i].dma == 1 ? "DMA" : "",
+               ide_drives[i].lba48 == 1 ? "LBA48" : "LBA28", (max_lba * 512) >> 20);
     }
 }
 
@@ -281,7 +281,7 @@ int ata_pio_read_ext(int dev, uint64_t pos, uint16_t count, int timeout, void *d
     // 先写扇区数的高字节
     outb((count >> 8) & 0xFF, REG_NSECTOR(dev));
 
-    // 接着写LBA48,高三个字节
+    // 接着写LBA48,高三个字节q
     outb((pos >> 24) & 0xFF, REG_LBAL(dev));
     outb((pos >> 32) & 0xFF, REG_LBAM(dev));
     outb((pos >> 40) & 0xFF, REG_LBAH(dev));
index b2afffa39be16d48b7359a757987eb3698148c9e..cac3df4fb9889ee777fbc5c29f7ec24d2f9c9972 100644 (file)
@@ -28,8 +28,8 @@ void put_paging(unsigned long vaddr, unsigned long paddr, unsigned long flags) {
     assert(PAGE_ALIGN(vaddr) == vaddr);
     assert(PAGE_ALIGN(paddr) == paddr);
 
-    unsigned int npde = get_npd(vaddr);
-    unsigned int npte = get_npt(vaddr);
+    unsigned int npde = get_npde(vaddr);
+    unsigned int npte = get_npte(vaddr);
 
     pde_t *page_dir = (pde_t *)pa2va(current->cr3);
     pte_t *page_table = (pte_t *)PAGE_ALIGN(page_dir[npde]);
diff --git a/qemu.sh b/qemu.sh
index 83cecf8a7d46b0c04e6ede1e847ed3f413cd7303..4f7cb2c3d5d301b64296dfc23ae43b4470d90027 100755 (executable)
--- a/qemu.sh
+++ b/qemu.sh
@@ -1,4 +1,5 @@
 qemu-system-i386 \
+    -device ich9-ahci,id=ahci \
     -boot d \
     -drive file=HD.IMG,format=raw,index=0,media=disk \
     -drive file=kernel.iso,index=1,media=cdrom \