免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 992 | 回复: 0
打印 上一主题 下一主题

[硬件及驱动] 我写的内核无法在真机上读硬盘。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-26 11:08 |只看该作者 |倒序浏览



My kernel can read hard disk on qemu or bochs, but can't read hard disk on real machine.
我的内核可以在虚拟机qemu或bochs里读取硬盘,但是在真机上,读状态寄存器总是得到0xFF
I always get 0xFF when I execute inb(0x1F7) under the real machine.
  1. #define IDE_BSY      0x80
  2. #define IDE_DRDY   0x40
  3. #define IDE_DF      0x20
  4. #define IDE_ERR      0x01

  5. ide_wait_ready(bool check_error)
  6. {
  7.    int num = 0x10000;
  8.    int r;

  9.    while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY) {
  10.       if (--num == 0) {
  11.            return -1;
  12.    }
  13.    if (check_error && (r & (IDE_DF|IDE_ERR)) != 0)
  14.       return -1;
  15.    return 0;
  16. }
复制代码
  1. int
  2. ide_read(uint32_t secno, void *dst, uint32_t driver ,size_t nsecs)
  3. {
  4.    int r;

  5.    assert(nsecs <= 256);
  6.    
  7.    ide_wait_ready(0);

  8.    

  9.    outb(0x1F2, nsecs);
  10.    outb(0x1F3, secno & 0xFF);
  11.    outb(0x1F4, (secno >> 8) & 0xFF);
  12.    outb(0x1F5, (secno >> 16) & 0xFF);
  13.    outb(0x1F6, 0xE0 | ((driver&1)<<4) | ((secno>>24)&0x0F));
  14.    outb(0x1F7, 0x20);   // CMD 0x20 means read sector
  15.    
  16.    for (; nsecs > 0; nsecs--, dst += SECTSIZE) {
  17.       if ((r = ide_wait_ready(1)) < 0)
  18.          return r;
  19.       insl(0x1F0, dst, SECTSIZE/4);
  20.    }
  21.    
  22.    return 0;
  23. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP