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 956B 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 42F4 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 9FC8 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)

从以上三个文件可以得出以下规律:

  1. 实际文件最后修改时间的秒值是DOS 记录的秒值两倍。
  2. 实际文件最后修改日期的年值和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年

Leave a Reply

Your email address will not be published. Required fields are marked *