叶子的家

~●    ~●  ~●          ~●   ~●~●                           ○
    离成功还很远,距离长着叻,Fighting!
随笔 - 44, 文章 - 1, 评论 - 697, 阅读 - 22万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

根据扇区号读取资料

Posted on   绿叶  阅读(1956)  评论(1编辑  收藏  举报
最近在入门操作系统,其中
;----------------------------------------------------------------------------
; 函数名: 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

    ret
遇到是读取内核文件到内存卡了我半天没有转回来。下面贴一下资料(不是我写的),希望对新人有些帮助。
这里用到13h号中断来读取磁盘上的资料,下面是一个根据磁盘扇区号计算13h号中断所需要的参数。

我开始不明白上面提到的公式计算参数,结果困惑半天,后来才找到答案,关键是因为自己对磁盘的基本知识了解不清,扇区号的分布方式不是我“原本以为”的那样,下面转贴一个关于软盘描述的详细资料。


一、3.5寸1.44M软盘结构

1、 结构:2面、80道/面、18扇区/道、512字节/扇区
         扇区总数=2面 X  80道/面 X  18扇区/道  =  2880扇区
         存储容量= 512字节/扇区X  2880扇区 =  1440 KB

2、物理扇区号:
         2  面: 编号0----1;
         80道: 编号0----79
         18扇区:编号1----18

3、相对扇区号:共2880个扇区,相对扇区号范围为 0----2879
编号顺序:
扇区物理号               相对扇区号
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
………
1面,79道,18扇区          2879

4、物理扇区号(A,B,C)与相对扇区号(S)相互转换公式:
头/面(0--1)      道(0-79)       扇区 (1--18)
   A              B          C
例如:1面           15道       7扇区
(0道----14道)*2面*18+0面的第15道18个扇区+1面第15道7个扇区-1
      15*2*18+18+7-1
当A=1时S=B*18*2+18+C-1
当A=0时S=B*18*2+C-1
一般情况:S=B*18*2+18*A+C-1
S=B*18*2+18*A+C-1
C=(S%18)+1
A= (INT(S/18))%2
B= INT(S/36)
簇(CLUSTER):磁盘分配给文件的最小单位,1簇=2n扇区,  n=0,1,2,……..
扇区:是磁盘读写的最小单位
字节:是内存读写的最小单位
位:是CPU处理的最小单位

5、3.5寸1.44MB软盘存储结构
1、引导扇区BOOT
(0扇区)
作用:
记录磁盘的基本信息。
OEM ID:格式化本软盘的软件版本号
BYTES PER SECTOR:       每扇区字节数 (512)
SECTOR PER CLUSTER:    每簇扇区数 (1)
FAT COPIES:               文件分配表的个数   (2)
ROOT DIRECTORY ENTRIES:根目录区可容纳的文件数(224)
TOTAL SECTORS ON DISK: 磁盘总扇区数 (2880)
MEDIA DESCRIPTOR BYTE:本磁盘类型的特征字节 (F0)
SECTORS PER FAT:        每个FAT占用的扇区数  (9)
SECTORS PER TRACK:     每磁道的扇区数     (18)
SIDES:                   磁盘的面数         (2)
VOLUME SERIAL NUMBER:卷标号 (18F53A49)
FILE SYSTEM ID:          文件系统标识 (FAT12)
2、文件分配表FAT1
(1--9扇区)
作用:
记录磁盘空间每个簇的使用情况以及相互之间的关系。 共有9X512=4608个字节,用12个二进制位(1.5个字节)
表示一个簇的状态,最多可管理3072个簇,实际管理2847个簇,有334.5个字节空余。
FAT每个单元的值以及含义:
000H          空簇
002H----FEFH  该簇已被使用,其值为下一个簇的簇号
FF7H          坏簇
FF8H----FFFH  该簇已被使用,并且是最后一个簇
FF0H----FF6H  保留簇
3、文件分配表FAT2
(10--18扇区)
作用:
作为FAT1的备份。 同上
4、根目录区ROOT
(19--32扇区) ROOT根目录  14个扇区   14*512B
  文件目录表中每个文件登记项占用 32个字节,一共可以存储224个文件。(14*512/32)
32个字节:1- 8 文件的主名           ( 8B)
          9-11 文件的扩展名         ( 3B)
12 文件的属性           ( 1B)
b7  b6   b5    b4     b3     b2   b1    b0
存档、子目录、卷标、系统、隐含、只读

         13-22 保留字节             (10B)
         23-24 文件的最后更新的日期 ( 2B)  
[月 4位、日 5位、年 7位  (+1980)]
         25-26 文件的最后更新的时间 ( 2B)  
[时 5位、分 6位、秒 5位 (*2)]
         27-28 文件的起始簇号       ( 2B)
         29-32 文件的大小           ( 4B)

文件名第一个字节的含义:
00:该目录项未用,下面无目录项
E5:已经删除文件的目录项
2E:子目录项
其他:文件名首字符
5、数据区DATA
(33—2879扇区,共2847个扇区,1簇=2n个扇区,  n取0,共2847个簇,编号为 2--2848) 
FAT1和FAT2:
FAT 特征         2     3     4     5       6      7    
F0F FFF 2848 0 0 0 0 0
8        9     10      11    12     13    14     15    
0 0 0 0 0 0 0 0

………………………………………………………

2841   2842   2843   2844   2845  2846   2847   2848
0 000 0 0 0 0 0 FFF
注:F0为3.5寸软盘的特征(在BOOT区中)

簇号和相对扇区号的关系:
磁盘可用的扇区的范围(用相对扇区号表示):        33--2879
对应的簇号:                                    2—2848
          簇号=相对扇区号-31
**********************
FAT12最多能管理 4K个簇, 如120G硬盘采用FAT12则每簇约 30M
FAT16最多能管理64K个簇, 如120G硬盘采用FAT16则每簇约1.9M
FAT32最多能管理 4G个簇, 如120G硬盘采用FAT32则每簇约 30B
***************************
FAT1: 9个扇区,  9*512字节
      用12个二进制位表示一个簇的状态,(1.5B)
      9*512*8/12=3072(个簇)
offset:偏移量,距离本扇区第一个字节的位置.

   FAT12: 12b = 4096(个簇)
          1.44M  1个簇=1扇区
     如果 4G硬盘,则  4*1024*1024*2扇区/4096簇
                 1个簇=2048扇区
***********************************
问题:
1、FAT12 用12个二进制表示一个簇的状态, 为什么1.44MB软盘FAT需要9个扇区?
(2847+2)*1.5=2849*1.5=4273.5字节,  
换算为扇区4273.5/512=8.34  取整数9
   FAT12: 12b = 4096(个簇)
   4GB    4*1024*1024*2扇区   /   4096簇
                 1个簇=2048扇区
2、如果4GB硬盘用FAT12管理,每簇多少扇区?
3、对于FAT系统的磁盘,删除一个文件对磁盘的各个区域(BOOT、FAT1、FAT2、ROOT、DATA)做哪些操作?
在ROOT 中把文件名的第一个字节改为E5H
在FAT中把文件占用的簇的状态改为0

FAT12 用12个二进制表示一个簇的状态,
需要(2847+2)*1.5=4274字节,  换算为扇区4274/512=9
F0为3.5寸软盘的特征(在BOOT区中)
2847+2=2849    2849*12/8=4274字节  占8.34扇区即9扇区
************************************
硬盘结构:
柱面(0-----1023),头(0-15),扇区(1---63)
1024 X 16 X 63 X 512 = 540MB
1024 X 256 X 63 X 512 = 8 GB

0头0道1扇区:MBS(主引导扇区)
MBS(主引导扇区):1、主引导程序:MBR      (446B) 0--1BDH
                命令FDISK  /MBR :重新构造主引导程序
                 2、分区表:         (16X4=64B)  1BEH—1FDH
把硬盘分为4个区域,每个区域可以安装一类操作系统。

每16B字节 描述硬盘一个区的基本信息:
引导标志,        1B
开始的物理位置    3B
操作系统标识,    1B
结束的物理位置,  3B
开始的相对扇区号,4B
可用扇区总数。    4B
                   3、主引导扇区标志:55AAH (2B)  1FEH—1FFH
硬盘的0头0道1扇区(512B),主引导扇区
0-445:  (000-1BDH) 446B   主引导记录    主引导程序
446-461:(1BEH-1CDH) 16B   第一个分区信息
462-477:(1CEH-1DDH) 16B   第二个分区信息
478-493:(1DEH-1EDH) 16B   第三个分区信息
494-509:(1EEH-1FDH) 16B   第四个分区信息
510-511:(1FEH-1FFH)  2B   主引导记录标志,内容为 55AAH
***********
每个分区信息(16B)
0:分区的激活标志,00H/80H (不可引导/可引导),四个分区中只能有一个80H
1-3:本分区开始的头、道、扇区
4:  本分区安装的操作系统标志
5-7:本分区结束的头、道、扇区
8-11:本分区开始的相对扇区号
12-15:本分区可用的扇区总数


3.5寸软盘存储结构
BOOT(0扇区) FAT1文件分配表1(1--9扇区) FAT2文件分配表2(10--18扇区)
ROOT根目录区(19--32扇区)
DATA数据区(2847扇区、2847个簇,编号为 2-----2848)

2847+2=2849    2849*12/8=4274字节  占8.34扇区即9扇区

簇(CLUSTER):磁盘分配给文件的最小单位
文件分配表(FAT):记录磁盘空间每个簇的使用情况,以及相互关系.
磁盘可用的扇区的范围(用相对扇区号表示):
          33--2879  
对应的簇号:2--2848
FAT1: 9个扇区,  9*512字节
      用12个二进制位表示一个簇的状态,(1.5B)
      9*512*8/12=3072(个簇)
offset:偏移量,距离本扇区第一个字节的位置.

F0 FF FF  00 40 00 05 60 00
FAT特征
   FAT12: 12b = 4096(个簇)          1.44M  1个簇=1扇区
          4GB    4*1024*1024*2扇区/4096簇
                 1个簇=2048扇区 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示