问题背景
在Bruce项目的1.9版本以及比1.9版本更高的版本当中,有用户报告了一个问题,是什么问题呢,是关于SD卡容量显示出现异常的问题。当用户把64GB的SD卡插入的时候,系统仅仅显示了3.44GB的可用空间,可是呢,在1.8版本以及1.8.2版本里,系统本来是能够正确显示大约59.44GB的实际可用空间的。
技术分析
在此问题方面,所关联到的是文件系统识别以及存储设备容量计算的核心机制。于嵌入式系统范围之内,还有Linux环境之中,SD卡容量的准确识别是依靠以下这些关键因素的。
分区表识别,即系统得正确去读取 SD 卡的分区表信息,文件系统检测,也就是系统要准确地识别 SD 卡上所使用的文件系统类型,容量计算算法,是指系统需正确地计算并且转换存储设备的物理扇区数成为可读的容量单位。
从技术方面来看,3.44GB这个数值极具提示特性,它靠近32位系统有可能碰到的最大寻址限定(4GB),这意味着也许存在下述问题当中的一个:
问题定位与修复

在后续提交里开发者修复了这个问题,从技术实现的角度开展分析,修复或许会涉及到以下的几个方面。
实现分区表解析逻辑的改进,以此来保证能够正确地处理大容量SD卡的分区信息,同时优化文件系统检测流程,尤其是针对FAT32/exFAT等常见SD卡文件系统的支持,还要修正容量计算算法,这有可能修复从扇区数到GB转换时所出现的计算错误,最后进行用户验证。
经用户验证的修复后的版本,已能够正确显示64GB SD卡之实际容量(约59.44GB)。这意味着修复方案有效解决了容量识别问题。
技术建议
对于嵌入式系统开发者,在处理存储设备时应注意:
处理大容量存储设备,始终使用64位数据类型,实现完善的错误处理,检测异常情况,对不同文件系统类型进行充分测试,考虑使用标准库函数处理存储设备信息,而非自定义实现 处置对不同文件系统类型进行充分测试是考虑使用标准库函数处理使用64位数据类型处理大容量存储设备实现完善的错误处理和异常情况检测存储设备信息而非自定义实现。
这个案例呈现了,嵌入式系统里存储设备处理过程中的,一个具有代表性的问题,也反映出,开源社区在问题快速响应以及修复方面的,那种突出的优势。