问题标签 [fat]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
603 浏览

filesystems - 了解 FAT16

我正在开发带有FAT16文件系统的基于闪存的 USB 大容量存储设备。它工作正常,但是我很难理解 FAT 段上发生了什么。

当我开始时,我在根目录上有一个 56 字节长的文件,它长 32 位,数据存储在第二个集群上(0 和 1 不能在 FAT 中使用)。

如果我查看 FAT 段的内存转储,我会看到:

据我了解,最后一个 0xFFFF 意味着该集群是该文件链中的最后一个集群。

到目前为止,一切都很好。

但是......当我将实际文件的大小扩展到 4,032 字节时,FAT 段变成

谁能解释这里发生了什么?

我看到了一些我无法解释的事情:

1.为什么4个系统保留字节会改变?

2. 我看不到任何 0xFFFF 这意味着集群链没有尽头?

如果它对任何人有帮助,块大小为 512 字节,文件系统被格式化为每个集群 2 个段。

0 投票
2 回答
823 浏览

java - SuperFloppyFormatter 为超过 512 MB 的任何内容返回 FAT32?

我正在使用与Android jobb 工具相关的de.waldheinz.fs库,我遇到了一些看起来很奇怪的东西。在文件 de.waldheinz.fs.fat.SuperFloppyFormatter.java:304 我发现这个:

FatType这是 enum de.waldheinz.fs.fat.FatType,但这里的实现很简单。我的问题确实与 line 相关else if (sizeInMB < 512) return FatType.FAT16;,但检查 FAT12 也同样麻烦。

FAT12 驱动器支持的最大大小为 32 MB,而 FAT16 驱动器支持的最大大小为 2 GB。为什么这个库将这些限制强加为 4 MB 和 512 MB?看来作者可能是基于对 FAT12 和 FAT16 工作原理的相当幼稚的理解。< 4MB 当然是 <= 4095 KB。4095 是 0xFFF 十六进制,或 1111 1111 1111 二进制...这实际上表示 12 位...

我承认我自己对 FAT 了解不多(我仍然不完全了解扇区与集群,如何计算总可用大小等)。也许更好地理解这些事情的人可以确认是否有技术原因应该认为这个实现是“正确的”?因为它看起来像是我的问题的确切原因。

谢谢!

0 投票
0 回答
283 浏览

file - U-Boot:'dlmalloc.c:2084: malloc_extend_top: Assertion failed' 从 MMC FAT 读取大文件时

我想从我的 MMC 上的 FAT 中读取一个文件(675 字节)。我使用在 spl.c 中调用的函数 file_fat_read()。我的代码如下所示。

读取较小的文件不是问题。但是,读取较大的文件会返回以下错误并停止引导设备(PandaBoard OMAP 4460):

dlmalloc.c:2084: malloc_extend_top: Assertion '((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0' failed.

我的问题是:这个文件是否太大而无法读取,还是我以错误的方式调用 file_fat_read()?

我的代码:

0 投票
1 回答
596 浏览

filesystems - FAT删除文件恢复能力

过去几周,我正在对文件分配表恢复进行某种探索。我的目的是通过签名找到可能已删除的文件(例如,通过“50 4B 03 04”字节的 ZIP 文件)并恢复整个内容以在其中进行搜索。

我已经探索过 FAT 存在的问题:文件系统使用分配表索引来进行集群链存储和已删除文件标记,这使得文件恢复乍一看是不可能的。

但是有一个恢复软件广告承诺恢复从 FAT 文件系统中删除的文件。因此,我认为可能有一种解决方法。

我发现我们可以成功恢复连续位于磁盘上的文件。第一个集群给了我们一个索引,索引地址值给了我们找到存储文件大小的目录条目的强大可能性。但这是结束了吗?我也想恢复碎片文件,但找不到方法。

任何人都可以知道一种解决方法并在这里帮助我吗?

0 投票
2 回答
1254 浏览

python - Python shutil.copy 在 FAT 文件系统(Ubuntu)上失败

问题:在 Linux 中使用 shutil.copy() 将文件复制到 FAT16 挂载的文件系统失败(Python 2.7.x)。失败是shutil 内部错误,实际上在shutil.chmod 上失败,而shutil.copy 似乎正在执行。

Shell chmod 也失败了,因为 FAT 不支持权限。

问题:有什么巧妙的方法可以解决这个问题吗?我知道我有几个选择,例如:

  1. 使用 copyfile - 不理想,因为它需要完整路径,不仅仅是目标目录,而是可行的
  2. 执行shell cp 复制文件
  3. 编写不尝试更改文件模式的自己的复制功能

有没有办法在 Python 或 FAT 挂载选项中解决这个问题?我现在通过执行 mount -t vfat -o umask=000 /dev/loop0 /mnt/foo 在我的程序中安装文件系统

