1.44MB 软盘参数如下:
2面,每面80磁道,每道18扇区,每扇512字节。
DOS盘结构为:
引导扇区 | FAT区 | 根目录区 | 文件区 |
以上信息可从磁盘引导扇区获得。
引导扇区信息:
一下是一张经不带参数格式化过的1.44M磁盘的引导扇区信息
A:\>debug
-l 0 0 0 1 (将0磁道载入内存0单元)
-d0
15F1:0000 EB 3C 90 2A 32 56 5E 6F-49 48 43 00 02 01 01 00 .<.*2V^oIHC…..
15F1:0010 02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00 …@…………
对照上表可知,每扇字节数200H(512),每簇扇区数01H,保留扇区0001H,
FAT数目02H,根目录项00E0H(224),总扇数0B40H(2880),介质F0
每FAT扇数0009H,每磁道扇数0012H(18),磁头0002H。隐藏扇区为0。
可见与实际相吻合。
用dir命令查看该盘的可用大小为1,457,664 bytes
2×80×18×512 = 1474560 bytes,其中启动扇区加FAT区一共19×512=9728 bytes
目录项 224×32/512(目录项所占字节/扇区字节) = 14 sectors
所以文件区(容量)=1474560-(14+19)×512=1457664 bytes,与dir命令显示一致。
FAT区:
从1号扇区开始,FAT1和FAT2各占9个扇区。从debug一个有内容的软盘
可以证实。
FAT1:1~9号扇区
-l 0 0 1 1
-d0
15F1:0000 F0 FF FF FF 4F 00 05 60-00 07 80 00 09 A0 00 0B
15F1:0010 C0 00 0D E0 00 FF 0F 01-11 20 01 13 40 01 15 60
15F1:0020 01 17 80 01 19 A0 01 1B-C0 01 1D E0 01 1F 00 02
15F1:0030 21 20 02 23 40 02 25 60-02 27 80 02 29 A0 02 2B
15F1:0040 C0 02 2D E0 02 2F 00 03-31 20 03 33 40 03 35 60
15F1:0050 03 37 80 03 39 A0 03 3B-C0 03 3D E0 03 3F 00 04
15F1:0060 41 20 04 43 40 04 45 60-04 47 80 04 49 A0 04 4B
15F1:0070 C0 04 4D E0 04 4F 00 05-51 20 05 53 40 05 55 60
FAT2:10~18(Ah~12h)
-l 0 0 a 1 //(load sector “A”, = 10)
-d0
15F1:0000 F0 FF FF FF 4F 00 05 60-00 07 80 00 09 A0 00 0B
15F1:0010 C0 00 0D E0 00 FF 0F 01-11 20 01 13 40 01 15 60
15F1:0020 01 17 80 01 19 A0 01 1B-C0 01 1D E0 01 1F 00 02
15F1:0030 21 20 02 23 40 02 25 60-02 27 80 02 29 A0 02 2B
15F1:0040 C0 02 2D E0 02 2F 00 03-31 20 03 33 40 03 35 60
15F1:0050 03 37 80 03 39 A0 03 3B-C0 03 3D E0 03 3F 00 04
15F1:0060 41 20 04 43 40 04 45 60-04 47 80 04 49 A0 04 4B
15F1:0070 C0 04 4D E0 04 4F 00 05-51 20 05 53 40 05 55 60
可见两个扇区的内容一摸一样,因此两个FAT区的大小,起始位置都可以确定了。
从13h开始为文件区。
文件时间,日期表示法以及分析
0 文件的时间日期信息存放在目录项中,其中表示文件最后修改时间的地址为
(目录项从00h开始) 16h~17h,文件最后创建日期的地址为18~19h。由于时间表示范围是0~23(小时)0~59(分),0~59(秒)。因此小时至少需要5bits(2^5=32>23),分钟和秒需6bits(2^6>59)一共17 bits,然而DOS分给时间的空间只有2字节(16bits),不满足条件。回头细心观察dir的显示,发现并没有秒的显示,因此推断DOS对秒的记录作了特殊处理。
日期表示范围为 日1~31,月1~12,年 ?
可知日需要5位(2^5=32>30),月需要4位(2^4=16>11),剩下7位来表示年(0~127)。
再次推断DOS对年份的显示也作了特殊处理。
下以对3个不同文件加以分析,首先用dir列出磁盘文件信息:
A:\>dir
Volume in drive A has no label
Volume Serial Number is 0C14-17F8
Directory of A:\
IO SYS 111,104 07-20-00 8:22 Io.sys
LS EXE 6,111 11-11-00 18:40 LS.EXE
TEST TXT 98 06-08-01 19:58 test.txt
3 file(s) 117,313 bytes
0 dir(s) 1,339,904 bytes free
再用debug命令将文件区载入内存并显示:
A:\>debug
-l 0 0 13 1
-d0
15F1:0000 4C 53 20 20 20 20 20 20-45 58 45 00 00 98 52 AA LS EXE…R.
15F1:0010 C8 2A C8 2A 00 00 1A 95–6B 29 03 00 DF 17 00 00 .*.*….k)……
15F1:0020 41 49 00 6F 00 2E 00 73-00 79 00 0F 00 95 73 00 AI.o…s.y….s.
15F1:0030 00 00 FF FF FF FF FF FF-FF FF 00 00 FF FF FF FF …………….
15F1:0040 49 4F 20 20 20 20 20 20-53 59 53 20 00 01 54 AA IO SYS ..T.
15F1:0050 C8 2A C8 2A 00 00 C2 42–F4 28 0F 00 00 B2 01 00 .*.*…B.(……
15F1:0060 41 74 00 65 00 73 00 74-00 2E 00 0F 00 8F 74 00 At.e.s.t……t.
15F1:0070 78 00 74 00 00 00 FF FF-FF FF 00 00 FF FF FF FF x.t………….
-d
15F1:0080 54 45 53 54 20 20 20 20-54 58 54 20 00 04 46 9F TEST TXT ..F.
15F1:0090 C8 2A C8 2A 00 00 51 9F–C8 2A 02 00 62 00 00 00 .*.*..Q..*..b…
首先查找LS.EXE文件的日期及时间表示字段,分别为951Ah,296Bh(内存先存低位,再存高位)。
最后修改时间:951Ah=1001010100011010b->10010 :101000:11010 ;
分别转化为十进制成18:40:26(dir显示时间为18:40,用windows98观察秒位为52)
日期: 296Bh=10100101101011b->0010100/ 1011 / 01011 ;
转化为十进制成20/11/11 (dir显示日期为11-11-00).
同理可写出剩余文件的时间和日期:
IO.SYS最后修改时间:
42C2h=0100001011000010b->01000:010110:00010->8:22:02(dir为8:22:04(win98))
日期:28F4h=10100011110100b->0010100/0111/10100->20/07/20(dir为07-20-00)
TEST.TXT最后修改时间:
9F51h=1001111101010001->10011:111010:10001->19:58:17(windows为19:58:34)
日期:2AC8h=0010101011001000->0010101/0110/01000->21/6/8(dir为06-08-01)
从以上三个文件可以得出以下规律:
- 实际文件最后修改时间的秒值是DOS 记录的秒值两倍。
- 实际文件最后修改日期的年值和DOS 记录的年值的差为1980。
为了进一步分析清楚,现尝试修改系统时间到小于1980的数和大于2099(年份表示最大为129个),看看后果怎么样:
A:\>date
Current date is Sat 06-09-2001
Enter new date (mm-dd-yy): 06-09-1978
Invalid date
Enter new date (mm-dd-yy): 06-09-2100
Invalid date
发现为非法值,在此可以得出结论:DOS系统对年份的规定为1980~2099之间。
因此目录项记录中存放的年份是相对1980为起始的数目,例如21就是1980+21=2001年