一步步编写操作系统 22 硬盘操作方法

硬盘中的指令很多,各指令的用法也不同。有的指令直接往command寄存器中写就行了,有的还要在feature寄存器中写入参数,最权威的方法还是要去参考ATA手册。由于本书中用到的都是简单的指令,所以对此抽象出一些公共的步骤仅供参考之用。

不管是读硬盘还是写硬盘,都不是一个指令就完事的。相关寄存器都需要设置。要是读硬盘,得告诉读哪个扇区,读几个扇区,用哪种模式对扇区寻址,LBA?CHS?写硬盘也一样,写哪个,写几个,还要设置操作的是哪个通道的哪个硬盘……讲了这么多寄存器,有没有心里发怵?心想,我到底先设置哪个寄存器呢?有没有个一般硬盘操作的基本顺序呢?还真有,小弟马上给大家呈上大概步骤。最主要的顺序就是command寄存器一定得是最后写,因为一旦command寄存器被写入后,硬盘就开始干活啦,它才不管其它寄存器中的值对不对,一律拿来就用,有问题的话报错就好啦。其它寄存器顺序不是很重要。

那咱们可以约定个操作顺序,免得有选择恐惧症的同学感到无所适从,哈哈,抱歉,请原谅我这么说,因为我就有选择恐惧症,我很理解像我这样的同学。咱们还是约定个步骤好:

  1. 1.先选择通道,往该通道的sector count寄存器中写入待操作的扇区数。
  2. 2.往该通道上的三个LBA寄存器写入扇区起始地址的低24位。
  3. 3.往device寄存器中写入LBA地址的24~27位,并置第6位为1,使其为LBA模式,设置第4位,选择操作的硬盘(master硬盘或slave硬盘)。
  4. 4.往该通道上的command寄存器写入操作命令。
  5. 5.读取该通道上的status寄存器,判断硬盘工作是否完成。
  6. 6.如果以上步骤是读硬盘,进入下一个步骤。否则,完工。
  7. 7.将硬盘数据读出。

硬盘工作完成后,它已经准备好了数据,咱们该怎么获取呢?一般常用的数据传送方式有:

  1. 1.无条件传送方式
  2. 2.查询传送方式
  3. 3.中断传送方式
  4. 4.直接存储器存取方式(DMA)
  5. 5.I/O处理机传送方式

对于上面的第1种“无条件传送方式”,应用此方式的数据源设备一定是随时准备好了数据,cpu随时取随时拿都没问题,如寄存器、内存就是类似这样的设备,cpu取数据时不用提前打招呼。

第2种“查询传送方式”,也称为程序I/O、PIO(Programming Input/Output Model)。是指传输之前,由程序先去检测设备的状态。数据源设备在一定的条件下才能传送数据,这类设备通常是低速设备,比cpu慢很多。cpu需要数据时,先检查该设备的状态,如果状态为“准备好了可以发送”,cpu再去获取数据。硬盘有status寄存器,里面保存了工作状态,所以对硬盘可以用此方式来获取数据。

第3种“中断传送方式”,也称为中断驱动I/O。上面提到的“查询传送方式”有这样的缺陷,由于cpu需要不断查询设备状态,所以意味着只有最后一刻的查询才是有意义的,之前的查询都是发生在数据尚未没准备好的时间段里,所以说效率不高,仅对于不要求速度的系统可以采用。可以改进的地方是,如果数据源设备将数据准备好后再通知cpu来取,这样效率就高了。通知cpu可以采用中断的方式,当数据源设备准备好数据后,它通过发中断来通知cpu来拿数据,这样避免了cpu花在查询上的时间,效率较高。

第4种“直接存储器存取方式(DMA)”。在中断传送方式中,虽然极大地高高了cpu的利用率,但通过中断方式来通知cpu,cpu就要通过压栈来保护现场,还要执行传输指令,最后还要恢复现场。似乎有同学说此方式已经很爽了,你还想怎样。哈哈,其实更爽的是一点都不要浪费cpu资源,不让cpu参与传输,完全由数据源设备和内存直接传输。cpu直接到内存中拿数据就好了。这就是此方式中“直接”的意思。不过DMA是由硬件实现的,不是软件概念,所以需要DMA控制器才行。

第5种 “I/O处理机传送方式”。不知大家发现了没有,在说上面每一种的时候都把它们各自说的特别好,似乎完美不可替代了,就像电视上的广告一样,每次都把自己的产品描述的无与伦比甚至全宇宙第一,但该公司一出新产品,就开始自暴曾经无与伦比的老一代产品的问题以突显现在产品更胜一筹。DMA已经是借助其它硬件了,cpu已经很轻松了,难道还有更爽的方式?是啊,DMA方式中cpu还嫌爽的不够,毕竟数据输入之后或输出之前还是有一部分工作要由cpu来完成的,如数据交换,组合,校验。如果DMA控制器再强大一点,把这些工作帮cpu做了就好了。也是哦,既然为了解放cpu,都已经引用一个硬件(DMA)了,干脆一不做二不休,再引入一个硬件吧。于是,I/O处理机诞生啦,听名字就知道它专门用于处理IO,并且它其实是一种处理器,只不过用的是另一套擅长IO的指令系统,随时可以处理数据。有了I/O处理机的帮忙,cpu甚至可以不知道有传输这回事,这下cpu才真正爽到家啦。同样,这也是需要单独的硬件来支持。

综上所述,硬盘不符合第1种方法,因为它需要在某种条件下才能传输。第4种和第5种需要单独的硬件支持,先不说我们的bochs能否模拟这两种硬件,单独学习这两类硬件的操作方法就很头疼,大家有兴趣的话还是先放一放,以后再琢磨吧。所以在我们的系统中,我们用了第2、3这两种软件传输方式。

