- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
学习操作系统原理最好的方法是自己写一个简单的操作系统.
我们前面已经讲过硬盘控制器是一种I/O接口,CPU通过它就能间接的读写硬盘。硬盘控制器主要有IDE和SATA两种,我们这里只考虑IDE控制器。 电脑里硬盘控制器有2个,一个叫主控制器,另一个叫从控制器。而每个硬盘控制器能连接两个硬盘,一个叫主盘,另一个叫从盘。所以一般一台电脑里最多能安装4个硬盘.
硬盘控制器上的端口很多,下表中只列出我们可能用到的.
I/O端口号 | 端口用途 | 端口位数 | |||
---|---|---|---|---|---|
主控制器 | 从控制器 | 读取操作 | 写入操作 | ||
0x1f0 | 0x170 | Data | Data | 16 | |
0x1f1 | 0x171 | Error | Features | 8 | |
0x1f2 | 0x172 | Sector count | Sector count | 8 | |
0x1f3 | 0x173 | LBA low | LBA low | 8 | |
0x1f4 | 0x174 | LBA mid | LBA mid | 8 | |
0x1f5 | 0x175 | LBA high | LBA high | 8 | |
0x1f6 | 0x176 | Device | Device | 8 | |
0x1f7 | 0x177 | Status | Command | 8 |
关于上面这张表,其中的端口号不用记,用的时候翻看一下这里就行。从控制器与主控制器除了端口号不同,其它完全相同,以下我们以主控制器为例讲解。需要注意的是同一个端口在读端口和写端口两种操作下可能用途不一样,比如上表里的0x1f1和0x1f7.
首先看第1个端口0x1f0,它是这个表中唯一的16位端口,其它都是8位。从硬盘读取的数据或向硬盘写入的数据都是经过这个端口中转的。之前我们讲过硬盘是按扇区读写的,每个扇区都是512个字节,对硬盘每次读写的数据量都是512字节的整数倍。而这个端口是16位,也就是2个字节。如果你要读取一个扇区的数据,需要从这个端口连续读取256次。同样,写一个扇区,也需要向这个端口连续写入256次.
下面来看第二个端口0x1f1,在8个端口中,GrapeOS没有用到这个端口,其它都用到了。虽然没有用到,但还是简单介绍一下。当读操作时,里面保存的是错误信息;当写操作时,曾经需要向该端口写入一些参数,目前已废弃.
继续看第三个端口0x1f2,该端口保存的是读取或写入硬盘的扇区数量。该端口是8位端口,取值范围是0~255,但当设置为0时,表示读或写256个扇区。也就是说一次读写操作,最多读写256个扇区.
往下3个端口0x1f3、0x1f4、0x1f5是存放读取或写入硬盘时的起始扇区编号。这里用的扇区编号方式叫LBA或LBA28,意思是扇区从0开始编号,用28位二进制数来表示扇区号,最多表示2的28次方个扇区,由于每个扇区512字节,所以最大支持128GB的硬盘。对GrapeOS来说足够了。这里需要注意的是28位是3个半字节,这里的3个端口中,0x1f3存放LBA中的最低1个字节(0 ~ 7位),0x1f4存放中间的那个字节(8 ~ 15位),0x1f5存放高处的那个字节(16 ~ 23位),还剩下最高的半个字节(24 ~ 27位)存放在下个端口0x1f6中.
接着看0x1f6端口。这个端口中的低4位存放LBA中的最高4位(24~27位)。第4位0表示主盘,1表示从盘。第6位表示扇区寻址模式,0表示CHS,是一种古老的模式,1表示LBA,我们选LBA。另外第5位和第7位固定为1。参见下表:
bit | 内容 | 说明 |
---|---|---|
7 | 1 | 固定为1。 |
6 | MOD | 选择寻址模式,0为CHS模式,1为LBA模式。 |
5 | 1 | 固定为1。 |
4 | DEV | 选择硬盘驱动器,0为主硬盘,1为从硬盘。 |
3 | [27] | LBA地址的第24~27位。 |
2 | [26] | |
1 | [25] | |
0 | [24] |
我们来看最后一个端口0x1f7,这个端口有两种用途。 如果读取该端口,该端口将作为状态端口,可以获得硬盘的状态信息。如下表所示,该端口8个位中已经有4个位废弃了,有用的是另外4个位.
bit | 内容 | 说明 |
---|---|---|
7 | BSY | 此位为1表示硬盘正忙,勿扰。 |
6 | DRDY | 此位为1表示设备就绪,等待指令。 |
5 | 已废弃。 | |
4 | 已废弃。 | |
3 | DRQ | 此位为1表示可以从数据端口读写硬盘数据了。 |
2 | 已废弃。 | |
1 | 已废弃。 | |
0 | ERR | 此位为1表示有错误发生,错误信息见Error寄存器。 |
如果写入该端口时,该端口将作为命令端口,需要向该端口写入合适的命令。在GrapeOS中只用到两个命令:
在GrapeOS中只有一块硬盘,安装在了主硬盘控制器主盘的位置,下面讲解读写硬盘时的操作步骤.
读硬盘操作和写硬盘操作都是7个步骤,其中只有第5步和第7步不同,其它步骤完全相同.
本讲视频版地址: https://www.bilibili.com/video/BV1854y1M7vx/ 配套的代码与资料在: https://gitee.com/jackchengyujia/grapeos-course GrapeOS操作系统交流QQ群:643474045 。
最后此篇关于自己动手从零写桌面操作系统GrapeOS系列教程——19.硬盘读写理论知识的文章就讲到这里了,如果你想了解更多关于自己动手从零写桌面操作系统GrapeOS系列教程——19.硬盘读写理论知识的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!