目录

标准

从需求出发

FAT(FAT12)

保留扇区Boot Sector & BPB

BPB信息的使用

BootSector&BPB地址

首地址:0x0000

末地址:0x0000+0x0200-1 = 0x01FF

计算FAT位置

FAT[0]起始地址:0x0200

FAT[0]末地址=0x13FF

FAT[1]首地址=0x1400

FAT[0]末地址=0x25FF

计算根目录区的扇区数RootDirSectors

数据区Data Region

DataRegion的首地址:0x4200

文件(文件夹)的存放

DirEntry中标记有Cluster编号与DataRegion对应

测试的重点备注

FAT数据结构

LBA到CHS

FAT类型的确认

题外话:

FAT数据结构后端是有空白的

为什么是FAT12


FAT文件系统用在(DOS) windows环境下用的比较多。最近好奇,查一下资料,做一下笔记。

标准

FAT文件系统应该是有一本规范的,零星找来找去,走了不少弯路才找到。以下是文档的版本。(以下简称白皮书)

Microsoft Extensible Firmware Initiative
FAT32 File System Specification
FAT: General Overview of On-Disk Format

Version 1.03, December 6, 2000
Microsoft Corporation

此文描述中不清楚或是谬误之处还是要参照标准。

备注:

按白皮书所讲,FAT12微软只用在软盘上。

从需求出发

以档案馆作为例子来看,要存放的文件就是档案,存放的位置就是档案柜。文件存入档案馆后为了方便查找,我们通常会做一个目录或是索引,索引中至少需要有文件名和存放位置,大致如下。

如果来了一份档案,内容很多,一个位置放不下,可以如下方式存放(暂时ok)。

这份档案后期又有新的内容补充,

但这份档案越来越多后,文件在索引中和物理位置上都不连续,查收起来会有麻烦,而且比较容易遗漏,比如没有看到“文件名5-4”。可以如下:

这样也是可以的,但每次有新档案加入,就需改写一遍之前的,也不太好。

另外,档案多了以后,我们也不容易知道哪个些位置是空的,哪些位置是满的,如何改善呢?

FAT的方式是,另外做一个索引或表,用来标记位置的使用情况,

这样,哪些位置是空的,哪些是满的,就一目了然了,新来的档案也比较容易找到哪个位置够大。

结合这个“位置表”和文件-位置索引表,位置表中的状态信息做一下补充(除了满、空之外,再补充一下,文件的结束,及如果没结束,剩下的部分的位置号),对于“文件名5”的存放以有另外一个方式,如下

这就是FAT的方式。(这样对于“文件5”的存放比较方便,但查阅就有些不方便了,但计算机速度快,还好)

FAT(FAT12)

如白皮书所讲:

The FAT (File Allocation Table) file system has its origins in the late 1970s and early1980s
and was the file system supported by the Microsoft® MS-DOS® operating system. It was
originally developed as a simple file system suitable for floppy disk drives less than 500K in
size. Over time it has been enhanced to support larger and larger media. Currently there arethree FAT file system types: FAT12, FAT16 and FAT32.

FAT文件系统在1970年代末1980年代初,设计用来给小于500K的软盘使用,慢慢被用来支持越来越大的存储介质,现在有FAT12、FAT16、FAT32三种。

上文中的“位置表”就是FAT(File Allocate Table),“索引表”对应根目录区(Root Directory Region)。再加上真正存放档案的位置(DataRegion),结构如下

由于FAT很重要,所以在FAT可以有备份,在FAT12中一般是有一个备份。然后就是下面的样子。

从计算机发展看,是新的计算机,后有磁盘(在磁盘发明前,前面还有其它的方式来存储信息),所谓的“计算机文件系统”是在计算机+磁盘的使用过程中诞生(在电脑上实现人脑中的想法,或是将系统由其它介质(如纸)移植到电脑),后又强化或方便了磁盘的使用的。

在“计算机文件系统”发明前,文件系统的概念一定时存的,如同我们上面的图表,只是不存在于电脑中,而是存于人脑中,记录在纸或其它介质上。

而计算机(很多东西也一样),需要具备向后的兼容性,所以也是一点点由小到大,由少到多的积过程。也正因如此,从小的、简陋的开始了解,往往看似难,实则更容易找到本源,更容易理解后期的成品。

在FAT_0前面还有一个保留区域,猜测是兼容的原因。所以完整的FAT系统如下:

下面我们一起来一点一点的分解(以FAT12为例,也是最小的FAT文件系统)。

分解前,首先明确几个数据的组织单位。

  1. 数据的最小单位是bit(比特),
  2. 8bit (比特)= Byte(字节),
  3. 512Byte(字节)=1Sector(扇区)(不一定都是,但对软盘来是的)
  4. 2^nSector(扇区)=1Cluster(簇)(可能叫作“集群”更合适。怀疑这个概念是在后期FAT版本中加入的。在FAT12中 n=0,即1Sector = 1Cluster)

Sector(扇区)是机械磁盘的引入的。暂时我们磁盘抽象成一个地址连续的线性空间就好。(这也就是Logical Block Address)其中,bit、Byte、Sector都从0开始计数。

保留扇区Boot Sector & BPB

这个扇区很重要,内部记录了很多系统访问需要的基本信息,主要分为BootSector相关的,后续以"BS_"开头,和与BPB (Bios Parameter Block)相关的,以“BPB_”开头。(Bios = Basic Input & Output System,基本输入输出系统)结构如下。

白皮书中有如下描述:

The first important data structure on a FAT volume is called the BPB (BIOS Parameter Block), which is located in the first sector of the volume in the Reserved Region. This sector is sometimes called the “boot sector” or the “reserved sector” or the “0th sector,” but the important fact is simply that it is the first sector of the volume.
This is the first thing about the FAT file system that sometimes causes confusion. In MS-DOS version 1.x, there was not a BPB in the boot sector. In this first version of the FAT file system, there were only two different formats, the one for single-sided and the one for double-sided 360K 5.25-inch floppy disks. The determination of which type was on the disk was done by looking at the first byte of the FAT (the low 8 bits of FAT[0]).
This type of media determination was superseded in MS-DOS version 2.x by putting a BPB in the boot sector, and the old style of media determination (done by looking at the first byte of the FAT) was no longer supported. All FAT volumes must have a BPB in the boot sector.

几点:

  1. 在MS-DOS1.x时代,FAT的保留扇区(Sector 0 )中是没有BPB信息的
  2. BPB信息是在MS-DOS2.x中加入的
  3. FAT[0]中的低8位,被历史原因占用了

##测试记录

在Win XP Pro Sp3 CN下没有BPB的软盘是不被识别的,认为是未被格式化的。

(在虚拟机中测试的;

  1. 加载一个空的软盘映像
  2. 用Win XP Pro Sp3 CN格式化,放入几个测试文件,退出映像
  3. 用16进制编辑器,清除掉BPB信息,再加载)

此部分的总体结构是这样的,开头是固定长度的代码,3byte长,通常是Jmp指令,借此跳过BPB,执行后续代码。

如果是Jmp指令不足3Byte,用0x90 (空指令补全,实际是什么应该不重要)

0xAA55的标记(据说是对应电路中的方波,最容易检测的),是此扇区中有启动代码的标记。(不论这个Sector是否有启有信息,BPB的位置固定的,固定是重要的,地址固定了,也就可以寻址了)

BPB和BS代码部分如下(FAT12\FAT16的,FAT32的后半部分不同):

