从存储区提供程序的数据读取器中进行读取时出错_计算机是如何从磁盘读取数据的?...

No.1

读写的基本原理

磁盘的两面涂有磁性材料,根据N,S可以来记录0,1两种状态。

写入数据时,磁头电磁铁改变极性材料的磁性来写数据。

addf55568aabf1f5e488025500c5d21d.gif

读入数据时,磁头的读取器可以得到磁性材料的极性然后还原成0,1电信号。

c625a9ffaaea9218764a42e764bc54cd.png

No.2

处理器对磁盘的控制

35324e84bbc6f6c3a70bf2230c2440db.png

再来回顾一下8086下1M内存的分配,我们先前已经介绍过在统一编址的模式下,显存对应的区域是0xb8000-0xbffff,通过操作这里相应的内存就可以控制显示器上显示的字符。这里磁盘的访问采用的是独立编址的方式。我的理解是好比一个单刀双掷开关拨到左边执行的是左边的电路,拨到右边执行右边的。处理器是通过一个M/IO#引脚,访问内存的时候M/IO#呈高电平状态,当要表示处理I/O端口的时候呈低电平状态,M/IO#中的#表示IO低电平有效。

e49d831c746018c9fa024b7d805118a3.png

磁盘有SATA、PATA和IDE三种接口,但是我电脑上的两个都是SATA接口。它们通过IO接口连接在地址总线上,由CPU传送指令给他们进行相应的操作。操作端口的指令是in和out。

  • in al/ax 源操作数

  • out 目的操作数 al/ax

这样看来它们对寄存器操作数都是有一定限制。

No.3

通过控制端口对扇区进行读写

对磁盘的读写都是以扇区为单位,每次是512B。物理上磁盘分成一个一个扇区,逻辑上也应该分区,就像虚拟内存一样让程序员不用去考虑它在物理上是如何分配的只要操作逻辑扇区就可以了。另外需要注意,物理扇区是从1扇区开始,而逻辑扇区是从0扇区开始的。磁盘的逻辑扇区可以用28位表示称为LBA28,也可以用48位表示称为LBA48,位数多自然表示的逻辑扇区就多能控制的磁盘也大。

No.4

举例演示

下面演示以LBA28为例如何通过端口读取主磁盘上(0x1f0-0x1f7)从逻辑2扇区开始的一个扇区的数据:

1.将要读取的扇区写入0x1f2端口

e870f258fa0c2a739de2e8af5935fb85.png

2.设置要读取的起始扇区

LBA28逻辑扇区号需要占据28位。一个端口只有8位,所以需要3.5个端口。这3.5个端口是这样分配的:0x1f3-0x1f5正常使用,至于0x1f6的高四位用作其他标志,4位0表示主盘,1表示从盘,6位1表示LBA模式,0表示CHS模式。

e0e6354f53bd10f9072d19d3f81d128f.png b61efcf6da509d643c81ec4f652bb1d8.png

3.向端口0x1f7写入读取指令0x20

09caabb9e84ccd7af4cb3eed90fe43eb.png

4.等待读取操作完成

判断读取操作是否完成也是通过0x1f7端口,所以0x1f7既是一个命令端口也是一个状态端口。当且仅当该端口不忙(表示数据已经读完)且准备好和主机交换数据的时候才可以取得数据。所以当我们把读指令写入0x1f7之后就需要查看该端口的状态。

0ff480a32cab0324ba38ab994bac77b9.png abc58a2d367e30dacd82066b0db76934.png

5.取出数据

8个端口我们使用了4+1+1个还剩下0x1f0和0x1f1两个端口,而0x1f0就是作为数据端口来供我们存取数据的,0x1f1端口是存储出错时候的一些错误信息,最后我们循环从数据端口读出数据即可。

a6469dd84c37ba8e03acb9f4976df8be.png

文章转自:小组18级成员--高星坤

462f87f9d254d4e9d700ca3ada471008.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值