当前位置: 技术问答>linux和unix
使用I/O 访问硬盘
来源: 互联网 发布时间:2016-05-09
本文导语: 试图使用I/O操作的方式从硬盘读取数据。大致流程如下:在0x1f2~0x1f6中设置磁头、扇区、柱面等参数,0x1f7中设置读取命令0x20,判断状态寄存器0x1f,从数据寄存器0xf0中读取数据。 结果不能正常得到数据,请指教! 源代...
试图使用I/O操作的方式从硬盘读取数据。大致流程如下:在0x1f2~0x1f6中设置磁头、扇区、柱面等参数,0x1f7中设置读取命令0x20,判断状态寄存器0x1f,从数据寄存器0xf0中读取数据。
结果不能正常得到数据,请指教!
源代码:
#include
#include
#include
#include /* for glibc */
#include
#define IO_READ 1
#define IO_WRITE 2
#define IO_RDWR (IO_READ | IO_WRITE)
/*
AT 硬盘控制器寄存器端口及作用
端口 名称 读操作 写操作
0x1f0 HD_DATA 数据寄存器 -- 扇区数据(读、写、格式化)
0x1f1 HD_ERROR 错误寄存器(错误状态) 写前预补偿寄存器
0x1f2 HD_NSECTOR 扇区数寄存器 -- 扇区数(读、写、检验、格式化)
0x1f3 HD_SECTOR 扇区号寄存器 -- 起始扇区(读、写、检验)
0x1f4 HD_LCYL 柱面号寄存器 -- 柱面号低字节(读、写、检验、格式化)
0x1f5 HD_HCYL 柱面号寄存器 -- 柱面号高字节(读、写、检验、格式化)
0x1f6 HD_CURRENT 驱动器/磁头寄存器 -- 驱动器号/磁头号(101dhhhh, d=驱动器号,h=磁头号)
0x1f7 HD_STATUS 主状态寄存器 (HD_STATUS) 命令寄存器 (HD_COMMAND)
0x3f6 HD_CMD --- 硬盘控制寄存器 (HD_CMD)
0x3f7 数字输入寄存器(与 1.2M 软盘合用) ---
*/
//IO端口定义
#define HD_DATA_IOPORT 0x1F0
#define HD_ERROR_IOPORT 0x1F1
#define HD_NSECTOR_IOPORT 0x1F2
#define HD_SECTOR_IOPORT 0x1F3
#define HD_LCYL_IOPORT 0x1F4
#define HD_HCYL_IOPORT 0x1F5
#define HD_CURRENT 0x1F6
#define HD_STATUS 0x1F7
#define HD_COMMAND 0x1F7
int main() {
int i=0;
ioperm(HD_DATA_IOPORT,8,IO_READ|IO_WRITE);
//设置磁头号 磁盘0,磁头0
//outportb(HD_CURRENT,0xa0);
outb(0xa0, HD_CURRENT);
//设置读入的扇区数量
outb(0x01, HD_NSECTOR_IOPORT);
//设置扇区号 扇区 1
outb(0x01, HD_SECTOR_IOPORT);
//设置柱面号 柱面 0
outb(0x0, HD_LCYL_IOPORT);
outb(0x0, HD_HCYL_IOPORT);
//设置命令--读取
outb(0x20, HD_COMMAND);
unsigned char buffer[512]= { 0 };
unsigned char c;
for (i=0; i
结果不能正常得到数据,请指教!
源代码:
#include
#include
#include
#include /* for glibc */
#include
#define IO_READ 1
#define IO_WRITE 2
#define IO_RDWR (IO_READ | IO_WRITE)
/*
AT 硬盘控制器寄存器端口及作用
端口 名称 读操作 写操作
0x1f0 HD_DATA 数据寄存器 -- 扇区数据(读、写、格式化)
0x1f1 HD_ERROR 错误寄存器(错误状态) 写前预补偿寄存器
0x1f2 HD_NSECTOR 扇区数寄存器 -- 扇区数(读、写、检验、格式化)
0x1f3 HD_SECTOR 扇区号寄存器 -- 起始扇区(读、写、检验)
0x1f4 HD_LCYL 柱面号寄存器 -- 柱面号低字节(读、写、检验、格式化)
0x1f5 HD_HCYL 柱面号寄存器 -- 柱面号高字节(读、写、检验、格式化)
0x1f6 HD_CURRENT 驱动器/磁头寄存器 -- 驱动器号/磁头号(101dhhhh, d=驱动器号,h=磁头号)
0x1f7 HD_STATUS 主状态寄存器 (HD_STATUS) 命令寄存器 (HD_COMMAND)
0x3f6 HD_CMD --- 硬盘控制寄存器 (HD_CMD)
0x3f7 数字输入寄存器(与 1.2M 软盘合用) ---
*/
//IO端口定义
#define HD_DATA_IOPORT 0x1F0
#define HD_ERROR_IOPORT 0x1F1
#define HD_NSECTOR_IOPORT 0x1F2
#define HD_SECTOR_IOPORT 0x1F3
#define HD_LCYL_IOPORT 0x1F4
#define HD_HCYL_IOPORT 0x1F5
#define HD_CURRENT 0x1F6
#define HD_STATUS 0x1F7
#define HD_COMMAND 0x1F7
int main() {
int i=0;
ioperm(HD_DATA_IOPORT,8,IO_READ|IO_WRITE);
//设置磁头号 磁盘0,磁头0
//outportb(HD_CURRENT,0xa0);
outb(0xa0, HD_CURRENT);
//设置读入的扇区数量
outb(0x01, HD_NSECTOR_IOPORT);
//设置扇区号 扇区 1
outb(0x01, HD_SECTOR_IOPORT);
//设置柱面号 柱面 0
outb(0x0, HD_LCYL_IOPORT);
outb(0x0, HD_HCYL_IOPORT);
//设置命令--读取
outb(0x20, HD_COMMAND);
unsigned char buffer[512]= { 0 };
unsigned char c;
for (i=0; i