;    名称                                  10进制偏移地址 16进制偏移     说明
;                                               长度      结束地址
;   BS_jmpBOOT:         jmp Entry           ;   0_3byte     0x00-0x02   跳转指令
;                       db 0x90             ;   BS_OEMName:         DB  'MSDOS5.0'        ;   3_8byte     0x03-0x0a   OEM厂商名  BPB_BytesPerSec:    dw  0x200           ;   11_2        0x0b-0x0c   每扇区字节数(Bytes/Sector) BPB_SecPerClus:     db  0x01            ;   13_1        0x0d        每簇扇区数(Sectors/Cluster)   BPB_ResvdSecCnt:    dw  0x0001          ;   14_2        0x0e-ox0f   Boot记录占用多少扇 BPB_NumFATs:        DB  0x02            ;   16_1        0x10        共有多少个FAT表   BPB_RootEntCnt:     dw  0xE0            ;   17_2        0x11-0x12   根目录区文件最大数   BPB_TotSec16:       dw  0x0B40          ;   19_2        0x13-0x14   扇区总数=80x2x18=2880 BPB_Media:          db  0xF0            ;   21_1        0x15        介质描述符   BPB_FATSz16:        dw  0x0009          ;   22_2        0x16-0x17   每个FAT表所占扇区数 BPB_SecPerTrk:      DW  0X0012          ;   24_2        0x18-0x19   每个磁道扇数(Sector/track) BPB_NumHeads:       dw  0x0002          ;   26_2        0x1a-0x1b   磁头数(面数)               BPB_HiddSec:        dd  0x0000_0000     ;   28_4        0x1c-0x1f   隐藏扇区数                   BPB_TotSec32:       dd  0x0000_0000     ;   32_4        0x20-0x23   如果BPB_TotSec16=0,则上此处给出扇区数 BS_DrvNum:          db  0x00            ;   36_1        0x24        Int 13H的驱动器号    BS_Reserved1:       db  0x00            ;   37_1        0x25        保留,未使用   BS_BootSig:         db  0x29            ;   38_1        0x26        扩展引导标记(29H),用于指明此后的三个域可用  BS_VolID:           dd  0x0000          ;   39_4        0x27-0x2a   卷序列号    BS_VolLab:          DB  'NO_NAME    ' ;   43_11       0x2b-0x35   卷标  BS_FileSysType:     db  'FAT12   '        ;   54_8        0x36-0x3d   文件系统类型
;   引导代码及其它内容                       ;   62至448                  引导代码及其它内容
;   dw  0xAA55                              ;   510_2               用于引导的结束标志

以下是个Win XP Pro SP3下格式非DOS启动软盘的分析截图。

BPB信息的使用

BootSector&BPB地址

首地址:0x0000

长度=BPB_ResvdSecCn * BPB_BytsPerSec=1*512 (通常)=512 =0x0200

末地址:0x0000+0x0200-1 = 0x01FF

计算FAT位置

FAT[0]起始地址:0x0200

FAT[0]长度 = FAT 结构的扇区数*BPB_BytsPerSec * BPB_BytsPerSec

FAT 结构的扇区数(FATSz)的确认,对于软盘3.5”,1.44M:为9x512= 0x1200

if(BPB_FATSz16 != 0)FATSz = BPB_FATSz16;
elseFATSz = BPB_FATSz32;

FAT[0]末地址=0x13FF

FAT[1]首地址=0x1400

FAT[1]长度 = FAT[0]长度 = 0x1200

FAT[0]末地址=0x25FF

计算根目录区的扇区数RootDirSectors

RootDirSectors首地址=0x2600

主目录区的样子如下图

自然,RootDirSectors(根目录占用扇区数)

向上圆整可以替换为

每个条目的字节数固定为32byte

占用字节数:=14x512=7168 = 0x1C00

RootDirSectors末地址=0x41FF

数据区Data Region

DataRegion的首地址:0x4200

到此为止,各个大区域的地址都确认到了,FAT(12)的样子如下:

文件(文件夹)的存放

接下来就是文件(文件夹的存放)

  1. 在根目录中找一个空闲区域
  2. 到FAT数据结构(FAT-FileAllocateTable本名就是表,不便称为FAT表)中找一个空闲数据区域(Cluster)
  3. 将以上两项的信息合并,作为一个条目(Entry)写入根目录区,在FAT中标记此Cluster占用。

在根目录中建立的条目(Entry)称作:Directory Entry,结构如下:

 DIR_Name:   times 11 db     ;0  0x00-0x0a   11字节,8.3文件名DIR_Attr: db              ;11 0x0b-       是一个 位给合DIR_NTRes:   db              ;12 0x0c-       为WIN NT保留DIR_CrtTimeTenth:  db      ;13 0x0d-       创建时间100ms精度DIR_CrtTime: dw          ;14 0x0e-0x0f   创建时间DIR_CrtDate:    dw          ;16 0x10-0x11   创建日期DIR_LstAccDate: dw          ;18 0x12-0x13   最后访问日期DIR_FstClusHI: dw          ;20 0x14-0x15   首cluster编号的高wordDIR_WrtTime:    dw          ;22 0x16-0x17   写时间 DIR_WrtDate:    dw          ;24 0x18-0x19写日期DIR_FstClusLO:  dw          ;26 0x1a-0x1b   首Cluster编号的低wordDIR_FileSize:   dd          ;28 0x1c-0x1f   文件大小

测试:

  1. 新建一个软盘映像
  2. 用虚拟机中的Win XP Pro SP3(下同)格式化,
  3. 并依次写入文件
    1. A1A2AEA4.txt        内容为重复的字母"a",长度小于512byte;
    2. B1B2B3B4.txt        内容为重复的字母"b",长度小于512byte;
    3. C1C2C3C4.txt        内容为重复的字母"c",长度小于512byte;
    4. 文件夹:FOLD_A1A
    5. 在FOLD_A1A下写入文件  D1D2D3D4.TXT,内容为重复的字母"c",长度小于512byte;

目录结构及信息如下:

//目录结果
A:\>tree /f
文件夹 PATH 列表
卷序列号为 5008-EBA2
A:.
│  A1A2AEA4.txt
│  B1B2B3B4.txt
│  C1C2C3C4.txt
│
└─FOLD_A1AD1D2D3D4.TXT
//根目录下的文件&文件夹的详情
A:\>dir驱动器 A 中的卷没有标签。卷的序列号是 5008-EBA2A:\ 的目录2022-12-25  15:54               217 A1A2AEA4.txt
2022-12-25  15:56               217 B1B2B3B4.txt
2022-12-25  15:56               217 C1C2C3C4.txt
2022-12-25  15:59    <DIR>          FOLD_A1A3 个文件            651 字节1 个目录      1,455,104 可用字节
//FOLD_A1A目录下的文件详情
A:\>dir FOLD_A1A驱动器 A 中的卷没有标签。卷的序列号是 5008-EBA2A:\FOLD_A1A 的目录2022-12-25  15:59    <DIR>          .
2022-12-25  15:59    <DIR>          ..
2022-12-25  15:59               217 D1D2D3D4.TXT1 个文件            217 字节2 个目录      1,455,104 可用字节

得到的分析结果如下,与推算的一致在0x2600处,找到了三个文件和一个文件夹

各文件的数据区数据:

序号 文件名 首Cluster高word 首Cluster代word 首字Cluster编号 Cluster对应地址
1 A1A2A3A4.TXT   0X00 0x02 0x0002 0x4200
2 B1B2B3B4.TXT 0x00 0x03 0x0003 0x4400
3 C1C2C3C4.TXT 0x00 0x04 0x0004 0x4600
4 FOLD_A1A 0x00 0x05 0x0005      0x4800
5

在0x4200的位置找到了文件"A1A2A3A4.TXT"的内容,如下

紧接近在0x4800的位置,找到的文件夹“FOLD_A1A”的内容。(暂时是推)

按DirEntry的格式分析一下0x4800的数据,如下图:

发现这里有3个文件(Entry),

再向下找,分在0x4A00的位置找到文件“D1D2D3D4.TXT”的内容,如下:

把两个表格合并到一起,把根目录的地址也填上,得到下表:

序号 文件名 首Cluster高word 首Cluster代word 首字Cluster编号 Cluster对应地址
0   根目录 NA NA NA 0x2600
1 A1A2A3A4.TXT   0X00 0x02 0x0002 0x4200
2 B1B2B3B4.TXT 0x00 0x03 0x0003 0x4400
3 C1C2C3C4.TXT 0x00 0x04 0x0004 0x4600
4 FOLD_A1A 0x00 0x05 0x0005      0x4800
5 . 0X00 0x05 0x0005 0x4800
6 .. 0x00 0x00 0x0000 0x4200
7 D1D2D3D4.TXT 0x00 0x06 0x0006 0x4A00

这样理论和实物就手工对上了。

DirEntry中标记有Cluster编号与DataRegion对应

很明显,DirEntry中给定的Cluster编号N,对应的LBA地址有如下规律: 0x4200 +(N-2)x 0x0200;

N=0x0000时,LBA = 0x2600 = RootDireSector的首地址

N<>0x0000时,LBA =  0x4200 +(N-2)x 0x0200 = DataRegionSector的首地址+(N-2)x BPB_BytsPerSec

在BPB_SecPerClus 现在刚好=1,可以推测在不等于1时,

LBA =  0x4200 +(N-2)x 0x0200 = DataRegionSector的首地址+(N-2)x BPB_BytsPerSec x BPB_SecPerClus

测试的重点备注

测试时有可能得不到上面的数据,而且看起来怪怪,原因:

1、用win xp 格式化软盘时,有一个“卷标”,如果选种了卷标,出现在0x2600的Entry就是“卷标”。

2、文件是在其它文件夹是建好,然后逐个移入的,如果我们在接在文夹或文件,直观的看起来,系统会在文件夹下放一下“新建文件夹”或是“新建 文本文档.txt”,而且处于改名状态。预计系统是分两步进行的:

A、先在磁盘上完成了一个完整的“新建”动作;(我们用的是中文系统,此时写入的DirEntry中使用了中文文件名UTF-16,和长文件名两个后来补充内FAT(12)文件系统的功能),增加了复杂度;

B、执行改名操作。文件改名的操作,并不是修改原来的DirEntry,而是将原来的标记为删除,并新插入了一条DirEntry,所以也会增加复杂度。

关于DIR_Name的基本描述,其它的都是扩展的(猜的):

DIR_Name[0]
Special notes about the first byte (DIR_Name[0]) of a FAT directory entry:
· If DIR_Name[0] == 0xE5, then the directory entry is free (there is no file or directory name in this
entry).
· If DIR_Name[0] == 0x00, then the directory entry is free (same as for 0xE5), and there are no
allocated directory entries after this one (all of the DIR_Name[0] bytes in all of the entries after
this one are also set to 0).

DIR_Name[0] == 0xE5,代表是写入后,又被删除的

DIR_Name[0] == 0 ,条目 是空的,很明显

FAT数据结构

下面来看一下FAT的数据结构,FAT的结构与前面以档案馆为例描述的一致,就是一个表状结构,里面装着每个cluster的状态信息。

FAT[0]        Reserved,== BPB_Media

FAT[1]        在格式化时被格式成EOC,== End Of Clusterchain,

另外FAT[1],在FAT16 和 FAT32中,除可以用于标记EOC外,还可以用来标记,指示需要进行磁盘检查(Chkdsk/Scandisk)

关于EOC:

Microsoft operating system FAT drivers use the EOC value 0x0FFF for FAT12, 0xFFFF for FAT16, and 0x0FFFFFFF for FAT32 when they set the contents of a cluster to the EOC mark. There are various disk utilities for Microsoft operating systems that use a different value, however.

即微软在白皮书中描述的作法是:

FAT12    EOC == 0xFFF(清单是3个F)

FAT16    EOC == 0xFFFF

FAT32    EOC == 0x0FFF_FFFF

但在白皮书的伪代码中的描述为:

IsEOF = FALSE;
If(FATType == FAT12) {If(FATContent >= 0x0FF8)IsEOF = TRUE;
} else if(FATType == FAT16) {If(FATContent >= 0xFFF8)IsEOF = TRUE;
} else if (FATType == FAT32) {If(FATContent >= 0x0FFFFFF8)IsEOF = TRUE;
}

另外,

There is also a special “BAD CLUSTER” mark. Any cluster that contains the  “BAD CLUSTER” value in its FAT entry is a cluster that should not be placed on the free list because it is prone to disk errors. The “BAD CLUSTER” value is 0x0FF7 for FAT12, 0xFFF7 for FAT16, and 0x0FFFFFF7 for FAT32. The other relevant note here is that these bad clusters are also lost clusters—clusters that appear to be allocated because they contain a non-zero value but which are not part of any files allocation chain. Disk repair utilities must recognize lost clusters that contain this special value as bad clusters and not change the content of the cluster entry.

FAT[x] 的值还可以为 BAD CLUSTER标记,

FAT12   BAD CLUSTER == 0xFF7

FAT16   BAD CLUSTER == 0xFFF7

FAT32   BAD CLUSTER == 0x0FFF_FFF7

另外:

NOTE: It is not possible for the bad cluster mark to be an allocatable cluster number on FAT12 and FAT16 volumes, but it is feasible for 0x0FFFFFF7 to be an allocatable cluster number on FAT32 volumes. To avoid possible confusion by disk utilities, no FAT32 volume should ever be configured such that 0x0FFFFFF7 is an allocatable cluster number.

FAT32下真的存在一个编号为 BAD CLUSTER (0x0FFF_FFF7)的块,这这块要特别注意不要使用。

FAT12下,FAT[]的取值整理如下:

FAT[] 可取值 描术
0 BPB_Media 磁盘标识字,低字节需要与BPB_Mdeia数值一致
1 0xFFF 表示第一簇(Cluster)已占用(固定不变的)
2~N  0x000 可用Cluster
0x002~0xFEF 已经Cluster,具体最大值应该取决于最大Cluster值
>=0xFF8 EOF 文件结束
-------
0xFF7 坏Cluster

FAT12数据结构中,每个Cluset用12bit表示,我们现在的样子如下:

我们将第一个文件A1A2AEA4.TXT的内容增加到>1K后(直接对比如下),(备注,文件名写错了)

即如下图所示,按照1、2、4、5、6的顺序完成的文件内容的查找

文件的内容刚好如前面推算的,在0x4C00和 0x4E00的位置。

LBA到CHS

上面的地址地址偏移都是基于逻辑地址的,而实访问的磁盘是硬件相关的,比如软盘是按Cylider(柱面)、Head(磁头)、Sector(扇区)进行编号的。(似乎机械硬盘也是如些),这里需要有一下地址转换。

(图来自《30天手写操作系统》合秀实)

软盘有80个柱面x2磁头x18个扇区 = 2880个扇区。

柱面 从0开始编号,0-79

磁头 从0开始编号,0-1

扇区 从1开始编号,1-18(这个比较不一样)

逻辑扇区

柱面

磁头

物理扇区

逻辑扇区0

0柱面

0磁头

1扇区

逻辑扇区1

0柱面

0磁头

2扇区

逻辑扇区2

0柱面

0磁头

3扇区

……

逻辑扇区17

0柱面

0磁头

18扇区

逻辑扇区18

0柱面

1磁头

1扇区

逻辑扇区19

0柱面

1磁头

2扇区

……

逻辑扇区35

0柱面

1磁头

18扇区

逻辑扇区36

1柱面

0磁头

1扇区

逻辑扇区37

1柱面

0磁头

2扇区

……

从最外层算起,计算柱面号,1个柱面有2个磁头,每个磁头的18个扇区,即36;

1、逻辑扇区号/36,商a余b,a即是物理柱面号,从0开始 (相当于36进制)

2、b/18,商c=0或1,余d,c即为磁头号,从0开始(相当于2进制)

3、d+1,即为物理扇区号,物理扇区从1开始计数

-----------或者少用一次除法

1、逻辑扇区/18,商a余b

2、a>>1,即是柱面号(右移于除2相当,所以还是除了36)

3、a&0x01,即最低一位,即磁头号

4、b+1,即是物理扇区号

FAT类型的确认

BPB中有一个 BS_FileSysType,但这个不是判断该文件系统是FAT12或FAT16或FAT32的依据,按白皮书的讲法,此值只是参考。判断FAT文件类型的唯一标准是Cluster的数量。

It is really quite simple how this works. The FAT type—one of FAT12, FAT16, or FAT32—is determined by the count of clusters on the volume and nothing else.

If(CountofClusters < 4085) { //注,4085 = 0xFF5/* Volume is FAT12 */
} else if(CountofClusters < 65525) { //注 65225 = 0xFEC9/* Volume is FAT16 */
} else {/* Volume is FAT32 */
}

另外,白皮书中讲,FAT12只用在软盘上。

Microsoft operating systems only do FAT12 on floppy disks.

题外话:

FAT数据结构后端是有空白的

与我们用“本子”记录是一样的,本子后面通常会有空白,并不是刚刚好

对于软盘而言,总的扇区数 = 80x2x18 = 2880个,
保留扇区 1个
FAT_0    9个
FAT_1    9个
根目录  = (0xE0 x32byte + 511)/512 = 14 个 
合计用掉了 1+9+9+14 = 33 个
剩余 2880-33 = 2847 = B1F 个扇区

为什么是FAT12

1.44MB的软盘有2880个扇区,按照1扇区/cluster的规划,需要12位来记录,8位=1byte最大是是255;10位 = 1023;11位 2045;12位 = 0xFFF = 4095,刚好余了一点点儿。

---------FAT12的主线部分就理清,告一段落了。

