626788149 发表于 2015-12-26 11:03

我写的内核无法在真机上读硬盘。

本帖最后由 626788149 于 2015-12-26 11:05 编辑

My kernel can read hard disk on qemu or bochs, but can't read hard disk on real machine.

I always get 0xFF when I execute inb(0x1F7) under the real machine.#define IDE_BSY      0x80



#define IDE_DRDY   0x40
#define IDE_DF      0x20
#define IDE_ERR      0x01

ide_wait_ready(bool check_error)
{
   int num = 0x10000;
   int r;

   while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY) {
      if (--num == 0) {
         return -1;
   }
   if (check_error && (r & (IDE_DF|IDE_ERR)) != 0)
      return -1;
   return 0;
}
int
ide_read(uint32_t secno, void *dst, uint32_t driver ,size_t nsecs)
{
   int r;

   assert(nsecs <= 256);
   
   ide_wait_ready(0);

   

   outb(0x1F2, nsecs);
   outb(0x1F3, secno & 0xFF);
   outb(0x1F4, (secno >> 8) & 0xFF);
   outb(0x1F5, (secno >> 16) & 0xFF);
   outb(0x1F6, 0xE0 | ((driver&1)<<4) | ((secno>>24)&0x0F));
   outb(0x1F7, 0x20);   // CMD 0x20 means read sector
   
   for (; nsecs > 0; nsecs--, dst += SECTSIZE) {
      if ((r = ide_wait_ready(1)) < 0)
         return r;
      insl(0x1F0, dst, SECTSIZE/4);
   }
   
   return 0;
}
页: [1]
查看完整版本: 我写的内核无法在真机上读硬盘。