1、扩容原理
首先对实现扩容卡的原理做下介绍,有以下几种可能:
1、只修改了相关寄存器或其它方面的数值,使得SD卡显示容量大于实际容量,超出实际容量的地址完全无法写入数据;
2、另一种实现扩容卡的方式是,不仅从数值上改变了容量,还将超出实际容量的地址映射到备份分区,使得超出实际容量的部分数据仍旧能够正常读写;
(SD卡除了已用的物理存储空间外,还保留有一段存储空间作为备份分区,用来替换SD卡使用中产生的坏块)
3、另一种比较高级的方式是,将超出实际容量的地址重复映射到实际物理存储空间中;这样在写数据时,会动态覆盖之前写入的数据,使得超出实际容量的数据能够正常读写,但会损坏旧的数据。
2、检测原理:
SD卡很多用于智能设备存储,例如家用语音摄像头,一般在设备上格式化后会被设备写入一些其自身可识别的索引,设备检测到了自己可以认识的索引,就知道卡是可写入的,不会报格式化或初始化的提示,因此一些厂商会用这部分自己写入的索引信息检测SD卡是否为扩容卡,便于提示用户卡是否正常,下面为某厂商的网络摄像头SD卡存储内容,以此为例介绍下目前主要为三种检测方法:1、寄存器信息检测;2、索引检测;3、读写数据检测;
1、寄存器信息检测
Card Identification Register (CID)有16字节长,它包含了SD卡的唯一识别信息,标准的设计要求每张卡片的CID都不相同(之前我们有接到一例几张卡CID完全一致的现场)。这些信息是在卡的生产期间被烧录,主控制器不能修改它们的内容。
其中MID(Manufacturer ID)信息标识SD卡制造商,是由SD-3C, LLC统一进行管理分配的。比如Sandisk为0x02,Kingston为0x37,Samsung为0x15,该检测方式不会对知名大厂的产品误报。
优点:很多扩容卡、假卡厂商会直接将MID字段置为0x00,在开机、重启、插卡时,可以通过检测MID字段是否为0,来识别扩容卡、假卡。
缺点:
1、误报的可能:SD卡制造厂商比较多,可能一些小厂并未申请MID标识,将自己产品的MID信息置为0,导致产品误报;
2、漏报的可能:如果这些小厂将大厂的MID信息烧录到自己的产品中,或者随意烧写一个值,此方法将无法检测。
2、索引检测
索引检测主要是检测3个索引,partition、file_info、event_entry(分区、文件、事件索引);
a.每一个类型的数据(录像、图片)有一个索引文件(sys001.bin,sys002.bin…);
b.每个索引文件有一个partition结构体,记录当前写到哪个数据文件等信息;
c.每类数据包含多个数据文件,每个数据文件对应一个file_info索引,记录文件中事件个数、起止时间等;
d.每个文件里存储有多个事件,每个事件都对应一个event_entry索引,记录事件数据对应的偏移、长度、时间戳等信息;
索引文件就是由这三类索引结构体构成,检测的时机是在格式化的时候检查所有索引,检测方法是检查索引文件的CRC检验和,当格式化正常但中间有索引检测不通过,则显示疑似扩容卡;
注:索引是单独存在的,有单独存在的sys0x.bin文件(x为1-4,意思分别如下),256M是MP4文件;
- 录像数据文件(对应.mp4)
- 普通图片(对应.pic)
- 过线统计数据(对应tp00000.bin)
- 消息推送图片(对应.msgpic)
有一个系统索引文件存储sysinfo,其名称为sys00.bin;2. sys0xb.bin为备份文件;
3、读写数据检测
录像数据是以MP4存储的,MP4文件具有固定的格式,通过定时检测已经录好的MP4文件的格式,判断已经存储的录像数据是否损坏,来检测SD卡是否是扩容卡。
(一个MP4文件录满切换到下一个时检测,检测MP4文件会检查对应的file_info和MP4格式的头部)
该方法肯定能最终检测出扩容卡,但可能耗时较久(而且表现是一开始插入的时候可能不提示扩容卡,而是在使用期间提示)。同时存在一个问题是,如果人为改变了录像数据文件,则可能误报。
3、SD异常判断机制
同时顺便介绍下设备判断SD卡异常,需要格式化的依据:
1、格式化过程出错;
2、sys00.bin文件不存在,或读写权限异常;
3、SD卡中sys00.bin文件存在且可读写,但文件内容异常;
4、每个数据类型有两个索引文件,如录像有sys01.bin和备份文件sys01b.bin,如果任一类型的索引文件和备份文件同时都不存在或者读写权限异常;
5、各数据类型的索引文件和其备份文件都存在,且读写权限正常,但从索引文件中读取分区信息失败,即分区信息异常;
补充:CRC检测原理
其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。