FAT12文件系统 理解相关推荐

  1. 第四载、FAT12文件系统剖析2

    在上一章节<FAT12文件系统剖析1>中,我们把a.img启动软盘使用FreeDos系统格式化为FAT12文件系统的组织方式,并且向a.img软盘写入两个文件,同时通过FreeDos操作系 ...

  2. 【实现操作系统 03】使用 FAT12 文件系统实现简单的 Boot 加载 Loader 到内存

    系统环境: OS:CentOS Stream release 9 (cmd: cat /etc/redhat-release) Linux Kernel:Linux 5.14.0-142.el9.x8 ...

  3. nasmc++ 读取FAT12文件系统

    FAT12文件系统 基本结构 FAT文件系统把存储介质看成一位的数组,基本单位是簇. 一个簇包含一个扇区,大小为512B 存储介质划分为3个区域:boot,FAT,directory and data ...

  4. FAT12文件系统原理

    概述 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构.FAT(File Allocation Table,文件配置表)是Microsoft发明的文件系统.初期的FAT就是现在所称的F ...

  5. FAT12文件系统镜像查看工具linux下的实现(nasm、g++联合编译

    FAT12文件系统镜像查看工具linux下的实现(nasm.g++联合编译) 简介 构思简介 附加链接 最终实现截图 代码 Makefile代码 my_print.asm代码 main.cpp代码 简 ...

  6. 操作系统实践-预备知识-FAT12文件系统

    参考资料:http://www.disc.ua.es/~gil/FAT12Description.pdf 软盘 软盘的文件组织格式一般为 FAT12,组织单位由大到小分为: 分区:例如 C 盘.D 盘 ...

  7. syslinux引导扇区不支持ntfs文件系统_实战 FAT12 文件系统

    1. 引言 经过一系列的文章,我们终于完成了从实地址模式跳转到保护模式,并且实现了分段.分页以及保护模式下的中断与异常机制. 保护模式究竟"保护"了什么 可是我们除了最初的时候,在 ...

  8. linux 文件理解,linux文件系统理解

    1.  文件即数据的集合,无论你有任何信息需要存储在计算机中,都要以文件的信息存在:而文件常常和具体的设备相关联,如磁盘.软盘等等. 2. 目录,即一个文件组. 3. linux支持的文件系统: Ex ...

  9. linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图

    0. 文件系统和图书馆 在linux上操作文件,和在图书馆借书是非常相似的. 硬盘上的文件系统,好比图书馆的书架:而vfs则是图书馆的管理系统. 内核的工作: 1. 维护一个文件的目录树(dentry ...

最新文章

  1. AI创业周报:元宇宙时代来临!环球墨非风头正盛,53岁女博士领现象级芯片公司获数亿元融资...
  2. Mac上webstorm与git仓库建立连接
  3. springboot2自定义HttpTraceRepository
  4. AssertionError: nn criterions don‘t compute the gradient w.r.t. targets
  5. SAP 与 JSON 接口实施案例一
  6. Eclipse 引导阮卓项目 No projects are found to import解
  7. Linux字符设备驱动框架
  8. 手机照片导入电脑步骤_怎样把手机里的照片传到电脑里
  9. 北斗信号服务器解算,GPS/北斗定位解算算法的研究
  10. vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!
  11. 中upload依赖包_upload-labs writeup
  12. graph面板x轴模式包括哪些_Grafana panel之Graph
  13. java实现医嘱管理系统_Chis5.0医嘱管理系统业务使用手册
  14. win10安装nessus8.10
  15. 博弈论基础知识与SG函数
  16. 好用的换ip工具分享
  17. 转型太慢药丸?西数欲举债180亿美元竞购闪迪!
  18. 3GPP协议R15完整版下载
  19. mac系统学python_升级mac自带的python,学python拿mac还是win,使用系统自带Pyth
  20. Matlab中的ismember和contains傻傻分不清

热门文章

  1. 【电子电路】变送器信号 4~20mA 恒流源电路设计
  2. shopex mysql 数据库服务器_win2003以isapi的方式配置php+mysql环境(安装了shopEX) 毕竟我是杨小飞i...
  3. 在ubantu下安装搜狗
  4. 虚拟机kali升级最新_kali安装、改变更新源、vmware tools、虚拟机全屏
  5. Hibernate的DetachedCriteria使用(含Criteria)转载
  6. uni-app做app自定义弹窗实现
  7. C/C++实现简单打飞机小游戏【初版】
  8. Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案
  9. RIGOL DS1102D示波器说明及纹波、上电脉冲、时序测试
  10. dp在约会上是什么意思_饭圈用语dp是什么梗