关于硬盘的部分介绍完了,接下来的工作是实践,我记得当初自己做实验时的是心情是非常忐忑的,总是担心有些东西不可控,有些东西自己左右不了。如果您此时的心情也是这样,那我用“过来人”的经验告诉您,想太多也没有用,做就是了,只有做超出自己能力的事才能提高,总做自己能力内的事,咱们大家连走路都不会呢。再说啦,即使是恶梦也会有醒来的一刻,烦事都会过去的,扛吧兄弟,我相信,艰辛过后,您会看到更加强大的自己(这是我说的吗,好感动)。

【再续】

本书内容来自《操作系统真象还原》,请大家支持正版,多谢。

一步步编写操作系统 22 硬盘操作方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.深度学习练习:Convolutional Neural Networks: Step by Step(强烈推荐)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - Packages 2 - Outline of the Assignment 3 - Convolutional Neural Networks 3.1 - Zero-Paddin…

一步步编写操作系统 23 重写主引导记录mbr

本节我们在之前MBR的基础上,做个稍微大一点的改进,经过这个改进后,我们的MBR可以读取硬盘。听上去这可是个大“手术”呢,我们要将之前学过的知识都用上啦。其实没那么大啦,就是加了个读写磁盘的函数而已,哈…

11.深度学习练习:Keras tutorial - the Happy House(推荐)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ Welcome to the first assignment of week 2. In this assignment, you will: Learn to use Keras, a high-lev…

一步步编写操作系统 24 编写内核加载器

这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核。本节只实现一个简单的loader,本loader只在实模式下工作,等学习了保护模式…

12.深度学习练习:Residual Networks(注定成为经典)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - The problem of very deep neural networks 2 - Building a Residual Network 2.1 - The identity…

13.深度学习练习:Autonomous driving - Car detection(YOLO实战)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ Welcome to your week 3 programming assignment. You will learn about object detection using the very pow…

14.深度学习练习:Face Recognition for the Happy House

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ Welcome to the first assignment of week 4! Here you will build a face recognition system. Many of the i…

java Integer 源码学习

转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类…

15.深度学习练习:Deep Learning Art: Neural Style Transfer

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - Problem Statement 2 - Transfer Learning 3 - Neural Style Transfer 3.1 - Computing the cont…

【2018icpc宁夏邀请赛现场赛】【Gym - 102222F】Moving On(Floyd变形,思维,离线处理)

https://nanti.jisuanke.com/t/41290 题干: Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn. Each city has a risk of kidnapping or robbery. Firdawss home locates in the city uu, and Fatinahs home locates in the…

动手学PaddlePaddle(1):线性回归

你将学会: 机器学习的基本概念:假设函数、损失函数、优化算法数据怎么进行归一化处理paddlepaddle深度学习框架的一些基本知识如何用paddlepaddle深度学习框架搭建全连接神经网络参考资料:https://www.paddlepaddle.org.cn/documentation/doc…

Apollo进阶课程㉒丨Apollo规划技术详解——Motion Planning with Autonomous Driving

原文链接:进阶课程㉒丨Apollo规划技术详解——Motion Planning with Autonomous Driving 自动驾驶车辆的规划决策模块负责生成车辆的行驶行为,是体现车辆智慧水平的关键。规划决策模块中的运动规划环节负责生成车辆的局部运动轨迹,是决定车辆…

JVM核心之JVM运行和类加载全过程

为什么研究类加载全过程? 有助于连接JVM运行过程更深入了解java动态性(解热部署,动态加载),提高程序的灵活性类加载机制 JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成J…

【2018icpc宁夏邀请赛现场赛】【Gym - 102222A】Maximum Element In A Stack(动态的栈中查找最大元素)

https://nanti.jisuanke.com/t/41285 题干: As an ACM-ICPC newbie, Aishah is learning data structures in computer science. She has already known that a stack, as a data structure, can serve as a collection of elements with two operations: push, …

动手学PaddlePaddle(2):房价预测

通过这个练习可以了解到: 机器学习的典型过程: 获取数据 数据预处理 -训练模型 -应用模型 fluid训练模型的基本步骤: 配置网络结构: 定义成本函数avg_cost 定义优化器optimizer 获取训练数据 定义运算场所(place)和执行器(exe) 提供数…

JAVA 堆栈 堆 方法区 解析

基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。 方法的引用…

动手学PaddlePaddle(3):猫脸识别

你将学会: 预处理图片数据 利用PaddlePaddle框架实现Logistic回归模型: 在开始练习之前,简单介绍一下图片处理的相关知识: 图片处理 由于识别猫问题涉及到图片处理知识,这里对计算机如何保存图片做一个简单的介绍。在…

Java对象分配原理

Java对象模型: OOP-Klass模型 在正式探讨JVM对象的创建前,先简单地介绍一下hotspot中实现的Java的对象模型。在JVM中,并没有直接将Java对象映射成C对象,而是采用了oop-klass模型,主要是不希望每个对象中都包含有一份虚函数表&…

动手学PaddlePaddle(4):MNIST(手写数字识别)

本次练习将使用 PaddlePaddle 来实现三种不同的分类器,用于识别手写数字。三种分类器所实现的模型分别为 Softmax 回归、多层感知器、卷积神经网络。 您将学会 实现一个基于Softmax回归的分类器,用于识别手写数字 实现一个基于多层感知器的分类器&#…

动手学PaddlePaddle(5):迁移学习

本次练习,用迁移学习思想,结合paddle框架,来实现图像的分类。 相关理论: 1. 原有模型作为一个特征提取器: 使用一个用ImageNet数据集提前训练(pre-trained)好的CNN,再除去最后一层全连接层(fully-connecte…