我需要创建一个实用程序来检查闪存中的坏扇区。
我从我拥有的旧闪存驱动器开始,将它卡在我的 Ubuntu 笔记本电脑中并检查dmesg
它是否安装为/dev/sdb
,然后我跑去fdisk
查看扇区的数量/大小:
mike@mike-Qosmio-X770:~$ sudo fdisk -l [sudo] 迈克的密码:
磁盘 /dev/sdb:127 MB,127926272 字节 16 个磁头,32 个扇区/磁道,488 个柱面,总共 249856 个扇区
单位 = 1 个扇区 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/ O 大小(最小/最佳):512 字节/512 字节
磁盘标识符:0x6b3ee723Device Boot Start End Blocks Id System /dev/sdb1 * 32 249854 124911+ b W95 FAT32
太好了,我知道一个扇区是 512 字节,总共应该有 249,856 个。基于此,我编写了这个小测试程序来仔细检查:
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
FILE * fp = NULL;
char buffer[512] = {0}; // size of a sector, 512 bytes
long sector_count = 0;
fp = fopen("/dev/sdb", "rb"); // open the flash device as binary
if(fp == NULL) {
printf("Can't open the flash drive!\n");
return -1;
}
while(!feof(fp) && (fread(buffer, sizeof(buffer), 1, fp) > 0)){
sector_count++;
}
fclose(fp);
printf("Sectors: %ld\n", sector_count);
return 0;
}
工作得很好,报告了 249856。现在我一直在思考如何继续。将一系列0xFF
's 写入驱动器(512x2498561
位),然后将其读回以确保将其设置为 1 是否可行?然后写相同数量的0
s,确保可以清零?
这会验证一切正常吗?有没有机会我可以覆盖 FTL(Flash 翻译层)代码,或者即使我像这样弄乱驱动器也能保护它?
<background for interested parties>
这是一个项目,我们有一个具有奇怪行为的 uCLinux 2.4 内核。我们怀疑硬件不好(特别是闪存),但我找不到在 2.4 上工作的好工具来测试闪存 fs,所以我想我会尝试写我自己的。
</background>