[建议]elm FatFs中MAX_SECTOR_SIZE的处理

发布于 2013-07-26 19:56:50
一般的存储设备都是512字节的扇区,但现在有越来越多的设备使用更大的扇区。
在FatFs中有一个定义_MAX_SS定义,默认为512。

在RT-Thread的移植中,定义了一个 RT_DFS_ELM_MAX_SECTOR_SIZE 与之对应。
当需要支持更大的扇区时,修改RT_DFS_ELM_MAX_SECTOR_SIZE的定义即可。
// 
#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096


因RT-Thread的灵活性,可能会在编译固件时没有设置支持大的扇区,但后面却挂载了一个大扇区的设备。
而目前没有检查,然后导致缓冲区溢出,于是内存被写穿。

这块需要更新。

查看更多

关注者
0
被浏览
2.9k
5 个回答
flydream0
flydream0 2013-08-26
遇到过同样问题,修改rtconfig.h的宏定义即可
flydream0
flydream0 2013-08-26
RT_DFS_ELM_USE_LFN默认值为2,实际为2时是需要添加其它文件才能编译过,因此建议RT_DFS_ELM_USE_LFN默认值设为0
prife
prife 2013-08-26
好的,我来检查下,看看如何解决掉。
aozima
aozima 2013-11-04
拒绝白嫖,拒绝键盘侠!
在RT-Thread的fatfs应用场景中,虽然扇区设置为512,但还是有可能去挂载大于512字节扇区的存储器。
此时如果不提前做检查,会导致写穿。

 components/dfs/filesystems/elmfat/ff.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/components/dfs/filesystems/elmfat/ff.c b/components/dfs/filesystems/elmfat/ff.c
index 014d70f..5a0d340 100644
--- a/components/dfs/filesystems/elmfat/ff.c
+++ b/components/dfs/filesystems/elmfat/ff.c
@@ -108,12 +108,12 @@
#if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096
#error Wrong sector size.
#endif
-#if _MAX_SS != 512
-#define SS(fs) ((fs)->ssize) /* Multiple sector size */
-#else
-#define SS(fs) 512U /* Fixed sector size */
-#endif

+// #if _MAX_SS != 512
+#define SS(fs) ((fs)->ssize) /* Multiple sector size */
+// #else
+// #define SS(fs) 512U /* Fixed sector size */
+// #endif

/* Reentrancy related */
#if _FS_REENTRANT
@@ -2058,10 +2058,12 @@ FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
stat = disk_initialize(fs->drv); /* Initialize low level disk I/O layer */
if (stat & STA_NOINIT) /* Check if the initialization succeeded */
return FR_NOT_READY; /* Failed to initialize due to no media or hard error */
-#if _MAX_SS != 512 /* Get disk sector size (variable sector size cfg only) */
+
+//#if _MAX_SS != 512 /* Get disk sector size (variable sector size cfg only) */
if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK)
return FR_DISK_ERR;
-#endif
+//#endif
+
#if !_FS_READONLY
if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */
return FR_WRITE_PROTECTED;
@@ -3601,10 +3603,12 @@ FRESULT f_mkfs (
stat = disk_initialize(drv);
if (stat & STA_NOINIT) return FR_NOT_READY;
if (stat & STA_PROTECT) return FR_WRITE_PROTECTED;
-#if _MAX_SS != 512 /* Get disk sector size */
+
+//#if _MAX_SS != 512 /* Get disk sector size */
if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK)
return FR_DISK_ERR;
-#endif
+//#endif
+
if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128)
return FR_DISK_ERR;
b_vol = (sfd) ? 0 : 63; /* Volume start sector */

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览