19.3 对FAT的支持(harib16c)
19.3 对FAT的支持(harib16c)
问题:可以正确显示文件开头的512字节的内容,但大于512字节的部分不能正确显示(可能会显示其他文件)。
问题本质:磁盘可能将大于512字节的文件离散的保存在不同磁盘中。
解决办法:磁盘中保存了文件的下一段的地址。该记录(FAT,file allocation table,文件分配表)位于从0柱面、0磁头、2扇区开始的9个扇区中,由19.1 type命令(harib16a)中对磁盘映像在内存中的存储位置可知,该记录在内存中的地址是0x000200~0x0013ff。
下方便是磁盘映像中的FAT,由于FAT使用了微软的压缩算法,故需要解压。

解压算法:
压缩后 ---> 压缩后

直白的说,第一个字节(03)和第三个字节(00)的数据不变,将第二个字节的数据(40)拆开,分别与第一个字节和第三个字节进行拼接。
经过此番操作,解压后的FAT如下:

这里说明自己对为什么这么做可以节省空间的理解,FAT用于储存离散存储的文件块之间的线性关系,直白点说就是文件的下一段存储在哪个地方(扇区),故本质是存储磁盘号。有前面的知识,共2880个扇区,一个字节肯定是存不下(8位,无负数最大能表示的十进制值为256,此处不严谨,应考虑补码、类型等内容,但总之只用一个字节表示不了),但使用两个字节(WORD,沿用书上)16位又有些浪费(无负数最大能表示65536,同上,不严谨,参考数量级即可)。因此压缩,即用1.5字节(12位,4096)存储。参考书中,“磁盘共2880个扇区,正常使用WORD保存扇区号,FAT共需 2880×2=5760个字节,即一个FAT要占用12个扇区。 压缩后,3个字节可以保存2个扇区号,即存放1个扇区号需要的空间变为1.5个字节。因此,FAT总共需要2880×1.5=4320字节,一个FAT只占用9个扇区。 一张软盘中一共有2份FAT,因此经过压缩后,总共可以节省6个扇区的空间”
还有一点小思考,保持三字节存两扇区号的压缩方式不变,为什么不直接从中间一刀切,即将第二个字节的高四位直接并入第一个字节中,从其操作来说,似乎(只是在脑海中验证,并未写实际代码)开销差不多,代码的可读性也差不多?,不知道微软为什么要采用这种交叉的方式?
解压的代码如下:
void file_readfat(int *fat, unsigned char *img)
/* 将磁盘映像中的FAT解压缩 */
{
int i, j = 0;
for (i = 0; i < 2880; i += 2) {
fat[i + 0] = (img[j + 0] | img[j + 1] << 8) & 0xfff;/* 最后相与的目的是限制为 1.5字节*/
fat[i + 1] = (img[j + 1] >> 4 | img[j + 2] << 4) & 0xfff;
j += 3;
}
return;
}
代码解析如下:

- bootpack.h节选
void file_loadfile(int clustno, int size, char *buf, int *fat, char *img)
{
int i;
for (;;) {
if (size <= 512) {/* (注释错误)文件大小不大于一个扇区 */
for (i = 0; i < size; i++) {
buf[i] = img[clustno * 512 + i];
}
break;
}
for (i = 0; i < 512; i++) {/* 文件大小大于一个扇区 */
buf[i] = img[clustno * 512 + i];
}
size -= 512;
buf += 512;
clustno = fat[clustno];/* 寻找文件下一个存放的扇区 */
}
return;
}
注意:上面对于小于512的判断的作用是错误的(不全面),正确得应该是,一个一个扇区加载文件,若不够一个扇区(小于512),则只加载一部分(由size来确定加载到那部分)。整个文件小于一个扇区(512字节)的情况包含在其中
19.3 对FAT的支持(harib16c)的更多相关文章
- Spring Security(19)——对Acl的支持
目录 1.1 准备工作 1.2 表功能介绍 1.2.1 表acl_sid 1.2.2 表acl_class 1.2.3 表acl_obj ...
- 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1) ...
- 【STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第19章 STM32H7的GPIO应用之按键FIF ...
- Ubuntu的妥协将支持精选的32位应用
据外媒Tom's hardware,Ubuntu开发人员Canonical在早先的时候宣布Ubuntu 19.10将不再更新32位软件包和应用程序,引来了诸多应用开发者的不满.现在,Ubuntu方面宣 ...
- Java 19 新功能介绍
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 19 在2022 年 9 ...
- c语言知识点总结(摘自head first c)
gcc name.c -o name; ./name或者gcc name.c -o name && ./name;同时执行关键字:void sizeof(运算符,它能告诉你某样东 ...
- linux kernel menuconfig【转载】
原文网址:http://www.cnblogs.com/kulin/archive/2013/01/04/linux-core.html Linux内核裁减 (1)安装新内核: i)将新内核copy到 ...
- Zynq Fatfs文件系统应用笔记
Zynq Fatfs文件系统应用笔 Hello,panda 笔记介绍基于所描写叙述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统採用在Bare-Metal和轻 ...
- Android N开发 你需要知道的一切
title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...
- [Hadoop in Action] 第6章 编程实践
Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优 1.开发MapReduce程序 [本地模式] 本地模式 ...
随机推荐
- Cubemx 生成工程代码失败的原因
折腾了好久(躺)翻了很多解答试了试终于捣鼓正常了,就在这里汇总一下看到过的问题 1.文件名.工程名或者工程文件路径/库路径上有中文名 2.Cubemx的版本过高 3.java环境的版本不适配 4.可能 ...
- Python模块——os模块详解
- Spring面试题大汇总
1.Spring的IOC和AOP机制? 我们在使用spring框架其实就是为了实现IOC,依赖注入,和AOP,面向切面编程,主要有两种设计模式工厂模式和代理模式,IOC就是典型的工厂模式,通过sess ...
- Verilog中端口的连接规则
摘自于(15条消息) Verilog中端口应该设置为wire形还是reg形_CLL_caicai的博客-CSDN博客, 以及(15条消息) Verilog端口连接规则_「已注销」的博客-CSDN博客_ ...
- ubuntu安装xface
Gnome.KDE.XFACE桌面环境安装和卸载 出自Ubuntu中文 安装桌面环境 (一)在终端中运行安装: 1.安装XFACE: sudo apt-get install xubuntu-desk ...
- 本地mysql端口3306 一直干不掉这样解决
第一步:先whereis mysql(查找到MySQL的一些本地文件) 主要删除这两个 再干掉端口3306 即可
- 禁止的回文子串 Dyslexic Gollum
UVA1633 一个长的回文串都可以由短的回文串拓展而来,只要短的回文在左右两端增加相同的字符即可.因此,在考虑长度为NNN的01串时,只要在从长度为1向NNN拓展的过程中,保证后KKK个字符不是回文 ...
- webpack逆向之报错Cannot read properties of undefined (reading 'call')
经典报错 记录一下: 1: 缺少模块 补上 2.主模块无法调用子模块 有可能网站用的数组形式的模块包,你用的是对象,调用方法就要改变. 改写过程中 用的是对象方式: 那么3号包调用的4号包 ...
- 前端复习之css
1.css概述 1 1.CSS3概述 2 1.问题 3 1.设置页面中所有的文本颜色为红色 4 2.设置页面中所有div的文本的颜色为蓝色 5 3.将所有的div的文本的颜色改为黄色 6 7 HTML ...
- Java's absolute and relative path
在java中文件目录中带"/"的是绝对路径,不带"/"的是相对路径. 请求页面的写法,在web中,页面路径主要写的有以下几种 1.重定向 2.转发 3.超链接 ...