当前位置:  技术问答>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

    
 
 

您可能感兴趣的文章:

  • 使用lvm做xen虚拟机硬盘,但进入虚拟机后,发现硬盘大小跟lvm大小不一样
  • 如何使用使用USB硬盘??
  • 急救!初装Linux,无意使用中自动分区。破坏硬盘dos分区,如何挽救硬盘数据?
  • 移动硬盘使用问题求解?百分相赠!!
  • 编程技术其它 iis7站长之家
  • 有关LINUX与WIN2000系统共同使用硬盘的问题
  • 已经安装到移动硬盘上的ubuntu怎样在其它电脑上使用
  • 使用vmware + demaon Tool + KNOPPIX_V3.3-2004-02-16-EN下挂接一硬盘的扩展分区,怎么读写这个硬盘?
  • 为什么我的Linux不能使用USB硬盘???
  • 请问在linux下怎么使用scsi硬盘?
  • 求助:关于在LINUX使用移动硬盘的问题?
  • 怎样使用硬盘的挂载?
  • 如何查看分区情况和硬盘空间使用情况?
  • 在linux下如何使用usb移动硬盘
  • 急问:如何在linux中使用优盘或者移动硬盘
  • linux 下两个硬盘进行复制,用DD该如何使用????
  • linux 将内存当硬盘使用问题
  • 超级菜鸟问题:使用VMware安装linux会删除硬盘上的数据吗?
  • [200分]在原来一块硬盘上已经安装rh linux9的电脑上,如何加一块新买的硬盘,新硬盘也在linux系统使用!最好给个详细的步骤
  • 关于LINUX下USB硬盘使用
  • 高手求救,在windows下访问linux服务器时使用如\192.168.100.1,但是访问失败,问在linux上要怎么设置啊
  • 如何使用代理访问CVS?
  • 如何使用Servlet访问服务器上的文件夹?
  • ubuntu下tomcat怎么使用80端口访问
  • dos下如何使用网卡,访问局域网资源
  • 请问使用或安装什么软件能够实现Win2000下访问Linux分区?
  • 如何使用root用户通过FTP访问Linux ?
  • Linux下使用C++互斥访问文件+消息队列
  • ubuntu 中 使用 root 用户 mount 一个文件夹后,一般用户怎么访问这个文件加?
  • 解决jsp页面使用网络路径访问图片的乱码问题
  • 我使用校园网的代理服务,但只能上 internet,却访问不了本校主页,那里设置不对
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3