首页
社区
课程
招聘
[求助]真机保护模式下如何通过IO端口读取硬盘
发表于: 2017-9-15 13:54 3655

[求助]真机保护模式下如何通过IO端口读取硬盘

2017-9-15 13:54
3655
我参考的是LINUX0.12的代码,在台式机上做的实验。

先是IDT表的更新,然后设置8259A中断控制器:
void hd_init()
{
	set_intr_gate(0x2e, hd_interrupt);
	outb_p(inb_p(0x21)&0xfb, 0x21);
	outb_p(inb_p(0xa1)&0xbf, 0xa1);
}

中断处理程序仅是屏幕上字符提示:
_hd_interrupt:
mov byte [ds:0xb8000],'D'
mov byte [ds:0xb8001],0x1e
jmp $


接着发送读硬盘请求:
#define HD_DATA 0x1f0


void hd_out(unsigned int drive, unsigned int nsect, unsigned int sect, unsigned int head, unsigned int cyl, unsigned int cmd) { unsigned int port = HD_DATA; outb_p(0x00, ++port); //error寄存器 outb_p(0x01, ++port); //扇区数 outb_p(0x00, ++port); //LBALow outb_p(0x00, ++port); //LBAMid outb_p(0x00, ++port); //LBAHigh outb_p(0xe0, ++port); //Device寄存器 outb_p(0x20, ++port); //cmd = 0x20 读 }


实验正确的情况应该是发送读硬盘请求后,进入中断,屏幕上打印字符。但屏幕上没有显示。不知道是程序写错了,还是8259A在现在的台式机上不兼容了,还是ATA 0x1f0起始的端口号不兼容了。如果程序写错了,请各位大虾指点一下;如果不兼容了,需要阅读哪方面的资料呢?感谢大家能帮忙!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
下一个  victoria  硬盘工具  扫描一下硬盘的端口,不一定是1F0。一些动态申请端口的需要扫描PCI配置空间获取。
2017-9-15 14:18
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
22
2017-9-15 20:33
0
游客
登录 | 注册 方可回帖
返回
//