首页 > 其他分享 >一个操作系统的设计与实现——第9章 硬盘驱动

一个操作系统的设计与实现——第9章 硬盘驱动

时间:2023-11-12 09:56:59浏览次数:40  
标签:函数 端口 扇区 hdRead HD 驱动 硬盘 操作系统

操作系统应当具备读写硬盘的能力。因此,本章将要实现的是硬盘驱动。硬盘驱动由两个函数构成:读硬盘函数与写硬盘函数。

9.1 读硬盘

想要读硬盘,就需要提供以下三个信息:

  1. 起始扇区号
  2. 读取的扇区数
  3. 数据存储的地址

需要注意的是:读取的扇区数只能是一个8字节的整数。

由于读硬盘需要使用大量的端口读写指令,所以,该函数使用汇编语言实现。

请看本章代码9/HD.h

第5行,声明了读硬盘函数。

接下来,请看本章代码9/HD.s

第1行,将编译模式设定为32位。

第3行,将读硬盘函数hdRead声明为外部链接的。

第13~15行,将读取的扇区数写入0x1f2端口。hdRead函数使用栈传参,sectorCount是第三个参数,故其在栈中的位置是[ebp + 16]

第17~32行,将起始扇区号写入0x1f3~0x1f6端口。startSectorhdRead函数的第二个参数,故其在栈中的位置是[ebp + 12]

第34~36行,将读硬盘命令0x20写入0x1f7端口。

第38~43行,等待硬盘准备就绪。

第46~47行,计算循环的总次数。一个扇区是512字节,insw指令一次处理2字节,所以,每读一个扇区,就需要256次循环。循环的总次数等于读取的扇区数左移8位。

第48行,从栈中取得数据存储的地址。tarPtrhdRead函数的第一个参数,故其在栈中的位置是[ebp + 8]

第49行,将硬盘中的数据读出。

9.2 写硬盘

写硬盘与读硬盘在实现上仅有以下不同:

  1. 写硬盘命令是0x30
  2. 当硬盘准备就绪后,需要向0x1f0端口连续写入数据

请看本章代码9/HD.h

第6行,声明了写硬盘函数。

接下来,请看本章代码9/HD.s

第58~82行,与hdRead函数一致。

第84~86行,将写硬盘命令0x30写入0x1f7端口。

第88~97行,与hdRead函数一致。

第98行,从栈中取得数据存储的地址。

第99行,将数据写入硬盘。

接下来,请看本章代码9/Makefile

第5行,将HD.s编译成ELF文件。

第6行,将HD.o文件添加到链接器。

9.3 测试

本章代码9/Kernel.c用于测试两个硬盘驱动函数。

标签:函数,端口,扇区,hdRead,HD,驱动,硬盘,操作系统
From: https://www.cnblogs.com/yingyulou/p/17825522.html

相关文章

  • 一个操作系统的设计与实现——第8章 内存管理系统
    计算机上的任何程序,包括操作系统自己,都需要使用内存。因此,操作系统需要实现内存管理系统,以进行内存的分配和回收。在我们的操作系统中,内存管理系统由两部分组成:页分配器与页回收器。本章将实现这两个部分。8.1从虚拟地址到物理地址回顾CPU对内存地址的转换过程:使用段寄存器......
  • 一个操作系统的设计与实现——第7章 中断
    7.1什么是中断中断是一种能够随时打断CPU正常工作的机制。这句话看着挺别扭的,CPU工作的好好的,为什么要"随时打断"它?这是因为,CPU需要为诸多外部设备提供服务,以键盘为例,当键盘上的键被按下时,CPU需要对此做出响应和处理,如果不能及时响应,我们会说:"电脑很卡";如果一直都不能响应,我们会......
  • 一个操作系统的设计与实现——第6章 显卡驱动
    进入内核以后,应该做些什么呢?本章将实现一个最容易看到效果的模块:显卡驱动。6.1什么是驱动驱动这个词听起来很高大上,但实际上很简单,就是硬件的接口函数。在软件工程中,可以使用接口封装和简化设计,硬件也是一样。例如:想要读硬盘,需要很多指令设定好几个端口,然后等待硬盘就绪,最后才......
  • 一个操作系统的设计与实现——第12章 任务(三):3特权级任务
    特权级是保护模式的核心概念之一,但我们的操作系统一直没有引入这个概念。这是因为,特权级只有在3特权级任务存在时才有意义。本章将要实现的是3特权级任务的加载与任务切换。12.1特权级12.1.1特权级的功能特权级(PrivilegeLevel),是保护模式中用于限制任务权限的机制。特权级有4......
  • 一个操作系统的设计与实现——第11章 任务(二):0特权级任务
    上一章中,我们的操作系统已经支持内核共享,这为任务的加载和运行做好了准备。本章将要实现的是0特权级任务的加载与任务切换。11.1任务切换的原理11.1.1协同式与抢占式任务切换如果CPU上只运行着Kernel.c的main函数,那么情况非常简单,只需要不断执行下一条指令即可。然而,如果现......
  • 一个操作系统的设计与实现——第10章 任务(一):共享内核
    一直以来,我们的操作系统在启动后,运行的都是Kernel.c中的main函数。只运行这一个函数是不够的,操作系统应当有能力加载并运行其他程序。从本章开始,将使用四章的篇幅讨论操作系统如何加载并运行任务。这里的任务(Task)与进程(Process)是同义词,在操作系统领域中,任务这个词更为常用,请读者......
  • 一个操作系统的设计与实现——第13章 任务(四):任务回收
    在前面的两章中,我们的操作系统均不支持任务回收,所以任务不能退出。本章将要实现的是任务回收功能。13.1任务回收的原理如果一个任务位于任务队列中,其就会被运行。所以,如果一个任务的运行已经结束,它就应该从任务队列中删除。仅仅将任务从任务队列中删除是不够的,这是因为任务还......
  • windows操作系统中如何将apache zookeeper安装为系统服务
    记录一下,网上有些资料是错的,prunsrv的参数要以--开头!一下载最新版的apachecommonsdaemonhttp://archive.apache.org/dist/commons/daemon/binaries/windows/commons-daemon-1.3.4-bin-windows.zip解压,复制两个exe文件到zk的bin目录下二编写服务停止脚本(启动脚本不用自己......
  • PCF8574芯片介绍及驱动方法
    (文章目录)前言本篇文章带大家学习PCF8574芯片,了解PCF8574芯片有什么作用,以及学习PCF8574的控制方法。一、PCF8574芯片介绍PCF8574是TI(TexasInstruments)公司生产的一种常见的I/O扩展芯片,用于将微控制器的少量GPIO引脚扩展为更多的GPIO接口。它采用I2C总线(串行通信协议)进行与......
  • centos7 扩展硬盘
    新增硬盘后       注意,我这里用的xfs!!!注意,文件夹不能已存在的!!尽量不要把多个硬盘挂载在同一个文件夹上!!!  vi/etc/fstab 注意,用00即可  查看uuid=>blkid/dev/sdb1  df-h ......