其实所有的驱动程序最底层不过是使用硬件的command,也就是端口的io操作,ATA设备的命令端口是1f0h-1f7h和170h-177h,控制端口是3f4h-3f7h和374h-377h。这个东西说起来话就长了。我给一个读取Primary的Master的MBR的例子。

nLegacy IO Access
( Debug.exe or Debug32.exe )
o 3F6 04     ; Channel Reset
o 3F6 00
i 1F7     ; 50 – HD exist
o 1F2 1     ; Read 1 sector
o 1F3 0     ; Set Read Start Address
o 1F4 0
o 1F5 0
o 1F6 e0    ; Select PIO Mode
o 1F7 20     ; Send Read Command
i 1F7     ; 58 – HD Data Ready
nRead Data
nByte Read
i 1F0     ; Read Data
nBlock Read
-a 100 ; Use ASM Code at cs:100
mov dx, 1F0h ; Data Port
mov si, 5000h ; Target Address Offset
mov cx, 512 ; Loop Count
Address
in al, dx ; Read Data
mov ds:[si], al ; Move Data to Target
inc si ; Increase Offset
loop address ; Loop Move
int 3 ; Debug Interrupt
-g = 100 ; Run From cs:100 to int3
-d ds:5000 ; Dump Data From cs:5000
这是在debug下操作的过程。是我们的内部学习资料,再多就不可以说了。网络上有这方面的资料,但很是零散。

--------------------------------------------------------
要想知道细节,可以找找ATA的说明书。我看网络上了解这方面的人并不算多,其实除了做硬盘和驱动的人,其他人也没有必要知道这些东西。

例子要一步步做下来,经常作软件的人很难理解硬件控制的步骤。

primary的端口是3f4h-3f7h和1f0h-1f7h。

mov dx, 3F6h ;Control Port
mov al, 04h ;Bit2-Channel Reset Bit
out dx, al ;Reset Channel
out ebh, al ;IO Delay
mov al, 00h
out dx, al ;Reset Complete
mov dx, 1f6h ;Device Select Port
mov al, 0a0h/0b0h
; 0a0h – Master
; 0b0h – Slave
out dx, al ;Select Master or Slave
mov dx, 1f7h ;Command/Status Port
in al, dx ;Read Master Status
nCompare the value of the al:
50h – Attached Device, is Hard Disk
00h – No Device Attached, or the          Attached Device is not Hard Disk
这一段就是选择Master channel的Master设备,
     mov dx, 3f6h ;Control Port
mov al, 04h ;Bit2-Channel Reset Bit
out dx, al ;Reset Channel
重起Primary channel.
  out ebh, al ;IO Delay
等待一会,因为硬件的速度比CPU要慢很多,所以需要CPU等待一会。向ebh端口的写入操作可以使CPU等待一段时间,具体是多少我忘了,大家可以查查资料。
  mov al, 00h
out dx, al ;Reset Complete
  重起完成,要清3f6h端口
   mov dx, 1f6h ;Device Select Port
mov al, 0a0h
; 0a0h – Master
; 0b0h – Slave
out dx, al ;Select Master or Slave
选择Master设备。
    mov dx, 1f7h ;Command/Status Port
in al, dx ;Read Master Status
nCompare the value of the al:
50h – Attached Device, is Hard Disk
00h – No Device Attached, or the          Attached Device is not Hard Disk
检查1f7h端口,如果是50h就说明master设备是硬盘
然后看看读硬盘的操作。
其实就是给1f1h到1f6h设置好参数,然后给1f7h端口下20h命令,这是硬件操作的一般原理,我的理解是,1f7h端口可以理解为函数名,1f2h到1f6h存放参数,返回值在1f0h端口中。
读硬盘的函数就是20h,各参数如下:
1f1h----任意
1f2h----操作的扇区数,我们读MBR,只有一个扇区,设为1
1f3h----起始LBA的bit0-bit7
1f4h----起始LBA的bit8-bit15
1f5h----起始LBA的bit16-bit23
1f6h----低四位是起始LBA的bit24-bit27,第五位是设备选择,0是master,1是slave.我们读的是master,应设为0,第七位设为1表示使用LBA,现在硬盘都使用LBA,应置起来。其他两个bit要求为1
所以,参数设定应该是:
1f2h----1h
起始LBA应该为0,因为MBR是硬盘第一个扇区也就是0扇区。
所以1f3h\1f4h\1f5h\1f6h的低四位都为0
1f6h----e0h
确保都设置好了,现在给1f7和放入20h,等1f7h变成58h,就说明数据准备好了,就可以从1f0h端口中读出数据了。
等一下做个程序发上来

