摘要:我们都知道磁盘由控制器、磁头等组件组成。我们在终端编辑文件的时候,文件内容是如何从内存到达磁盘的呢?磁盘驱动主要完成哪些工作?硬盘中断是如何触发的?等等,这些都是硬盘工作的基本原理。本文主要从“自己动手写操作系统” 出发,通过实现一个简单的硬盘驱动,来解释硬盘工作的基本原理。

1.程序执行流程:

1)task_hd()作为一个守护进程,初始化硬盘,然后一直运行,等待接收来自其他进程的消息
2)如果收到打开设备的消息,那么将执行identify(0);否则,出错信息提示
3)identify(0):想硬盘发送IDENTIFY命令,等待中断的到来,中断到来后,从数据寄存器中读取硬盘的信息
4)打印步骤3)中得到的硬盘信息

5)中断处理程序的内容:读取硬盘忙的状态;通知驱动程序

*6)文件系统向驱动程序发送“打开设备”的命令

2.疑问解答

2.1.硬盘能够接收哪些命令?有什么样的处理结果?

硬盘能够接受很多命令(都是硬件定义的,和系统无关)。这里,我们用到了IDENTIFY DEVICE 命令,下面解释一下:参考手册:AT Attachment with packet Interface 文档P113:

The IDENTIFY DEVICE command enables the host to receive parameter information from the device.

Some devices may have to read the media in order to complete this command.

When the command is issued, the device sets the BSY bit to one, prepares to transfer the 256 words of device
identification data to the host, sets the DRQ bit to one, clears the BSY bit to zero, and asserts INTRQ if nIEN
is cleared to zero. The host may then transfer the data by reading the Data register. Table 27 defines the
arrangement and meaning of the parameter words in the buffer. All reserved bits or words shall be zero.

Some parameters are defined as a 16-bit value. A word that is defined as a 16-bit value places the most
significant bit of the value on signal line DD15 and the least significant bit on signal line DD0 (see 3.2.9).

Some parameters are defined as 32-bit values (e.g., words (61:60)). Such fields are transferred using two
successive word transfers. The device shall first transfer the least significant bits, bits (15:0) of the value, on
signal lines DD(15:0) respectively. After the least significant bits have been transferred, the most significant
bits, bits (31:16) of the value, shall be transferred on DD(15:0) respectively (see 3.2.9).

Some parameters are defined as a string of ACSII characters. Such fields are transferred as defined in 3.2.9.

2.2.如何通知驱动程序?
参见inform_int()相关代码

3.其他要注意的事项

一个进程拥有哪些资源?需要到哪里注册?
PCB中的相关信息!我们添加一个任务之后,需要到task_table或者其他地方进行注册。
3.1不要忘记在proc_tabel等的相关更新

4.关于port_read:不可预取类型

IO操作有两种类型,可预取类型和不可预取类型,前者主要是RAM,后者主要是设备寄存器。你有没有对这个port_read函数感到奇怪呢?为什么连续读取多次,就能读取到不同的信息?——这是因为设备寄存器本身就是FIFO队列的接口,是一种不可预取类型。
其中,insw指令的用法如下:
INS m8, DX
从 DX 指定的 I/O 端口将字节输入 ES:(E)DI 指定的内存位置
INS m16, DX
从 DX 指定的 I/O 端口将字输入 ES:(E)DI 指定的内存位置
INS m32, DX
从 DX 指定的 I/O 端口将双字输入 ES:(E)DI 指定的内存位置
INSB
从 DX 指定的 I/O 端口将字节输入 ES:(E)DI 指定的内存位置
INSW
从 DX 指定的 I/O 端口将字输入 ES:(E)DI 指定的内存位置
INSD
从 DX 指定的 I/O 端口将双字输入 ES:(E)DI 指定的内存位置

这里,如果我们一定要记得导出port_read函数,不然这个函数无法被外部模块使用。

5.硬盘中断是如何同驱动程序交互的呢?

这里有一个非常重要的函数:hd_identify(),里面的关键过程如下:
hd_cmd_out();
interrup_wait();
port_read();

向硬盘发送命令——等待中断到来——读取数据端口

6.硬盘的构造和工作原理

硬盘内部结构由固定面板、控制电路和板、磁头、盘片、主轴、电机、接口及其它附件组成,其中磁头盘片组件是构成硬盘的核心,它封装在硬盘的净化腔体内,包括有浮动磁头组件、磁头驱动机构、盘片、主轴驱动装置及前置读写控制电路这几个部份。
我们向硬盘发送一个命令之后,硬盘控制器接受到命令,然后开始执行,命令执行完毕之后,将触发硬盘中断,通知驱动程序,数据已经准备完毕。

7.总结

现在,你脑海里有没有硬盘工作的清晰图景呢?BIOS开机检测到硬盘,将硬盘的基本信息读取到内存的特定位置,通过PCIE配置,给硬盘寄存器分配对应的端口号码;操作系统将硬盘中断绑定特定的中断处理程序(主要是驱动程序);驱动程序运行,文件系统运行,文件系统向驱动程序发送读取硬盘信息的请求,硬盘驱动向硬盘发送相应操作命令并等待硬盘中断的回应;收到硬盘中断回应之后,驱动程序读取端口数据到缓冲区,交给文件系统进行处理。

