由于最近在学习linux0.11内核,需要用到软盘启动,于是就抽空学习了一下软盘结构;

1、软盘结构
1.44软盘结构:2个盘面(0和1),一个盘面有80条磁道(或称磁柱),一个磁道有18个扇区,一个扇区大小为512Byte,于是软盘总容量:2*80*18*512Byte=1474560Byte=1.44M;
2、相对扇区号及转换
在系统中,于是可以通过盘面+磁道+扇区,就访问到相应的内容,但这明显比较繁琐,于是为了管理和使用方面,就有了相对扇区号概念,实质是给每个扇区编号;
相对扇区即从0开始依次对磁盘上的扇区进行编号,具体情况如下:
编号顺序:
扇区物理号 相对扇区号
0面,0道,1扇区 0
0面,0道,2扇区 1
0面,0道,3扇区 2
…………………….
0面,0道,18扇区 17
1面,0道,1扇区 18
……………
1面,0道,18扇区 35
0面,1道,1扇区 36
...................
0面,1道,18扇区 53
1面,1道,1扇区 54
于是从上述编号可以推算出相对扇区号的计算方法:
相对扇区号={盘面(0~1)*每条磁道扇区数(18)} + {2*磁道(0~79)*每条磁道扇区数(18)} + {扇区(1-18)-1};
而当知道相对扇区号,怎么推算出盘面、磁道、扇区呢?
具体步骤:
(1)从上面公式可以看出,相对扇区号对每条磁道扇区数(18)取余数 加1 就得到扇区;
(2)再根据(1)得到的商,如果盘面为1则商为奇数,否则为偶数,于是通过判断商的奇偶性,就可以得出盘;同时也可以算出磁道;
3、软盘读写
在系统中,是怎么读和写软盘?
通过BIOS中断13,详细见下图:

其中:
磁盘号:指的是软盘中的磁道或磁柱;
扇区号:指的是软盘的扇区;
CH存放磁道的低8位,CL的高两位存放磁道的高2位,CL的低6位存放扇区
磁头号:指的是软盘中的盘面;
驱动器号:指具体的软盘,如软盘A,软盘B...
CF为1则表示读取错误;
4、实例
通过如下具体的例子,大家可以更好的理解;(注:以下例子摘自网上http://blog.youkuaiyun.com/littlehedgehog/article/details/2147361)
;----------------------------------------------------------------------------
; 函数名: ReadSector
;----------------------------------------------------------------------------
; 作用:
; 从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
ReadSector:
; -----------------------------------------------------------------------
; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
; -----------------------------------------------------------------------
; 设扇区号为 x
; ┌ 柱面号 = y >> 1
; x ┌ 商 y ┤
; -------------- => ┤ └ 磁头号 = y & 1
; 每磁道扇区数 │
; └ 余 z => 起始扇区号 = z + 1
push bp
mov bp, sp
sub esp, 2 ; 辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]
mov byte [bp-2], cl
push bx ; 保存 bx
mov bl, [BPB_SecPerTrk] ; bl: 除数
div bl ; y 在 al 中, z 在 ah 中
inc ah ; z ++
mov cl, ah ; cl <- 起始扇区号
mov dh, al ; dh <- y
shr al, 1 ; y >> 1 (其实是 y/BPB_NumHeads, 这里BPB_NumHeads=2)
mov ch, al ; ch <- 柱面号
and dh, 1 ; dh & 1 = 磁头号
pop bx ; 恢复 bx
; 至此, "柱面号, 起始扇区, 磁头号" 全部得到 ^^^^^^^^^^^^^^^^^^^^^^^^
mov dl, [BS_DrvNum] ; 驱动器号 (0 表示 A 盘)
.GoOnReading:
mov ah, 2 ; 读
mov al, byte [bp-2] ; 读 al 个扇区
int 13h
jc .GoOnReading ; 如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止
add esp, 2
pop bp
ret5、总结
在软件中,可以通过层层封装实现设备访问的简单;
本文介绍了软盘的结构,包括1.44软盘的2个盘面、80条磁道和18个扇区,以及每个扇区512Byte的大小。此外,还详细阐述了相对扇区号的概念及其与盘面、磁道、扇区的转换关系,并解释了在Linux系统中如何通过BIOS中断13进行软盘的读写操作。最后,通过实例帮助读者更好地理解软盘的访问过程。
1164

被折叠的 条评论
为什么被折叠?