[Linux]磁盘端口I/O相关推荐

  1. Windows配置端口转发绕过samba 445端口限制共享linux磁盘

    概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内 ...

  2. linux磁盘权限 /srv,Linux学习笔记之解压压缩,磁盘分区,软件包管理,权限

    关机命令  (不能直接点虚拟机右上角的x) init 0 重启命令 init 6 管道符号  |  ---- 把前一个命令的输出结果传递给后一个命令处理 ----哪些命令支持放在管道符后面  (mor ...

  3. Linux 磁盘- 存储

    目录 原笔记链接(推荐看这个) Linux 磁盘| 存储 存储介质的概念 单位概念 Linux文件系统 Linux系统结构 Linux磁盘路径与命名规则 Linux磁盘命令规则 Linux分区命名 L ...

  4. linux查看端口占用终结,Linux查看端口占用

    ​ Linux查看端口占用得情况可以使用lsof和netstat 命令 lsof ​ lsof(list open files) 是一个列出当前系统打开文件的工具. lsf查看端口占用语法格式: ls ...

  5. linux磁盘管理(MBR和GPT、接口类型)

    文章目录 存储硬件 硬盘设备和接口协议 机械硬盘 分区 分区表 MBR(MSDOS) GPT(GUID partition table) EBR linux磁盘分区 lsblk 查看分区信息 blki ...

  6. linux 日志文件被占用下不来怎么办,linux 磁盘空间被占满但找不到目标文件的问题处理 lsof命令...

    lsof简介 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能. 直接输入lsof部分输出为: 每行 ...

  7. Linux查看端口使用状态、关闭端口及配置端口方法 详细

    Linux 端口信息查看 大家都知道,端口不是独立存在的,它是依附于进程的.某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了.下次若某个进程再次开启,则相应的端口也再次开启.而不要 ...

  8. Linux常用端口总结

    linux 常用端口 常用端口 下面的表格中列举了包括在红帽企业 Linux 中的服务.守护进程.和程序所使用的最常见的通信端口.该列表还可以在 /etc/services 文件中找到.要查看由互联网 ...

  9. gnome硬盘分析_三款基于GUI和终端的实用Linux磁盘扫描工具

    [51CTO.com快译]扫描计算机硬盘主要出于两个原因:一个原因是分析硬盘,找出文件系统的不一致或错误.引起这些问题的可能因素包括:持续的系统崩溃,关键的系统软件关闭不当,更主要的是破坏性程序(比如 ...

  10. 如何扫描和修复 Linux 磁盘错误

    在本文中,将学习如何使用 fsck 和 xfs_repair 命令修复 Linux 磁盘错误. 什么是FSCK? fsck(文件系统一致性检查)是用于检查Linux操作系统文件系统一致性的工具. 列出 ...

最新文章

  1. Java 内部类及其原理
  2. python工作招聘-爬了招聘网站之后,给你几点学习Python的建议
  3. 计算机学习 -快捷键
  4. vim的全局替换[zz]把字符替换成回车
  5. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
  6. 计算机电路基础答案,计算机电路基础模拟试卷答案(B)
  7. BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表
  8. 计算机硬件密码,计算机硬件技术基础综合性实验任务书(08)密码门锁的模拟_C
  9. 如何在WES 7下使用EWF功能/HORM功能
  10. cknife连接失败
  11. 硬件科普系列之硬盘——总线、协议、接口和固态硬盘篇
  12. echarts---圆饼图
  13. cmd 命令 copy 复制文件
  14. python 编程 安卓脚本_详解基于Android的Appium+Python自动化脚本编写
  15. DELL win10插入耳机后声音仍然外放(亲测有效)
  16. sever串口wifi拓展板_基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)...
  17. outlook2016服务器设置不能修改,求助,outlook2016签名也无法编辑和修改,请工程师解决...
  18. 关于直接在网页中插入mp4视频实际应用中经历的那些事儿
  19. Android 7.0修改分辨率,三星S7升级Android7.0 可调节屏幕分辨率
  20. JavaWeb图书商城 网上书城

热门文章

  1. mysql druid读写分离_springboot+mysql+jpa+sharding-jdbc+druid读写分离
  2. 《高翔视觉slam十四讲》学习笔记 第三讲 三维空间刚体运动
  3. 计算机设备管理程序在哪,设备管理器在哪里查找?如何打开?
  4. Kotlin — 适用于服务器开发
  5. ethtool工具设置网口配置
  6. 垃圾收集(GC)中如何确定哪些内存是垃圾
  7. 【代码笔记】iOS-获得现在的时间
  8. 使用web.xml方式加载Spring时,获取Spring context的两种方式
  9. 使用索引的技巧知识点
  10. c++中的list用法[转]