《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现相关推荐

  1. 全面剖析《自己动手写操作系统》第四章---加载Loader.bin

    全面剖析<自己动手写操作系统>第四章--FAT12文件系统    http://blog.csdn.net/zgh1988/article/details/7284834 1.突破512字 ...

  2. 《自己动手写操作系统》读书笔记——初识保护模式

    <自己动手写操作系统>读书笔记--初识保护模式 http://www.cnblogs.com/pang123hui/archive/2010/11/27/2309930.html 书本第三 ...

  3. 自己动手写操作系统之环境构建篇

    自己动手写操作系统之环境构建篇 最近开始看自己动手写操作系统,但是书中采用软盘启动很是郁闷,于是想是否可以从优盘启动呢?作为一名BIOS工程师,曾经用优盘启动过dos,linux等系统,于是做了如下尝 ...

  4. 操作系统-第九章虚拟内存

    操作系统-第九章虚拟内存 虚拟内存 内存共享 按需调页 虚拟存储需要解决的几个问题 页表中须指明对应的页是否在内存中 如何具体的区分当发生页错误时 page is invalid or isvalid ...

  5. 自己动手写操作系统--个人实践

    近期開始看于渊的<自己动手写操作系统>这本书,刚開始看就发现做系统的引导盘居然是软盘!心里那个汗啊! 如今都是U盘了,谁还用软盘.于是考虑用U盘. 于是開始下面步骤: 1.既然书上说给先要 ...

  6. 「操作系统」《自己动手写操作系统》1.1前期准备工作

    一.软硬件 1.硬件 一台计算机(笔者使用的是Win7 x64操作系统) 2.软件 点击此处下载<自己动手写操作系统>的光盘配套文件以及相应工具 汇编编译器:NASM(资源文件中有) 软盘 ...

  7. 自己动手写java虚拟机_自己动手写操作系统(要了解的知识点)

    自己动手写操作系统(开篇) 自己动手写操作系统(字符显示) 说明:Intel 8086 或者不同的处理器,开机寄存器数据可能不一样,但是大致原理差不多 了解过计算机启动的同学肯定知道,当计算机启动的时 ...

  8. 自己动手写操作系统0

    文章目录 自己动手写操作系统0 环境搭建 NASM VirtualBox 添加软盘启动 VMware 开启虚拟机 其他软件 Floppy 自己动手写操作系统0 参考余渊老师写的<自己动手写操作系 ...

  9. 自己动手写操作系统——(1)将引导写入U盘

    为什么写博客呢,想了一下,首先是为了给自己留着复习用,因为时间一长,肯定有好多东西会忘记的,在这里留个记录,以后再整理起来就不会太麻烦了:再者是为了分享一下经验,由于在下比较愚笨,说不定在哪个方面就理 ...

  10. 磨刀不误砍柴工 —— 自己动手写操作系统 入门导引

    磨刀不误砍柴工 刺猬@http://blog.csdn.net/littlehedgehog <自己动手写操作系统>其实阅读所需要的前提不过只是C和汇编了,里面涉及到很多操作系统的东西.于 ...

最新文章

  1. oracle XE解决端口占用等问题
  2. Java NIO之Selector(选择器)
  3. python3打开文件的代码_Python3 对文件操作
  4. 图解 HTTP 笔记(四)——HTTP 状态码
  5. 贝叶斯统计:Tweedie公式及其证明
  6. wxWidgets:wxMediaCtr类用法
  7. 第三讲系统的基本操作
  8. 第十九节:终于,JavaScript也有了类(class)的概念
  9. Java 9 接口私有方法
  10. ping包优化版本python
  11. 如何完全卸载MySQL
  12. linux中at重定位命令,readelf命令_Linux readelf 命令用法详解:用于显示elf格式文件的信息...
  13. Spark机器学习实例
  14. Matlab——sym和syms
  15. IT66021FN 寄存器配置
  16. mysql 历史数据迁移,MySQL 历史数据表迁移方法
  17. outlook 邮箱过期问题处理
  18. MySQL数据库引擎及区别
  19. 交易中的 “道“ 与 “术“
  20. java新手知识第二周

热门文章

  1. socket编程学习笔记:关于TCP Test Tool的安装和使用
  2. Java基础编程题(一)——用冒泡排序法从大到小排序输入的4个数
  3. 人脸识别及数据流处理
  4. 图像识别深度学习主流方案平台比较
  5. linux密码安全加固文件,LINUX安全加固方案
  6. java删除文件夹部分内容_java 删除文件夹中的所有内容而不删除文件夹本身
  7. 网易云音乐产品体验报告
  8. (IoT物联网)天线的设计步骤 - 完整收藏版
  9. 教你怎么用爬虫程序采集企业信息及电话邮箱等信息(以企查查为例)
  10. 分享2个Python处理Excel的脚本