一种独立于操作系统的计算机系统内存检测方法及系统
技术领域
本发明涉及计算机内存检测领域,具体涉及一种高效、可靠的内存检测方法,尤其涉及一种独立于操作系统的计算机系统内存检测方法。
背景技术
由于目前计算机系统往往会采用SDRAM、DDR等内存设备作为存储设备。因此对内存的检测,确保内存的完好性对于计算机系统的开发和调试发挥着尤为重要的作用。现有成熟的技术大部分是应用于操作系统层面的内存检测应用程序,无法在无操作系统的环境或操作系统无法工作的情况下正常检测内存问题。这就需要一种可以独立于操作系统的内存检测方法。而现有的内存检测方法大多是通过写一些特殊数值并回读进行比较的方式查看内存设备是否存在问题。这类方法写的特殊值通常是0x55555555和0xaaaaaaaa,这种方法有着明显的局限性,其无法检测出非相邻数据线的短路问题,同时该类方法无法检测出地址线的恒0恒1问题,即可能存在给定检测地址范围内无法访问到的地址的漏检情况。依靠这种检测方式不仅效率不高并且有着明显的缺陷,因此就需要一种全新的可以独立于操作系统之外的性能高效且可靠的内存检测方法。
发明内容
本发明要解决的技术问题有两点,分别为现有的内存检测程序无法独立于操作系统应用在裸机环境中来完全检测计算机系统的内存可用性问题,以及现有的内存检测方法效率低、有着检测盲点等不可靠因素。
针对现有技术的不足,本发明提出一种独立于操作系统的计算机系统内存检测方法,其中包括:
步骤1、在计算机系统启动初期,对计算机内存中预设地址范围内所有地址的所有数据位写0,对写过0的地址进行逐个回读,判断回读的数值与0是否一致,若是,则执行步骤2,否则输出内存错误作为检测结果;
步骤2、对计算机内存中预设地址范围所有地址的所有数据位写1,对写过1的地址进行逐个回读,判断回读的数值与1是否一致,若是,则执行步骤3,否则输出内存错误作为检测结果;
步骤3、对计算机内存中预设地址范围所有地址的所有数据位写当前地址原值,对写过地址原值的地址进行逐个回读,判断回读的数值与其对应的地址值是否一致,若是,则执行步骤4,否则输出内存错误作为检测结果;
步骤4、对计算机内存中预设地址范围所有地址的所有数据位写当前地址按位取反后的数值,对写过取反数值的地址进行逐个回读,判断回读的数值与其对应的地址取反值是否一致,若是,则输出计算机内存无误作为检测结果,否则输出内存错误作为检测结果。
所述的独立于操作系统的计算机系统内存检测方法,其中还包括获取预设的循环总数,且该循环总数为偶数,在该步骤3开始前初始循环次数为1,在该步骤4输出计算机内存无误作为检测结果前判断当前循环次数是否小于该循环总数,若是,则再次执行该步骤3同时循环次数加1。
所述的独立于操作系统的计算机系统内存检测方法,其中还包括步骤5,当检测结果为内存错误时,根据地址连续同一位出现回读数值不一致的特征,确定内存中连接出错的地址线。
所述的独立于操作系统的计算机系统内存检测方法,其中该步骤1包括:通过JTAG设备将内存检测程序写入计算机内存。
所述的独立于操作系统的计算机系统内存检测方法,其中循环多次执行步骤1至步骤4,以确保检测结果的准确性。
本发明还提出了一种独立于操作系统的计算机系统内存检测系统,其中包括:
模块1,用于在计算机系统启动初期,对计算机内存中预设地址范围内所有地址的所有数据位写0,对写过0的地址进行逐个回读,判断回读的数值与0是否一致,若是,则执行模块2,否则输出内存错误作为检测结果;
模块2,用于对计算机内存中预设地址范围所有地址的所有数据位写1,对写过1的地址进行逐个回读,判断回读的数值与1是否一致,若是,则执行模块3,否则输出内存错误作为检测结果;
模块3,用于对计算机内存中预设地址范围所有地址的所有数据位写当前地址原值,对写过地址原值的地址进行逐个回读,判断回读的数值与其对应的地址值是否一致,若是,则执行模块4,否则输出内存错误作为检测结果;
模块4,用于对计算机内存中预设地址范围所有地址的所有数据位写当前地址按位取反后的数值,对写过取反数值的地址进行逐个回读,判断回读的数值与其对应的地址取反值是否一致,若是,则输出计算机内存无误作为检测结果,否则输出内存错误作为检测结果。
所述的独立于操作系统的计算机系统内存检测系统,其中还包括获取预设的循环总数,且该循环总数为偶数,在该模块3开始前初始循环次数为1,在该模块4输出计算机内存无误作为检测结果前判断当前循环次数是否小于该循环总数,若是,则再次执行该模块3同时循环次数加1。
所述的独立于操作系统的计算机系统内存检测系统,其中还包括模块5,当检测结果为内存错误时,根据地址连续同一位出现回读数值不一致的特征,确定内存中连接出错的地址线。
所述的独立于操作系统的计算机系统内存检测系统,其中该模块1包括:通过JTAG设备将内存检测程序写入计算机内存。
所述的独立于操作系统的计算机系统内存检测系统,其中循环多次执行模块1至模块4,以确保检测结果的准确性。
由以上方案可知,本发明的优点在于:
本发明提供的内存检测方法可以应用于计算机操作系统无法工作或无操作系统的场景,并且能够快速准确的检测出内存设备本身是否存在地址线和数据线连接问题,以及可以检测出内存设备的地址线和数据线恒0、恒1以及短路的问题。
附图说明
图1为本发明总流程图;
图2为本发明对内存写0的检测方法流程图;
图3为本发明对内存写1的检测方法流程图;
图4为本发明对内存写地址值的检测方法流程图。
具体实施方式
本发明上述技术问题这样解决,实现一种独立于操作系统的内存检测方法,通过JTAG(Joint Test Action Group)设备将本发明的内存检测程序写入到计算机系统内存,即可使其运行在计算机系统启动初期,即在计算机系统固化代码段执行结束,初始化基本硬件后在bootloader运行之前;通过对内存的写0、写1以及写入经过处理的地址值并进行回读的三种方式对内存进行循环多次检测。
其中,对内存的写0检测包括以下步骤:
(1)给指定地址范围内,逐个向所有地址的所有数据位写0;
(2)在指定范围的所有地址写完后,对写过的地址进行逐个回读;
(3)通过将回读的数值与0比较,若与0不一致,则表示数据线存在连接错误,若多个地址连续同一位出现相同回读数值不一致问题,则可以确定连接出错的地址线。
其中,对内存的写1检测包括以下步骤:
(1)给指定地址范围内,逐个向所有地址的所有数据位写1(即64位系统写0xffff_ffff_ffff_ffff,32位系统则写0xffff_ffff);
(2)在指定范围的所有地址写完后,对写过的地址进行逐个回读;
(3)通过将回读的数值与1比较,若与1不一致,则表示数据线存在连接错误,若多个地址连续同一位出现相同回读数值不一致问题,则可以确定连接出错的地址线。
其中,对内存的写地址值检测包括以下步骤:
(1)给指定地址范围内,以当前地址原值、当前地址按位取反后的数值、当前地址原值这样的循环顺序对所有地址逐一写操作;
(2)在指定范围的所有地址写完后,对写过的地址进行逐个回读;
(3)通过按照以上顺序写入的数值与回读后的数值进行对比,若出现不一致则表示地址线存在连接错误;
(4)将写地址值检测方法单独循环测试16次,确保检测的准确性。
其中的多次循环检测为将上述3种检测步骤进行轮询式执行,次数超过2次为了更加保证检测结果的准确性和严谨性。
为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。
如图1所示,本发明提出的内存检测方法包括三个步骤,分别如下:
(一)内存写0检测:
如图2所示,在给定地址范围内,对所有地址逐一进行写0操作。当全部地址写完后,再从起始地址开始逐一回读,将回读值与数值0比较,若比较结果不一致,则表示存在数据线连接错误;若结果一致,则进入下一项检测。
(二)内存写1检测:
如图3所示,在给定地址范围内,对所有地址逐一进行写1操作。当全部地址写完后,再从起始地址开始逐一回读,将回读值与数值1比较,若比较结果不一致,则表示存在数据线连接错误;若结果一致,则表示数据线无连接问题。
(三)内存写地址值检测:
如图4所示,在给定地址范围内,对所有地址按照当前地址值、当前地址值按位取反、当前地址值的顺序进行写操作。当全部地址写完后,再从起始地址开始逐一回读,将回读的数值与写入数值进行对比,若结果不一致,则表示存在地址线连接错误;若结果无误则循环写地址值检测,次数大于16次则结束,表示地址线无连接问题。
首先写地址值检测需要偶数次检测次数(奇数次写顺序:原地址值、原地址值取反、原地址值,偶数次写顺序:原地址值取反、原地址值、原地址值取反),为了充分验证内存设备地址线的正确性,需进行多次验证,这里规定共16次检测,在16次检测后均正确,可以认为地址线无任何连接错误。
下面详细说明本发明的内存检测方法式如何检测出数据线和地址线连接的问题。用一个在计算机系统环境中的SDRAM例子来说明,其拥有地址线、数据线以及有计算机系统统一编址的内存地址范围。利用本发明的内存检测开始时首先进行写0测试,即从SDRAM起始地址开始到SDRAM结束地址逐一写0,写完后再从SDRAM起始地址到SDRAM结束地址逐一回读并与0进行比较,这里假设某一根数据线存在恒1情况,则回读后的数值将可能会出现0x1000100010001000或其它位恒1,其回读结果与0并不一致,则说明存在数据线存在连接错误,通过分析回读的数值即可知道具体出问题的数据线;若回读的数值与0一致,则进行下一项写1检测,同样从SDRAM起始地址到SDRAM结束地址逐一写1(此处的1代表数据线全写1,即64位系统写0xffff_ffff_ffff_ffff,32位系统则写0xffff_ffff),所有地址写完后再从SDRAM起始地址到SDRAM结束地址逐一回读与写入值进行比较,这里假设在64位系统中SDRAM某一根数据线存在恒0情况,则回读后的数值将会出现0xefff_efff_efff_efff或其它位存在恒0,与写入值不一致,则说明数据线存在连接问题,通过分析回读数值则可以知道具体出问题的数据线;若与写入数值一致,通过以上两个检测步骤则可以判断出数据线有无连接问题。进入下一项的写地址值测试,从SDRAM起始地址到SDRAM结束地址按照地址原值、地址值按位取反、地址原值的顺序逐一进行写入操作,所有地址写完后,从起始地址开始回读并且与写入的数值进行对比,若出现不一致则说明地址线连接存在问题,下面举例说明,如读地址0x80008000的值时,发现回读数值为0x8000f000与写入数值不同,读地址0x8000a000的值时,发现回读数值为0x7fff0fff与写入数值不同,同时读地址0x8000f000的值时,发现回读数值为0x8000f000,则说明地址线连接错误,通过分析结果可以地址线出现恒0问题;若所有地址的回读值与写入值一致,则再次循环测试,超过16次后退出循环,若仍无问题,则表示地址线无连接问题。由此可见,本发明的内存检测方法对于内存设备的数据线和地址线存在恒0、恒1以及连接问题的检测和排除故障有很大帮助。
以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。
本发明还提出了一种独立于操作系统的计算机系统内存检测系统,其中包括:
模块1,用于在计算机系统启动初期,对计算机内存中预设地址范围内所有地址的所有数据位写0,对写过0的地址进行逐个回读,判断回读的数值与0是否一致,若是,则执行模块2,否则输出内存错误作为检测结果;
模块2,用于对计算机内存中预设地址范围所有地址的所有数据位写1,对写过1的地址进行逐个回读,判断回读的数值与1是否一致,若是,则执行模块3,否则输出内存错误作为检测结果;
模块3,用于对计算机内存中预设地址范围所有地址的所有数据位写当前地址原值,对写过地址原值的地址进行逐个回读,判断回读的数值与其对应的地址值是否一致,若是,则执行模块4,否则输出内存错误作为检测结果;
模块4,用于对计算机内存中预设地址范围所有地址的所有数据位写当前地址按位取反后的数值,对写过取反数值的地址进行逐个回读,判断回读的数值与其对应的地址取反值是否一致,若是,则输出计算机内存无误作为检测结果,否则输出内存错误作为检测结果。
所述的独立于操作系统的计算机系统内存检测系统,其中还包括获取预设的循环总数,且该循环总数为偶数,在该模块3开始前初始循环次数为1,在该模块4输出计算机内存无误作为检测结果前判断当前循环次数是否小于该循环总数,若是,则再次执行该模块3同时循环次数加1。
所述的独立于操作系统的计算机系统内存检测系统,其中还包括模块5,当检测结果为内存错误时,根据地址连续同一位出现回读数值不一致的特征,确定内存中连接出错的地址线。
所述的独立于操作系统的计算机系统内存检测系统,其中该模块1包括:通过JTAG设备将内存检测程序写入计算机内存。
所述的独立于操作系统的计算机系统内存检测系统,其中循环多次执行模块1至模块4,以确保检测结果的准确性。