Winapi 无文件系统SD卡分区框架

Winapi 无文件系统SD卡分区框架,winapi,embedded,disk-partitioning,Winapi,Embedded,Disk Partitioning,(这个项目可能会以超级用户或电子站点为主题,但这个问题的焦点是实现它的可编程软件。) 我有一个嵌入式系统,它以大约100KB/s的速度生成数据,需要在Windows PC上存储和稍后处理。串行流传输工作正常,但内部存储的明显优势是不需要笔记本电脑和数据收集室中的电缆 我的电路板有一个SD卡插座(SPI连接),我以前曾尝试将文件写入FAT文件系统。但这最终成为了一个可怕的瓶颈,原因之一是为了支持任意时间增长的任意长度的多个文件,FAT中的文件访问除了实际内容外,还需要读取和写入多层元数据(分配表本

(这个项目可能会以超级用户或电子站点为主题,但这个问题的焦点是实现它的可编程软件。)

我有一个嵌入式系统,它以大约100KB/s的速度生成数据,需要在Windows PC上存储和稍后处理。串行流传输工作正常,但内部存储的明显优势是不需要笔记本电脑和数据收集室中的电缆

我的电路板有一个SD卡插座(SPI连接),我以前曾尝试将文件写入FAT文件系统。但这最终成为了一个可怕的瓶颈,原因之一是为了支持任意时间增长的任意长度的多个文件,FAT中的文件访问除了实际内容外,还需要读取和写入多层元数据(分配表本身和目录),而且这些不能完全安装在微控制器RAM中,因此卡访问的数量被放大。更糟糕的是,某些任务(如查找新的空闲块)的卡大小具有线性复杂性

对FAT的另一个打击是,在没有事先清理卸载的情况下,它很容易在断电的情况下发生数据损坏,并且我的系统没有任何可以启动卸载的用户界面。我知道一些技术,包括断电中断和电容,可以让处理器和SD卡多运行几毫秒,但由于这些技术对热移除没有任何帮助,而且我现有的电路也没有这些技术,所以我正在尝试实现一种仅针对存储的崩溃设计

因此,我决定跳过文件系统,只使用该卡作为块的原始序列。但是,我不希望我的用户被邀请重新格式化包含数据的卡片

因此,我想对这些卡进行分区,并在前面放置一个小的胖分区,操作系统将识别该分区,并提供一个解释性的测试文件。用户需要能够更换卡,因此我需要在我的PC应用程序中自动化分区和格式化过程

原始访问可以通过调用
CreateFile(“\\\.\\PhysicalDisk3”)
和类似路径来实现,这可以在可移动磁盘上完成,而无需管理员权限。不过,这是我不想自己编写的代码。而且,在更改之后,操作系统仍必须被告知重新扫描卷


是否有内置于Windows或第三方开源框架中的API用于对SD卡进行分区,而无需直接按位访问分区表?如果没有,在更改分区后,我应该如何让Windows重新扫描卷?我更喜欢在XP和更高版本上工作的方法。

看起来Windows使用IOCTL机制进行分区管理。特别是,该选项看起来非常有用


我将进一步调查,然后更新此答案。

您的问题似乎与我目前在我们自己的一个项目中必须解决的问题几乎完全相同

我建议保持卡上fat32文件系统不变。
但是,您可以创建一个或多个大容器文件,其中包含连续的块,或者一个预缓存的分配表

这甚至可以通过嵌入式系统本身来实现。

然后,您可以访问容器本机中的所有块,而无需进一步访问fat,但卡可以由任何操作系统处理,甚至普通用户也可以复制文件

用于分配连续容器的简单函数:


然后,您可以在不使用文件系统库的情况下访问这些块,仅在第一次访问容器时才能确定容器的起始位置。

Q:您的嵌入式操作系统支持哪些类型的文件系统?否则,问:使用WindowsDDK(意识到您可能已经非常精通它)进行近距离接触和个人操作时,您感觉有多舒服?问:您是否考虑过使用FAT32,但覆盖您自己的错误检测/错误纠正?你的嵌入式操作系统是什么?没有嵌入式操作系统。嵌入式系统上总共有160KB的RAM,除了存储之外,还需要处理其他功能。我的理解是,就内存使用而言,FAT32和exFAT至少与普通FAT(FAT12、FAT16)一样糟糕。我很高兴将DDK用于用户模式开发(DDK头被打包用于命令行构建过程,甚至用于用户模式,我可以处理),但我不打算为可以在用户模式下完成的事情编写内核模式代码。还有一个建议:看一下Win32DiskManager的源代码。您可能可以为您的项目使用类似的工具:@paulsm4:我以前使用过几种图像工具,包括那个。他们只是复制一个存储在映像中的分区表,实际上并不与之交互,因此您需要一个与磁盘大小和(逻辑)几何结构相匹配的预先存在的映像。听起来好像Win32 DiskImager(请原谅我上面的错误)与SD卡交互的方式可能与您希望与SD卡交互的方式类似,并且您可能能够使用一些相同的Win32 API。我准备犯错:只是一个想法。IMHO…Q:我提到的源代码中有ioctl()吗?;)@paulsm4:当然,但与分区无关。我已经在使用文件系统库(),但它导致了我的问题。它使用调用堆栈作为其状态,使其与中断驱动的设计不兼容,它需要大量内存作为块缓存,经常读取和写入元数据,等等。我见过像您建议的那样使用大型容器文件的系统,但是,确保容器完全相邻需要低级别访问和直接调整文件系统结构;如果必须这样做,我宁愿自己管理整个分区。