捕获异常没有帮助,因为异常发生在 shutil.copy 内部,而当它从 shutil.chmod() 捕获 IOException 时,shutil.copy() 似乎删除了目标文件,然后将 IOException 传递给调用函数。

有什么想法,还是我应该从 1-3 中选择一个?

汉努

0 投票
1 回答
787 浏览

assembly - 16 位程序集不打印字符

我有一个基本的引导加载程序,它应该将 FAT12 格式化软盘中的根扇区读取到内存中。(该部分有效)但在实现之后它停止将字符写入屏幕。上次它这样做是因为我忘了弹出一个寄存器。但是我已经三重检查了我是否将每个寄存器都弹出来。

我还使用了 BOCHS 调试器,据此它刚刚到达末尾并执行打印字符命令。

我现在被困住了。如果有人可以看一下我的代码,我会非常高兴。

这是我的代码:

http://pastebin.com/rcX7bZLV

提前致谢。

-蒂姆

PS:(对于那些会说我不应该复制代码的人)我只从breakthorn复制了“检查文件是否存在”代码,以查看我是否正确加载了ROOT。

0 投票
1 回答
890 浏览

operating-system - FAT12 - 从根目录读取文件的第一个簇号

在 FAT12 的根目录中,字节 26-27 代表文件的第一个簇的编号。但是,FAT12 中的簇号是 12 位长。那么根目录中那个 2 字节条目的哪一部分包含实际的 12 位簇号?在读取这 2 个字节以获得集群时是否需要执行任何转换?我在互联网上环顾四周,但找不到合适的解释。

0 投票
2 回答
886 浏览

assembly - 获取 FAT12 中的下一个簇号

我正在使用 BrokenThorn 的操作系统开发教程。我的困惑在于这段代码,它负责读取文件的下一个簇号:

根据我对在线资源和线程的阅读,这是我发现的:

  1. 文件根目录条目中的第一个簇号为 2 个字节。对于 FAT12,仅使用这 2 个字节的低 12 位。
  2. FAT12 的 FAT 以下列格式存储: vwX uYZ其中XYZ是一个簇号,uvw另一个是簇号。我对此有一个问题 - 哪个代表编号较低的 FAT 条目,哪个代表更高?

但是,看到代码,我无法理解上述两个事实(如果假设是正确的)是如何被使用的。最初,ax具有根目录的 2 个字节,其低 12 位可以直接使用。但这还没有完成。另外,这里的vwX uYZ格式是如何解析的?

如果有人可以详细解释这一点并指出我所犯的任何错误,那将非常有帮助

0 投票
3 回答
1486 浏览

embedded - 以 44 kHz 的速率将 16 位数据记录到 SD 卡

我正在使用带有 microSD 卡的 STM32F4 微控制器。我正在通过 DMA 捕获模拟数据。

我正在使用双缓冲区,一次采集 1280 个(10*128 - 10 个 FFT)样本。当一个缓冲区已满时,我设置一个标志,然后一次查看 128 个样本并对其运行 FFT 计算。所有这一切都运行良好。

数据正在以我想要的速率进行采样,FFT 计算正如我所期望的那样。如果我只是让程序运行一秒钟,我会看到它运行 FFT 大约 343 次(44000/128)。

但问题是我想将此 FFT 中的 64 个值保存到 SD 卡。

  • 我正在使用 HCC fat 文件系统库。
  • FFT 计算的每个循环我都将 64 个值复制到一个数组中。
  • 每 10 次计算后,我将这个数组的内容写入文件并重新开始。
  • 该数组存储 640 个 float_32 值 (10*64)。

这对于一秒钟的测试运行非常有效。我将 22,000 个值存储到 SD 卡中。

但是随着时间的增加,我开始丢失样本,因为 SD 卡需要更长的时间来写入。我需要 SD 卡始终存储超过 87 kbit/s(4 字节 * 64 * 343 = 87808)。我尝试增加 DMA 缓冲区样本大小,然后增加它的写入次数,但没有发现它有帮助。

我使用的是 4 类 8G microSD 卡。我将 SD 卡格式化为默认的 FAT32 分配单元大小 2048。

我应该如何组织数据缓冲以实现这一点?我认为使用更少的写入可能会有所帮助。排队有用吗?我将如何实现这一点,有人有例子吗?

我看到 Clifford 也有类似的问题,他正在使用队列, 如何使用 SD 卡以 48 ksamples/s 的速度记录 16 位数据?.

0 投票
3 回答
1815 浏览

filesystems - 为什么 Windows 使用 FAT 结构而不是传统的链表,文件的每个数据块都有一个 next 指针?

与其在表中存储对下一个节点的引用,为什么不能像传统的链表一样存储它,即使用下一个指针?