《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统


Day2 汇编语言学习与Makefile入门

 本文仅带着思路,研究源码里关于文件系统的参数

 关于day2主程序部分及更多内容,请看

 导航

  1. 发现学习中的变化
  2. 源码差异分析
  3. FAT12/FAT16/FAT32相关资料
  4. 开始全面分析
  5. FAT 系权威资料大全
      • exFAT 容易丢数据的原因

[第1天] 二进制代码和nasm

file allocation table - 16bit: http://www.beginningtoseethelight.org/fat16/index.htm 以及

和 

这里引用这篇文章里的 BS_jmpBoot    (跳转指令),如图

查了一下0xEB是x86汇编指令JMP SHORT(详见 )

而NASK汇编把JMP SHORT 简写为 JMP,0x90是x86汇编里的 NOP(空指令),0xE9则是JMP NEAR指令,Near JMP需要的地址位多,所以地址参数用两个字节表示。

也就是说  0xEB 0x58 0x90  和汇编代码 JUMP 0x58; NOP;  是等价的

所以helloos可能不能在非Intel x86架构的主板上工作?

好了,看完资料,我们发现书中的启动区源码是为FAT12格式软盘服务的,所以如果以后我们要做fat32(甚至需要主板驱动支持的exfat、NTFS),就需要自己去找对应分区格式的启动区参数。


 【文件系统】FAT12文件系统简介

Ps.其实还可以用c语言来做一个文件系统写入工具 (用结构体储存分区信息)

最后搜了很久,发现百度百科也有一点记录:https://baike.baidu.com/item/FAt12#ref_[1]_273750 ,维基百科应该有更详细,可惜英文版也被墙了....

通过搜集资料,我们现在不再仅仅只能做FAT12,还能做FAT32的启动甚至是exfat ext ntfs的

到这里,我们明白了整体

  第一部分就是启动区描述和文件系统(书中例子为fat12)

附图(DG加载虚拟磁盘文件,并勾选显示元文件)

当然更推荐用 WinHex 来看 (查看-模板管理器-Fat32)

 

  第二部分才是系统和程序(HelloWorld)

好,让我们把精力放在第二部分吧:

待续更新...


http://elm-chan.org/docs/fat_e.html

常见文件系统 资料

https://www.ntfs.com/index.html

微软官方资料(是真的难找):

https://social.technet.microsoft.com/wiki/contents/articles/6771.the-fat-file-system.aspx

How FAT Works: Local File Systems | Microsoft Docs(WinServer2003)

FAT File System | Microsoft Docs(WinServer2000)

exFAT file system specification - Win32 apps | Microsoft Docs

(最推荐的方案)另外也可以用必应或谷歌搜 FAT32 white paperFAT32 白皮书  https://files.cnblogs.com/files/yucloud/FATPDF.7z

 附上中译版:






exFAT file system specification - Win32 apps | Microsoft Docs)

用 Windows 格式化 exFAT 分区,只会给一个文件分配表(也就是说没有留作备份的分配表),而格式化 FAT32 分区则会给两个分配表。

(但 exFAT 文档表示 exFAT 是可以有两个分配表的。而 微软认为闪存类型的储存介质不需要两个分配表,但事实上 闪存因 exFAT 单分配表丢失的情况比比皆是,

网上所说的 exFAT 容易丢数据应该就是这个原因)

exFAT   FAT16    FAT32 对比图

 (Windows 自带的格式化工具,磁盘精灵,Linux上的 mkexfat ,均只给 exFAT 一个分配表)

可见微软的规范倡导里,只有 exFAT 是给一个分配表,其他 FAT 系(FAT12 FAT16 FAT32) 都是两个分配表

没有两个分配表(一个主表,一个备份表 )的分区非常容易丢数据,网上搜一下 exFAT 丢数据,你就知道

可是 exFAT 是原生支持两个分配表的啊,微软有病吧!