背景技术
在系统启动之初,系统的内存并不是直接可读写的,内存中也没有可以执行的内核代码,这就需要进行系统引导。系统引导,是指在操作系统内核运行之前运行的引导程序,通过引导程序,初始化硬件设备、建立内存空间的映射图,为最终调用操作系统内核准备好正确的环境。引导程序通常存放在非易失存储设备上。
目前的非易失存储设备主要包括或非闪存(NOR FLASH)和与非闪存(NAND FLASH)两种。NOR FLASH的接口由地址总线,数据总线和读、写、片选等控制信号线组成,接口读写控制时序也和RAM芯片相同,可以实现代码的芯片内执行(XIP)操作,因此成为主流系统引导存储芯片。NANDFLASH的接口如图1所示,没有地址总线和数据总线的区分,对数据的读写操作都是通过I/O总线串行操作的。读取NAND FLASH的数据,需要先发送读操作命令并通过I/O总线输入要读取数据的地址,再由I/O总线读出数据,读写操作和RAM芯片的读写操作不同,无法实现XIP操作。
与NOR FLASH相比,NAND FLASH具有较高存储密度和较长使用寿命的优势,因此,也有越来越多的CPU支持NAND FLASH作为系统引导存储芯片。但是,NAND FLASH作为系统引导存储芯片,在启动过程中存在以下几个问题:
(1)坏块问题:由于NAND FLASH的工艺特点,坏块问题不可避免。 对NAND FLASH的擦除操作是将存储单元全部恢复成逻辑“1”电平,当NAND FLASH的数据块中有不能被恢复的页时,这个块就是坏块。坏块是不能再被使用的,通过自身的oob(out of band)区域进行标识。
(2)位翻转:数据在保持和读时,由于存储单元的电荷释放过程,会出现位翻转的问题,导致数据的异常。解决位翻转问题的方法是在每一页的oob区域记录该页数据的ECC,用于读取时的纠正动作,保证数据的可靠性。
(3)无法实现引导代码的备份执行:NAND FLASH不支持数据的随机访问,无法像NOR FLASH一样通过修改地址总线的连接方式达到更换启动代码位置,进行备份启动的目的。
由于以上几个问题的存在,NAND FLASH在系统引导方面的应用存在较大的风险,位翻转和坏块问题可能导致执行代码的错误,不能像NOR FLASH一样支持随机线性访问,也就无法直接实现代码段的备份启动。
现有技术中,可以通过如图2所示的连接方式实现从NAND FLASH启动,也可以通过如图3所示的连接方式实现从NAND FLASH启动。
在图2所示的连接方式中,CPU和NAND FLASH的各个管脚直接相连,CPU直接由NAND FLASH进行启动,由于NAND FLASH接口的限制,无法直接通过地址线读取特定地址的数据,无法通过更换启动代码位置实现对代码的备份启动;该连接方式显然也无法解决NAND FLASH的位翻转问题,无法保证启动代码的可靠性,无法保证系统启动的可靠性,因此,该连接方式也不适用在大批量生产的系统上。
在图3所示的连接方式中,使用一片小容量NOR FLASH存放初始启动代码,完成CPU NAND FLASH控制器的初始化并读取NAND FLASH中的更大段的启动代码,NOR FLASH中的读取NAND FLASH的代码需要带有坏块检测和ECC算法代码。然而,该实现方式需要使用NOR FLASH芯片,并实现坏块检测和ECC功能,因此,系统设计比较复杂。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图并举实施例,对本发明进行详细说明。
本发明通过利用NAND FLASH的高存储密度,在给定的模具尺寸内提供更高容量的特性,在NAND FLASH中存放多份备引导程序,并记录每个备引导程序相对于原始地址的偏移量;在系统引导需要时,通过逻辑芯片对CPU发送到NAND FLASH的原始地址进行偏移运算,进而更改将要读取的引导程序地址,从而达到读取备引导程序启动的目的。
这里的备引导程序,也即主引导程序的备份引导程序,以下统称为备引导程序。
下面以使用复杂可编程逻辑器件(CPLD)为例对本发明进行详细说明,本领域技术人员能够明了,这里的逻辑芯片并不限于CPLD,还可以是其它逻辑芯片,例如FPGA。
参见图4,图4是本发明实施例基于NAND FLASH的系统引导装置结构图;其中,CPLD分别与CPU NAND FLASH控制器的I/O管脚及NANDFLASH的I/O管脚相连,用于转接CPU和NAND FLASH之间的I/O总线;CPU的控制管脚与NAND FLASH的控制管脚直接相连,同时接入到CPLD。
图4所示装置中,NAND FLASH,用于预先存储主引导程序和一份或多份备引导程序;
CPU,用于在需要进行系统引导时,向NAND FLASH发送读控制命令和原始地址;在发送读控制信号和原始地址后,从NAND FLASH中读取引导程序并执行,如果执行成功,则发送定时信号到CPLD,否则不发送定时信号;所述的原始地址为一个在NAND FLASH地址空间范围内的地址;
CPLD,用于预先存储各备引导程序地址相对于原始地址的偏移量;用 于等待接收CPU发来的定时信号,并判断是否在预设时间内收到CPU发来的定时信号,如果未收到,若存在未被读取过的引导程序,则发送复位信号到CPU,重启CPU再次尝试进行系统引导,在CPU重新读取引导程序时,根据预先存储的备引导程序相对于原始地址的偏移量,对CPU向NANDFLASH发送的原始地址进行偏移运算得到一个未被读取过的备引导程序地址,并将所述未被读取过的备引导程序地址发送到NAND FLASH以使CPU读取该未被读取过的备引导程序;若不存在未被读取过的引导程序,则本次系统引导失败。
参见图5,图5是图4所示装置中CPLD的一种内部结构示意图,该CPLD包括:加法单元、地址偏移单元、计时单元、复位单元;其中,
加法单元,用于预先存储各备引导程序地址相对于原始地址的偏移量;
地址偏移单元,用于在CPU重新读取引导程序时,根据加法单元中存储的备引导程序相对于原始地址的偏移量,对CPU向NAND FLASH发送的原始地址进行偏移运算得到一个未被读取过的备引导程序地址,并将所述未被读取过的备引导程序地址发送到NAND FLASH以使CPU读取该未被读取过的备引导程序;
计时单元,用于等待接收CPU发来的定时信号,并判断是否在预设时间内接收到CPU发来的定时信号,如果是,则本次系统引导成功,否则,向复位单元发送超时信号;
复位单元,用于接收到计时单元发来的超时信号后,判断是否还有未被读取过的引导程序,如果是,则向CPU发送复位信号,重启CPU再次尝试进行系统引导,否则,本次系统引导失败。
另外,该CPLD还包括命令解析单元,用于检测CPU接入到CPLD的控制管脚的状态,并根据所述控制管脚的状态和CPU向NAND FLASH发送的读控制命令判断当前是否为地址周期,如果是,则向地址偏移单元发送地址周期指示;
所述的地址偏移单元,在对CPU向NAND FLASH发送的原始地址进行 地址偏移运算之前,进一步用于:判断是否接收到的命令解析单元发来的地址周期指示,如果是,则对CPU向NAND FLASH发送的原始地址进行地址偏移运算,否则,将转接的CPU和NAND FLASH间的I/O总线设置为直通模式;所述的直通模式为不对CPU和NAND FLASH间的数据传输进行干预的状态;
所述的CPU在CPU和NAND FLASH间的I/O总线为直通模式时从NAND FLASH中读取引导程序代码。
这里,由于NAND FLASH只有I/O总线,在需要读取NAND FLASH中的数据时,需要先发送读控制命令和读取地址到NAND FLASH,然后从NAND FLASH读取所述读取地址处的数据,其中,发送读取地址是在地址周期发送到NAND FLASH的,从NAND FLASH中读取数据则是在数据周期进行,此属于现有技术,不再赘述。
本发明中,CPU也需要按照上述过程读取引导程序,因此,命令解析单元需要根据控制管脚的状态和CPU向NAND FLASH发送的读控制命令判断当前是否为地址周期,这里,判断当前是否是地址周期的方法与现有技术相同。如果当前为地址周期,则向地址偏移单元发送地址周期指示,地址偏移单元需要根据命令解析单元发来的地址周期指示,在地址周期且需要将原始地址进行地址偏移运算时做地址偏移运算,在非地址周期,CPLD不需要对CPU和NAND FLASH之间的传输数据或命令做任何修改,因此将其转接的CPU和NAND FLASH之间的I/O总线设置为直通模式。直通模式是指CPLD对其转接的CPU和NAND FLASH间的I/O总线上传输的数据不做任何改动或干扰时该I/O总线的状态。
这里,由于CPU从NAND FLASH读取引导程序之前,已经由CPLD根据是否首次进行系统引导,对CPU向NAND FLASH发送的原始地址进行了相应处理,并将处理后得到引导程序地址发送到NAND FLASH,因此CPU在CPLD转接的I/O总线被设置为直通模式后,可以直接读取NAND FLASH中的该引导程序地址处的引导程序。
另外,计时单元还具有计时功能,每次进行系统引导时,CPLD在等待接收CPU发来的定时信号之前,需要启动计时功能;在接收到CPU发来的定时信号之后,确定本次系统引导成功,关闭计时功能。可以在系统引导过程中的任何时刻起开启计时功能,只要所述的预设时间大于从计时时刻开始到CPU执行引导程序完成所需要的时间即可。例如,可以在接收到CPU发来的主引导程序地址后开始计时,也可以从CPU开始读取并执行引导程序时开始计时。
参见图6,图6是图4所示装置中NAND FLASH中一种引导程序存放方式示意图。在NAND FLASH中存储的多份引导程序按照如下方式存放:预先根据NAND FLASH的数据块大小,计算每份引导程序占用的数据块数,将每份引导程序分别从引导程序占用的NAND FLASH数据块数的整数倍位置处的数据块的起始位置开始存放。例如,假设NAND FLASH的数据块大小为128kbytes,引导程序大小为550kbytes,共需要占用NAND FLASH的5个数据块,如果将引导程序1作为主引导程序从NAND FLASH的第1个数据块的开始位置存放,并占用NAND FLASH的第0到4共5个数据块;引导程序2作为第一个备引导程序从第5个数据块的开始位置存放,并占用从第5到9共5个数据块块开始的5个块;引导程序3作为第二个备引导程序从第10个数据块的开始位置存放,并占用从第10到14共5个数据块;依次类推。在实际应用中,也可以将所述主引导程序和备引导程序依次存放在NAND FLASH中,例如,引导程序2从引导程序1的结尾处开始存放,引导程序3从引导程序2的结尾处开始存放,依次类推。也可以将所述主引导程序和备引导程序乱序存放。
本发明中,由于CPU是在复位重启后进行系统引导,每次重试进行系统引导时发送的地址均为原始地址。为了实现能够从备引导程序启动,加法单元需要记录系统引导重试次数,以便在本次读取的引导程序执行失败时,获取下一个未被读取过的引导程序地址。
为此,加法单元进一步用于预先设置并初始化系统引导重试次数为0; 进一步用于:在接收到CPU发来的定时信号后,将系统引导重试次数清零;用于等待接收复位单元发来的重试通知,并在接收到复位单元发来的重试通知后,将系统引导重试次数加1;
复位单元进一步用于:预先存储备引导程序份数;在接收到计时单元发来的超时信号后,判断当前系统引导重试次数是否小于预先存储的备引导程序份数,如果是,则确定存在未被读取过的备引导程序,否则,不存在未被读取过的备引导程序;在向CPU发送复位信号时,进一步用于:向加法单元发送重试通知;
地址偏移单元对CPU发往NAND FLASH的原始地址进行偏移运算得到一个未被读取过的备引导程序地址时,具体为:如果当前系统引导重试次数为n,则将加法单元中记录的第n个备引导程序地址相对于原始地址的偏移量与原始地址相加得到的值作为一个未被读取过的备引导程序地址。这里n为大于0的自然数。
另外,为了防止无限制的重试进行系统引导,所述的复位单元进一步用于:预先存储备引导程序份数;在接收到计时单元发来的超时信号后,将系统引导重试次数加1之前,进一步用于:判断当前系统引导重试次数是否小于预先存储的备引导程序份数,如果是,则确定存在未被读取过的备引导程序,否则,不存在未被读取过的备引导程序。
这里的备引导程序份数为NAND FLASH中存储的备引导程序实际份数。
这里,CPLD可以根据所述系统引导重试次数确定CPU是首次读取引导程序或重新读取引导程序,如果系统引导重试次数为0,则确定CPU是首次读取引导程序,如果系统引导重试次数不为0,则确定CPU是重新读取引导次数,如果是重新读取引导程序,则需要对CPU发往NAND FLASH的地址进行地址偏移运算,这在前面已经详细介绍过。
另外,为了进一步验证引导程序的正确性,在引导程序的固定位置存放有该段引导程序的CRC记录;
CPU读取并执行NAND FLASH中的引导程序完成后,向计时单元发送 定时信号之前,进一步用于:对读取的引导程序进行CRC运算,并将运算结果与引导程序中的CRC记录相比较,如果相同,则向计时单元发送定时信号,否则,不发送定时信号。
图4所示本发明实施例中,所述的原始地址可以是主引导程序地址,也可以是非引导程序地址;如果是主引导程序地址,则在首次进行系统引导时,不需要CPLD对该原始地址进行地址偏移运算;如果上述的原始地址不是主引导程序地址,则在首次进行系统引导时,CPLD还需要进一步对该原始地址进行地址偏移运算得到主引导程序地址。
因此,所述的原始地址为非引导程序地址时,所述的加法单元进一步用于:预先存储主引导程序地址相对于原始地址的偏移量;所述的地址偏移单元进一步用于:在首次进行系统引导时,将加法单元中预先存储的主引导程序地址相对于原始地址的偏移量与所述原始地址相加得到的和作为主引导程序地址,并将所述主引导程序地址发送到NAND FLASH。
以上对本发明基于NAND FLASH的系统引导装置进行了详细说明,本发明还提供了一种基于NAND FLASH的系统引导方法。
参见图7,图7是本发明实施例在图4所述装置上实现的基于NANDFLASH的系统引导方法流程图,该方法包括以下步骤:
步骤701、预先在NAND FLASH中存储主引导程序和一份或多份备引导程序,预先在CPLD中存储各备引导程序地址相对于原始地址间的偏移量;
步骤702、需要进行系统引导时,CPU向NAND FLASH发送读控制命令和原始地址,并在发送读控制命令和所述原始地址后,从NAND FLASH中读取引导程序并执行,如果执行成功,则发送定时信号到CPLD,否则不发送定时信号;
步骤703、CPLD等待接收CPU发来的定时信号,并判断是否在预设时间内收到CPU发来的定时信号,如果未收到,若存在未被读取过的引导程序,则发送复位信号到CPU,重启CPU再次尝试进行系统引导,并在CPU重新读取引导程序时,根据预先存储的备引导程序相对于原始地址的偏移量,对 CPU向NAND FLASH发送的原始地址进行偏移运算得到一个未被读取过的备引导程序地址,并将所述未被读取过的备引导程序地址发送到NANDFLASH,以使CPU读取该未被读取过的备引导程序;若不存在未被读取过的引导程序,则本次系统引导失败。
这里的原始地址为一个在NAND FLASH地址空间范围内的地址。
图7所示实施例中,所述CPLD还持续监控CPU接入到该CPLD的控制管脚的状态;
所述CPLD对CPU向NAND FLASH发送的原始地址进行地址偏移运算之前,进一步包括:根据监控到的控制管脚的状态和CPU向NAND FLASH发送的读控制命令判断当前是否为地址周期,如果是,则对CPU向NANDFLASH发送的原始地址进行地址偏移运算,否则,将CPLD转接的CPU和NAND FLASH间的I/O总线设置为直通模式;所述的直通模式为CPLD对其转接的CPU和NAND FLASH间的I/O总线上传输的数据信息不进行干预时该I/O总线的状态;
CPU在和NAND FLASH间的I/O总线为直通模式时从NAND FLASH中读取引导程序代码。
另外,CPLD具有计时功能,每次进行系统引导时,CPLD在等待接收CPU发来的定时信号之前,需要启动计时功能;在接收到CPU发来的定时信号之后,确定本次系统引导成功,关闭计时功能。可以在系统引导过程中的任何时刻起开启计时功能,只要所述的预设时间大于从计时时刻开始到CPU执行引导程序完成所需要的时间即可。例如,可以在接收到CPU发来的主引导程序地址后开始计时,也可以从CPU开始读取并执行引导程序时开始计时。
图7所示本发明实施例中,预先在CPLD中设置并初始化系统引导重试次数为0;预先在CPLD中存储备引导程序份数;
步骤703所述CPLD在判断确定在预设时间内接收到CPU发来的定时信号之后,进一步包括:将系统引导重试次数清零;在判断确定未在预设时 间内接收到CPU发来的定时信号之后进一步包括:将系统引导重试次数加1,并在将系统引导重试次数加1之前,判断当前系统引导重试次数是否小于备引导程序份数,如果是,则存在未被读取过的备引导程序,否则,不存在未被读取过的备引导程序;
步骤703所述CPLD根据预先存储的备引导程序地址相对于原始地址间的偏移量,对CPU向NAND FLASH发送的原始地址进行偏移运算得到一个未被读取过的备引导程序地址的方法为:如果系统引导重试次数为n,则将原始地址和第n个备引导程序地址相对于原始地址的偏移量相加,将相加得到的和作为一个未被读取过的备引导程序地址。
这里,CPLD根据预先存储的备引导程序地址相对于原始地址间的偏移量,对CPU向NAND FLASH发送的原始地址进行偏移运算之前,可以根据当前系统引重试导次数确定CPU是首次读取引导程序还是重新读取引导程序,如果当前系统引导重试次数为0,则可以确定CPU是首次读取引导程序,如果当前系统引导重试次数不为0,在可以确定CPU是重新读取引导程序。因此,根据系统引导重试次数,就可以确定是否需要对原始地址作地址偏移运算。
另外,为了进一步验证读取的引导程序,NAND FLASH中存储的引导程序的固定位置处存放了该段引导程序的CRC记录;步骤702所述CPU执行引导程序完成后,向CPLD发送定时信号前,进一步包括:对接收到的引导程序进行CRC运算,并将运算结果与引导程序中固定位置处存放的CRC记录进行比较,如果相同,则向发送CPLD发送定时信号,否则,不发送定时信号。
图7所示本发明实施例中,所述原始地址可以是主引导程序地址,也可以是非引导程序地址;如果是主引导程序地址,则在首次读取引导程序时,不需要CPLD对该原始地址进行地址偏移运算;如果不是主引导程序地址,则在首次读取引导程序时,还需要对该原始地址进行地址偏移运算。
因此,所述的原始地址为非引导程序地址时,所述的CPLD还预先存储 主引导程序地址相对于原始地址的偏移量;在CPU首次读取引导程序时,将主引导程序地址相对于原始地址的偏移量与所述原始地址相加得到的和作为主引导程序地址,并将所述主引导程序地址发送到NAND FLASH。
由上述本发明的技术方案可知,本发明针对目前从NAND FLASH进行系统引导时存在的不可靠和不实用问题,提出一种基于NAND FLASH的系统引导方法和装置。利用逻辑芯片对系统引导进行监控和更改引导程序地址操作,且更换引导程序起始的过程对CPU和NAND FLASH透明,因此,适用于所有使用NAND FLASH的系统;利用NAND FLASH存储密度高、存储容量大的特点进行多备份启动操作,在保证系统可靠启动的前提下,省略了坏块检测和ECC校验的逻辑实现,规避了NAND FLASH芯片的固有缺陷,提高了NAND FLASH引导系统的可靠性;另外本发明还简化了接口逻辑的实现,提高了可实现性。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。