基于nor flash芯片的擦写掉电数据保护方法及系统
技术领域
1.本发明涉及flash芯片擦写掉电数据保护的技术领域,特别涉及一种基于nor flash芯片的擦写掉电数据保护方法及系统。
背景技术:2.flash存储器又称为闪存,是一种可重复擦写的存储器,它分为nor flash和nand flash。由于nor flash支持xip(execute in place),即代码可直接在nor flash上执行,无需拷贝到内存中,因此具有较高的性价比,被广泛搭载于iot嵌入式设备中。
3.对于没有电池的嵌入式设备,很容易发生随机掉电。例如对系统文件进行修改时,会有擦、写flash的操作,若此时出现设备掉电,除被擦写区域数据不符合预期外,还会有概率使得flash其他区域(尤其是存储代码的区域)数据受到窜改。
4.为什么擦写flash时掉电会导致其他区域的数据被窜改呢?这与flash的工作特性有关。以为3.3v正常供电的flash为例,其正常工作电压约为0.7*v
cc
~1*v
cc
(约2.31~3.30v),停止工作电压一般为0.3*v
cc
以下(约0.99v以下),这两段范围之间有一个灰色电压区域,即0.3*v
cc
~0.7*v
cc
(约0.99~2.31v),此电压下flash处于异常工作状态,该状态下可能flash还在工作,但不保证工作的结果正确。cpu对flash进行擦/写是通过发命令、地址、数据的方式进行,若此时flash收到一条擦除a地址数据的命令,flash实际可能把a地址的波形解析成b地址,然后将b地址的某一小段数据擦除。
5.因此,根据上述描述,在擦写过程中掉电,有如下过程:
6.1)在产品掉电时,对用户来说拔下插头只是一瞬间,对于板子上的各个器件来说,存在一个掉电过程,即电压从正常值掉到0的过程,这并非瞬间完成。
7.2)如果nor flash的异常电压阈值(上例中约为2.31v)比cpu的异常电压阈值(例如1.8v)高,设备整体掉电至flash灰色电压区域时,flash已为异常状态。但此时主控仍可以正常工作,且仍在向flash发送擦/写的命令和地址等数据。
8.3)flash在此异常工作电压下,收到命令和地址数据,内部可能会解析错误,因此造成其他区域数据被错误地修改。
9.若被窜改的区域为用户数据区,则用户下次使用该数据时,从flash中取到的是错误数据,假设该数据刚好为本地认证/授权所用的key值,最直观的结果就是设备授权/认证失败;若被窜改的区域为启动代码区,则该嵌入式设备在下次上电后,会启动异常。这种出现系统损坏而无法启动的情况,只能进行设备返修,非常影响用户使用体验。
技术实现要素:10.本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明提出一种基于nor flash芯片的擦写掉电数据保护方法,能够有效防止flash芯片中的数据被窜改。
11.本发明还提出一种具有上述基于nor flash芯片的擦写掉电数据保护方法的基于nor flash芯片的擦写掉电数据保护系统。
12.本发明还提出一种具有上述基于nor flash芯片的擦写掉电数据保护方法的计算机可读存储介质。
13.根据本发明的第一方面实施例的基于nor flash芯片的擦写掉电数据保护方法,包括以下步骤:获取flash芯片的设备配置信息及子区域边界信息,存储于所述flash芯片的设备链表节点,采用掉电易失方式配置flash为独立块保护模式,并解除flash芯片所有区域的保护状态;接收到擦除/写入请求,预先锁定所有区域,启用全保护,根据所述擦除/写入请求通过区域解析得出待操作的子区域,依次对所述待操作的子区域的各个区块或扇区进行解锁,根据所述待操作的子区域的加解锁保护粒度执行擦除/写入操作;擦写操作完成,解除所有区域的保护状态,并反馈擦写操作状态信息。
14.根据本发明实施例的基于nor flash芯片的擦写掉电数据保护方法,至少具有如下有益效果:将擦/写区域按照子区域进行细分,并获取对应子区域的加解锁保护颗粒度,尽可能按照各子区域的最小保护颗粒度进行边擦/写边加解锁,可以在不改变用户擦写预期的情况下,尽可能的减小保护区域的颗粒度,达到保护区域的最大化。
15.根据本发明的一些实施例,所述获取flash芯片的设备配置信息包括:系统初始化时,获取所述flash芯片的id,根据id匹配芯片参数信息,并获取所述flash芯片的块大小、扇区大小、底部区域边界地址及顶部区域地址,存储于所述flash芯片的设备链表节点中。
16.根据本发明的一些实施例,接收到擦除请求,所述擦除请求包括:擦除模式、擦除地址、擦除区域大小、擦除flash设备号;若所述擦除模式为整片擦除或者所述擦除区域大小等于所述擦除flash设备号对应的所述flash芯片的大小,则直接整片擦除;否则尝试锁定所述flash芯片所有的块和扇区,根据所述擦除请求对所述待操作的子区域进行解锁,执行擦除操作。
17.根据本发明的一些实施例,根据所述擦除请求通过区域解析得出待操作的子区域,依次对所述待操作的子区域进行解锁,根据所述待操作的子区域的加解锁保护粒度执行擦除操作包括:根据所述擦除flash设备号读取相应的所述设备链表节点,根据所述擦除地址得出若干所述待操作的子区域;获取所述子区域的加解锁保护粒度,并根据所述擦除地址和所述擦除区域大小,获取所述待操作的子区域的可擦除长度;根据所述擦除地址、所述加解锁保护粒度、所述可擦除长度以及第一擦除模式对所述待操作的子区域执行擦除操作;其中所述第一擦除模式为所述擦除模式和所述加解锁保护粒度的较小者。
18.根据本发明的一些实施例,根据所述擦除地址、所述加解锁保护粒度、所述可擦除长度以及第一擦除模式对所述待操作的子区域执行擦除操作包括:
19.s110,基于所述第一擦除模式,根据所述可擦除长度得出所述待操作的子区域的总待擦除数量;s120,若所述总待擦除数量为0,则当前所述待操作的子区域的擦除完成;否则,计算所述加解锁保护粒度按所述第一擦除模式进行擦除时的第一擦除单元数量;s130,若所述第一擦除数量大于所述总待擦除数量,则配置所述第一擦除数量为所述总待擦除数量;s140,解锁当前擦除地址所属的块或扇区的锁定状态,调用flash通用擦除接口从当前擦除地址开始向后擦除所述第一擦除数量的所述第一擦除模式的单元;s150,锁定当前擦除地址所属的块或扇区,所述总待擦除数量减去所述第一擦除数量,将当前擦除地址后移至下一擦除操作位置,返回至所述步骤s120。
20.根据本发明的一些实施例,接收到写入请求,所述写入请求包括:写入地址、数据
缓存地址、写入数据长度、写入flash设备号;若所述写入地址不超过所述写入flash设备号对应的所述flash芯片的最大地址,则尝试锁定所述flash芯片所有的块和扇区,根据所述写入请求对所述待操作的子区域进行解锁,执行写入操作。
21.根据本发明的一些实施例,根据所述写入请求通过区域解析得出待操作的子区域,依次对所述待操作的子区域进行解锁,根据所述待操作的子区域的加解锁保护粒度执行写入操作包括:根据所述写入flash设备号读取相应的所述设备链表节点,根据所述写入地址得出若干所述待操作的子区域;获取所述子区域的加解锁保护粒度,并根据所述写入地址和所述写入数据长度,获取所述待操作的子区域的可写入长度;根据所述写入地址、所述加解锁保护粒度、所述可写入长度以及所述数据缓存地址对所述待操作的子区域执行写入操作。
22.根据本发明的一些实施例,根据所述写入地址、所述加解锁保护粒度、所述可写入长度以及所述数据缓存地址对所述待操作的子区域执行写入操作包括:s210,确定所述待操作的子区域当前总剩余可写入长度小于0,则当前所述待操作的子区域写入完成;否则,执行步骤s220;s220,计算当前所述块或扇区可写入的第一长度,若当前总剩余可写入长度小于所述第一长度,则配置所述第一长度为当前总剩余可写入长度;s230,解除当前写入地址所属的块或扇区的锁定状态,调用flash通用page program接口,从当前写入地址写入所述第一长度的待写入数据;s240,锁定当前写入地址所属的块或扇区,当前写入地址及所述数据缓存地址均后移所述第一长度,当前总剩余可写入长度减去所述第一长度,返回步骤s210。
23.根据本发明的第二方面实施例的基于nor flash芯片的擦写掉电数据保护系统,包括:第一模块,用于获取flash芯片的设备配置信息及子区域边界信息,存储于所述flash芯片的设备链表节点,采用掉电易失方式配置flash为独立块保护模式,并解除flash芯片所有区域的保护状态;第二模块,用于接收到擦除/写入请求,预先锁定所有区域,启用全保护,根据所述擦除/写入请求通过区域解析得出待操作的子区域,依次对所述待操作的子区域的各个区块或扇区进行解锁,根据所述待操作的子区域的加解锁保护粒度执行擦除/写入操作;以及,擦写操作完成,解除所有区域的保护状态,并反馈擦写操作状态信息。
24.根据本发明实施例的基于nor flash芯片的擦写掉电数据保护系统,至少具有与本发明的第一方面实施例的方法同样的有益效果。
25.根据本发明的第三方面实施例的计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现根据本发明的第一方面实施例的方法。
26.根据本发明实施例的计算机可读存储介质,至少具有与本发明的第一方面实施例的方法同样的有益效果。
27.本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
28.本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
29.图1为本发明实施例的方法的流程示意图;
30.图2为本发明实施例的方法中flash的擦写区域与边界点的示意图;
31.图3为本发明实施例的方法中独立块保护功能对flash区域的划分示意图;
32.图4为本发明实施例的方法中系统初始化配置flash设备链表节点的示意图;
33.图5为本发明实施例的方法中flash擦除方法的主要步骤示意图;
34.图6为本发明实施例的方法中保护颗粒度自适应的数据擦除流程示意图;
35.图7为本发明实施例的方法中子区域安全擦除流程示意图;
36.图8为本发明实施例的方法中flash写入方法的主要步骤示意图;
37.图9为本发明实施例的方法中保护颗粒度自适应的数据写入流程示意图;
38.图10为本发明实施例的方法中子区域安全写入流程示意图;
39.图11为本发明实施例的测试方法中对flash测试区域划分示意图;
40.图12为本发明实施例的系统的模块示意框图。
41.附图标记:
42.第一模块100、第二模块200。
具体实施方式
43.下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
44.在本发明的描述中,若干的含义是一个或者多个,多个的含义是两个及两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。在本发明的描述中,步骤标号仅是为了描述的方便或者引述的方便所作出的标识,各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
45.参照图1,本发明的实施例的方法包括:获取flash芯片的设备配置信息及子区域边界信息,存储于flash芯片的设备链表节点,采用掉电易失方式配置flash为独立块保护模式,并解除flash芯片所有区域的保护状态;接收到擦除/写入请求,预先锁定所有区域,启用全保护,根据擦除/写入请求通过区域解析得出待操作的子区域,依次对待操作的子区域的各个区块或扇区进行解锁,根据待操作的子区域的加解锁保护粒度执行擦除/写入操作;擦写操作完成,解除所有区域的保护状态,并反馈擦写操作状态信息。
46.nor flash的写保护功能是通过配置寄存器的方式将某些区域保护起来,如果没有解锁保护,则master对此区域的写入和擦除命令,都会被flash直接忽略。
47.例如在flash不稳定的工作状态下,写a的命令被理解为写b,此时如果b地址是处于写保护区域,那这个命令会被忽略掉,不会对b地址区域造成实质性的破坏。
48.因此,本发明方法的基本思路如下所述。
49.一、采用flash的区域保护功能
50.1)依据flash特性(以2mbyte flash为例)将flash区域进行划分,在flash区域中标记多个边界点,0,4k,8k,...,2m;
51.2)将边界点与序号进行对应,分别为1,2,3,...,17,并将对应/映射信息存储与设备系统中,任一边界点可被选中,并将其左边区域、右边区域分别配置为保护区、非保护区或者非保护区、保护区;
52.3)设备系统上电后,进行初始化flash,配置flash设为全区域非保护状态;
53.4)每次进行擦/写操作时,先对擦写区域进行判断,选择最合适的边界点,将边界点的两边区域分别配置为保护区和非保护区,进行擦/写操作;
54.5)擦写操作完毕后,修改flash寄存器配置,恢复flash为全区域非保护状态。
55.上述步骤4中对区域的判断可由实施者自行定义,若需优先保护代码区,则直接选择小于擦/写区域起始地址的最大序号为边界点即可,将其左边配置为保护区;若想要尽可能保护较多的区域,则依据擦写区域的首尾地址判断出flash空间较多的一边,找到最近的一个边界点进行配置即可。举例如下:
56.a)如图2所示,当需要进行擦写“擦写区域1”时,寻找当前擦写区域附近最合适的边界点,例如将序号6(128k)边界点的左边(0~128k大小)配置为保护区,剩余右边(2048k-128k)为非保护区,防止在擦写掉电时,flash的前128k数据被窜改;也可以选择序号8(512k),将flash的512k~2048k区域配置为保护区,前面0~512k范围为非保护区,此种选择下可以尽可能多的保护flash区域。
57.b)同上,若要擦写“擦写区域2”时,可寻找边界点序号9(1m),将序号9的左边配置为非保护区域,将序号9边界点的右边配置为保护区域。或者选择序号8,将序号8的左边配置为保护区,保护代码段。
58.c)若需要擦写“擦写区域3”时,同样可选择边界点为序号11,配置0~1792k区域为保护区,1792k~2048k区域为非保护区。
59.上述这种区域保护的方式可以起到一定的保护作用,但是保护颗粒度较大,由于flash特性,只能选择从flash存储空间底部或者顶部开始的一片连续区域,将其配置为保护状态,无法做到较为全面地保护数据。因此本发明的实施例提出采用基于独立块保护的擦/写策略,下文将主要介绍此种策略。
60.二、采用flash的独立块保护功能
61.1)基于flash的独立块保护功能特性,将flash地址空间按照block(块)和sector(扇区)进行划分,以2mbyte大小的flash为例,如图3所示。
62.block大小为64kb,sector大小为4kb,底部区域可看作区域1,按照sector(4kb)的颗粒度进行保护和解保护(后文均用加锁和解锁描述代替);
63.中间区域可看作区域2,按照block(64kb)的颗粒度进行加锁和解锁;
64.顶部区域可看作区域3,按照sector(4kb)的颗粒度进行加锁和解锁。
65.因此,整个flash空间被拆分为了多个地址区域。通过对每个区域中的block/sector进行单独加锁和解锁操作以达到擦写保护的最小颗粒度,尽可能保护其他区域数据在flash擦写掉电时不被窜改。
66.2)擦写掉电时保护其他区域数据功能的主要流程为:
67.2-1)系统上电进行flash初始化,配置写保护相关功能,解除所有区域的保护状态;
68.2-2)上层应用调用flash掉电安全的擦/写接口,预先锁定所有区域,启用全保护;
69.2-3)通过区域解析计算需要操作的子区域,依次对待操作子区域的各个block/sector进行单独解锁、擦/写与加锁操作,直到所有子区域操作完毕;
70.2-4)解除所有block/sector的保护状态,并反馈擦/写操作状态信息。
71.其中,flash初始化流程可参考下文步骤3)的描述,擦除和写入的策略可参考步骤4)、5)等描述。
72.3)系统(flash)初始化时,如图4所示,处理步骤如下:
73.3-1)通过flash提供的命令获取当前flash的jedec(id),获取失败则退出;
74.3-2)通过id匹配该flash芯片的flash参数信息,若匹配失败则使用默认参数;
75.3-3)依据所使用的flash设备号,创建flash设备链表节点;
76.3-4)将获取到的flash block大小、sector大小、底部区域(区域1)边界地址、顶部区域边界地址(区域3)等配置信息存储于此flash设备链表节点中;
77.3-5)采用掉电易失的方式(volatile)配置flash为独立块保护模式(依据flash特性,此时flash一般会默认为所有区域全锁定);
78.3-6)解锁全部block/sector为非保护状态;
79.3-7)向系统控制台反馈输出flash各block的保护状态信息。
80.4)本发明实施例中的flash数据擦除方法,如图5所示,处理步骤如下:
81.4-1)通过调用传参,获取擦除的模式blk_size、地址addr、区域大小left、flash设备号等信息;
82.4-2)判断被操作区域是否超过flash总大小,若超出,执行步骤4-3),否则执行步骤4-4);判断操作的起始地址是否已按照擦除模式对齐,若不对齐,执行步骤4-3),否则执行步骤4-4);
83.4-3)退出擦除流程,返回错误信息;
84.4-4)检查是否擦除整片flash,若是,则直接擦除整片flash,退出擦除流程;否则,执行步骤4-5);
85.4-5)尝试锁定所有的block和sector,擦除前,将flash置于全区域保护状态。锁定成功则执行步骤4-6),否则执行步骤4-3);
86.4-6)执行解保护颗粒度自适应的擦除流程,循环检查并处理需要擦除的各个子区域(计算处理区域1、区域2、区域3...等),各子区域处理完毕后执行步骤g;
87.4-7)尝试解锁所有block和sector,擦除后,将flash置于全区域解保护状态。解锁成功则执行步骤4-8),否则执行步骤4-9);
88.4-8)退出擦除流程,返回安全擦除成功;
89.4-9)退出擦除流程,警告开锁失败。
90.其中,步骤4-6)为解保护颗粒度自适应的擦除流程,如图6所示,包括的子步骤如下:
91.4-6-1)判断总剩余待擦除长度left是否大于0,若是,表示未擦除完毕,则执行步骤4-6-3;否则执行步骤4-6-2;
92.4-6-2)剩余总待擦长度len为0,操作完毕,退出解保护颗粒度自适应的擦除流程;
93.4-6-3)依据所操作的flash设备号,从flash设备链表节点中获取该flash的区域边界信息,用于区分区域1、区域2、区域3...等;
94.4-6-4)依据当前待擦除区域的起始地址addr,从擦除的方向,获取下一个待擦除的子区域,若该子区域位于区域i(i=1,2,3...),则依据该区域i的边界信息(区域i的底部地址为bottom(i),顶部地址为top_addr(i)),计算该区域的最大可擦除长度len(i),len(i)=top_addr(i)-addr;
95.4-6-5)获取区域i对应的加解锁保护颗粒度,记为wp_size(i);
96.4-6-6)比较子区域的最大可擦除长度len(i)与总剩余待擦除长度left的大小,若len(i)大于left,则执行步骤4-6-7;否知执行4-6-8;
97.4-6-7)将子区域的最大可擦除长度len(i)赋值给子区域实际擦除长度len,执行步骤4-6-9;
98.4-6-8)将总剩余待擦除长度left赋值给子区域实际擦除长度len,执行步骤4-6-9;
99.4-6-9)比较擦除模式blk_size与加解锁保护颗粒度wp_size(i)的大小,若blk_size大于wp_size(i),则执行步骤4-6-10;否则执行4-6-11;
100.4-6-10)将该区域的加解锁保护颗粒度wp_size(i)赋值给该子区域的实际擦除模式erz_mode,保证擦除时,保护的颗粒度最小化,执行步骤4-6-12;
101.4-6-11)将擦除模式blk_size赋值给该子区域的实际擦除模式erz_mode,执行步骤4-6-12;
102.4-6-12)从地址addr开始,按照擦除模式为erz_mode、保护颗粒度为wp_size(i)、擦除长度为len的配置进行该子区域的擦除;
103.4-6-13)擦除地址addr向后移动长度为len的字节数,addr=addr+len;
104.4-6-14)总剩余待擦除长度left减少len个字节,left=left-len,跳转至步骤4-6-1继续执行。
105.上述步骤描述中,4-6-12)为执行子区域的擦除流程,擦除地址为addr,长度为len,擦除模式为erz_mode,加解锁保护颗粒度为wp_size(i),如图7所示,其中包括的子步骤如下:
106.4-6-12-1)计算该子区域待擦除block/sector数目blk_cnt,blk_cnt=len/erz_mode;
107.4-6-12-2)判断剩余待擦除block/sector数目blk_cnt是否大于0,若是,表示未擦除完毕,执行步骤4-6-12-4;否则执行4-6-12-3;
108.4-6-12-3)擦除子区域完毕,退出子区域擦除流程,返回成功;
109.4-6-12-4)判断加解锁保护颗粒度为wp_size(i)与擦除颗粒度erz_mode的大小关系,若wp_size(i)大于erz_mode,则执行步骤4-6-12-5;若wp_size(i)等于erz_mode则执行步骤4-6-12-6;否则执行步骤4-6-12-7;
110.4-6-12-5)计算此轮保护颗粒度内需要擦除的block/sector数目cnt,cnt=(wp_size(i)-addr%wp_size(i))/erz_mode,执行步骤4-6-12-8;
111.4-6-12-6)将此轮保护颗粒度内需要擦除的block/sector数目cnt赋值为1,执行步骤4-6-12-8;
112.4-6-12-7)退出子区域擦除流程,返回擦除错误(为达到最小的保护颗粒度,擦除颗粒度erz_mode为保护颗粒度wp_size(i)与预期擦除模式blk_size中的较小者,因此当前
策略下不允许存在wp_size(i)小于erz_mode的情况);
113.4-6-12-8)判断此轮需擦除的基本单元数cnt是否超过总剩余待擦除的基本单元数目blk_cnt,若超过,则执行步骤4-6-12-9;否则执行步骤4-6-12-10;
114.4-6-12-9)将总剩余待擦除基本单元数目blk_cnt赋值给此轮需擦除的基本单元数cnt,执行步骤4-6-12-10;
115.4-6-12-10)解除当前flash地址addr对应的block/sector锁定;
116.4-6-12-11)采用flash通用擦除方式,按照erz_mode擦除模式,从地址addr开始,向后擦除cnt个基本单元;
117.4-6-12-12)锁定当前操作地址addr对应的block/sector;
118.4-6-12-13)操作地址addr后移erz_mode*cnt个字节,addr=addr+erz_mode*cnt;
119.4-6-12-14)剩余待擦除block/sector数目blk_cnt减少cnt,blk_cnt=blk_cnt-cnt;
120.4-6-12-15)跳转到步骤4-6-12-2)执行,判断是否需要进行下一个block/sector解锁擦除操作。
121.5)本发明实施例中,提供的flash数据写入方法,参照图8,包括如下步骤。
122.5-1)通过调用传参,获取被写入flash的设备号、被操作物理地址addr、数据缓存地址data、数据长度len等信息;
123.5-2)判断被操作区域是否超过flash总大小,若超出,执行步骤5-3),否则执行步骤5-4);
124.5-3)退出写入流程,返回错误;
125.5-4)尝试锁定所有的block和sector,写入前,将flash置于全区域保护状态。锁定成功则执行步骤5-5),否则执行步骤5-3);
126.5-5)执行解保护颗粒度自适应的写入流程,循环检查并处理需要写入的各个子区域(计算处理区域1、区域2、区域3...等),各子区域处理完毕后执行步骤5-6);
127.5-6)尝试解锁所有block和sector,写入后,将flash置于全区域解保护状态。解锁成功则执行步骤5-7),否则执行步骤5-8);
128.5-7)退出写入流程,返回安全写入成功;
129.5-8)退出写入流程,警告开锁失败。
130.其中,步骤5-5)为解保护颗粒度自适应的写入流程,如图9所示,其包括的子步骤如下。
131.5-5-1)依据所操作的flash设备号,从flash设备链表节点中获取该flash的区域边界信息(区域i(i=1,2,3...)的底部地址为bottom(i),顶部地址为top_addr(i)),用于区分区域1、区域2、区域3...等;
132.5-5-2)判断总剩余待写入长度size是否大于0,若是,表示未写入完毕,则执行步骤5-5-4);否则执行步骤5-5-3);
133.5-5-3)总剩余待写入长度size为0,操作完毕,退出解保护颗粒度自适应的写入流程;
134.5-5-4)依据当前待写入区域的起始地址addr,从写入的方向,获取下一个待写入的子区域,若该子区域位于区域i,则依据该区域i的边界信息(区域i的底部地址为bottom
(i),顶部地址为top_addr(i)),计算该区域的最大可写入长度len(i),len(i)=top_addr(i)-addr;
135.5-5-5)获取区域i对应的加解锁保护颗粒度,记为wp_size(i);
136.5-5-6)比较子区域的最大可写入长度len(i)与总剩余待写入长度size的大小,若len(i)大于size,则执行步骤5-5-7);否知执行5-5-8);
137.5-5-7)将子区域的最大可写入长度len(i)赋值给子区域实际写入长度len,执行步骤5-5-9);
138.5-5-8)将总剩余待写入长度size赋值给子区域实际写入长度len,执行步骤5-5-9);
139.5-5-9)从地址addr开始,按照保护颗粒度为wp_size(i)、写入长度为len,数据缓存地址为data的配置进行该子区域的写入操作;
140.5-5-10)当前子区域写入完毕后,写入地址addr向后移动长度为len的字节数,addr=addr+len;
141.5-5-11)总剩余待写入长度size减少len个字节,size=size-len;
142.5-5-12)数据缓存地址后移len个字节,data=data+len,跳转至步骤5-5-2)继续执行。
143.上述步骤描述中,5-5-9)为执行子区域的写入流程,待写入地址为addr,长度为len,数据缓存地址为data,加解锁保护颗粒度为wp_size(i),如图10所示,其中包括的子步骤如下。
144.5-5-9-1)判断该子区域总剩余待写入长度len是否大于0,若是,表示未写入完毕,执行步骤5-5-9-3;否则执行5-5-9-2;
145.5-5-9-2)写入子区域完毕,退出子区域写入流程,返回成功;
146.5-5-9-3)依据当前的操作地址,计算当前保护颗粒度wp_size(i)内可写入的长度,记为ws,ws=wp_size(i)-(addr%wp_size(i));
147.5-5-9-4)判断此轮写入长度ws是否超过总剩余待写入长度len,若超过,则执行步骤5-5-9-5,否则直接执行步骤5-5-9-6;
148.5-5-9-5)将总剩余待写入长度len赋值给此轮写入长度ws,ws=len,执行步骤5-5-9-6;
149.5-5-9-6)解除当前flash地址addr对应的block/sector锁定状态;
150.5-5-9-7)采用flash通用的page program方式,从地址addr开始,向后写入ws个字节的data数据;
151.5-5-9-8)锁定当前操作地址addr对应的block/sector;
152.5-5-9-9)操作地址addr后移ws个字节,addr=addr+ws;
153.5-5-9-10)剩余带写入的数据缓存地址data后移ws个字节,data=data+ws;
154.5-5-9-11)该子区域的总待写入长度len减少ws个字节,len=len-ws,跳转到步骤5-5-9-2)执行,判断是否需要进行下一个block/sector解锁写入操作;
155.本发明方法的有益效果如下:
156.1)保护区域自适应,能达到最小保护颗粒度。无论是按照4k、32k还是64k的模式对flash进行擦除,还是向flash写入任意字节数据,均能进行自动处理。基本流程为将擦/写
program操作占比。
170.5)写入flash的数据不使用随机数,而使用魔数,选择其二进制值是0与1交替,且0与1个数相当的数,尽可能平衡“写”操作中每一轮写“0”的bit数。(如0x18,0x55,0x41,0xc3,其二进制分别为:1110 0111,1010 1010,1011 1110,0011 1100)。每轮写入魔数后,下一轮进行取反写入,保证每次写入的魔数均不相同。此种做法可以方便数据dump出来回溯。
171.本发明实施例的系统中,参照图12,包括以下模块:第一模块100,用于获取flash芯片的设备配置信息及子区域边界信息,存储于所述flash芯片的设备链表节点,采用掉电易失方式配置flash为独立块保护模式,并解除flash芯片所有区域的保护状态;第二模块200,用于接收到擦除/写入请求,预先锁定所有区域,启用全保护,根据所述擦除/写入请求通过区域解析得出待操作的子区域,依次对所述待操作的子区域的各个区块或扇区进行解锁,根据所述待操作的子区域的加解锁保护粒度执行擦除/写入操作;以及,擦写操作完成,解除所有区域的保护状态,并反馈擦写操作状态信息
172.尽管本文描述了具体实施方案,但是本领域中的普通技术人员将认识到,许多其它修改或另选的实施方案同样处于本公开的范围内。例如,结合特定设备或组件描述的功能和/或处理能力中的任一项可以由任何其它设备或部件来执行。另外,虽然已根据本公开的实施方案描述了各种例示性具体实施和架构,但是本领域中的普通技术人员将认识到,对本文所述的例示性具体实施和架构的许多其它修改也处于本公开的范围内。
173.上文参考根据示例性实施方案所述的系统、方法、系统和/或计算机程序产品的框图和流程图描述了本公开的某些方面。应当理解,框图和流程图中的一个或多个块以及框图和流程图中的块的组合可分别通过执行计算机可执行程序指令来实现。同样,根据一些实施方案,框图和流程图中的一些块可能无需按示出的顺序执行,或者可以无需全部执行。另外,超出框图和流程图中的块所示的那些部件和/或操作以外的附加部件和/或操作可存在于某些实施方案中。
174.因此,框图和流程图中的块支持用于执行指定功能的装置的组合、用于执行指定功能的元件或步骤的组合以及用于执行指定功能的程序指令装置。还应当理解,框图和流程图中的每个块以及框图和流程图中的块的组合可以由执行特定功能、元件或步骤的专用硬件计算机系统或者专用硬件和计算机指令的组合来实现。
175.本文所述的程序模块、应用程序等可包括一个或多个软件组件,包括例如软件对象、方法、数据结构等。每个此类软件组件可包括计算机可执行指令,所述计算机可执行指令响应于执行而使本文所述的功能的至少一部分(例如,本文所述的例示性方法的一种或多种操作)被执行。
176.软件组件可以用各种编程语言中的任一种来编码。一种例示性编程语言可以为低级编程语言,诸如与特定硬件体系结构和/或操作系统平台相关联的汇编语言。包括汇编语言指令的软件组件可能需要在由硬件架构和/或平台执行之前由汇编程序转换为可执行的机器代码。另一种示例性编程语言可以为更高级的编程语言,其可以跨多种架构移植。包括更高级编程语言的软件组件在执行之前可能需要由解释器或编译器转换为中间表示。编程语言的其它示例包括但不限于宏语言、外壳或命令语言、作业控制语言、脚本语言、数据库查询或搜索语言、或报告编写语言。在一个或多个示例性实施方案中,包含上述编程语言示
例中的一者的指令的软件组件可直接由操作系统或其它软件组件执行,而无需首先转换成另一种形式。
177.软件组件可存储为文件或其它数据存储构造。具有相似类型或相关功能的软件组件可一起存储在诸如特定的目录、文件夹或库中。软件组件可为静态的(例如,预设的或固定的)或动态的(例如,在执行时创建或修改的)。
178.上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。