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)的更多相关文章

  1. Spring Security(19)——对Acl的支持

    目录 1.1           准备工作 1.2           表功能介绍 1.2.1     表acl_sid 1.2.2     表acl_class 1.2.3     表acl_obj ...

  2. 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】

    转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1)     ...

  3. 【STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第19章       STM32H7的GPIO应用之按键FIF ...

  4. Ubuntu的妥协将支持精选的32位应用

    据外媒Tom's hardware,Ubuntu开发人员Canonical在早先的时候宣布Ubuntu 19.10将不再更新32位软件包和应用程序,引来了诸多应用开发者的不满.现在,Ubuntu方面宣 ...

  5. Java 19 新功能介绍

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 19 在2022 年 9 ...

  6. c语言知识点总结(摘自head first c)

    gcc name.c -o name;   ./name或者gcc name.c -o name &&  ./name;同时执行关键字:void sizeof(运算符,它能告诉你某样东 ...

  7. linux kernel menuconfig【转载】

    原文网址:http://www.cnblogs.com/kulin/archive/2013/01/04/linux-core.html Linux内核裁减 (1)安装新内核: i)将新内核copy到 ...

  8. Zynq Fatfs文件系统应用笔记

    Zynq Fatfs文件系统应用笔 Hello,panda 笔记介绍基于所描写叙述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统採用在Bare-Metal和轻 ...

  9. Android N开发 你需要知道的一切

    title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...

  10. [Hadoop in Action] 第6章 编程实践

    Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优   1.开发MapReduce程序   [本地模式]        本地模式 ...

随机推荐

  1. 如何安装vm虚拟机软件并用该软件建立虚拟机

    一.安装vm虚拟机软件 1.双击打开虚拟机应用程序 找到VM应用程序所在的位置,双击安装 2.根据向导安装 根据提示点击下一步 点击安装之后耐心等待一会,会出现需要输入许可证的的界面,这时候不要关闭界 ...

  2. C语言初级阶段7——指针2——特殊指针

    C语言初级阶段7--指针2--特殊指针 指针函数:是一个函数,返回值类型是一个指针. #include<stdio.h> int* fun() { //a是一个局部变量 int a = 1 ...

  3. Python笔记(5)——if 语句一:条件测试(Python编程:从入门到实践)

    每条if语句的核心都是一个值为True或False的表达式.Python根据条件测试的值为True还是False来决定是否执行if语句中的代码.如果条件测试的值为True,Python就执行紧跟在if ...

  4. NOIP2008普及组

    T2]排座椅 横行相同时列数+1,纵行相同时行数+1. 主要是用桶排序,因为范围太大了,用sort会超时 #include<iostream> #include<cstring> ...

  5. python中将各种类型表达式中的 \ 符号,都看作转义符

    python中将各种类型表达式中的 \ 符号,都看作转义符,如 \n 代表换行  \t  代表空tab,还发现 \a 相当于什么都不是,改行末尾的 \ 的意思是该行还没写完,接着下边一行的内容. 转义 ...

  6. 表格CSS

    .tab{border:1px solid #cad9ea;color:#666;} .tab th {background-image: url(th_bg1.gif);background-rep ...

  7. 01 关于HTML基础-构建Web,这些你都知道吗?(很全)

    以下均是参考MDN web docs,总结出来的比较重要的知识点,与君共勉.不妥之处,还望大家及时提出! 什么是HTML? 是一种告诉浏览器如何组织页面的标记语言.它由一系列元素组成. HTML元素 ...

  8. 京东薅羊毛脚本-Docker

    一.安装好docker,然后创建容器: 注1:如果是旁路由,建议用--network host \代替-p 5678:5678 \这一行. 注2:如果想要看到lxk0301大佬的js脚本,并且重新部署 ...

  9. 制作mnist格式数据集

    import os from PIL import Image from array import * from random import shuffle # # 文件组织架构: # ├──trai ...

  10. docker 镜像rabbitmq安装

    docker 镜像rabbitmq安装 1.拉取镜像 带有"mangement"的版本(包含web管理页面): docker pull rabbitmq:3.7.7-managem ...