本发明涉及服务器技术领域,具体地说是一种内存SPD数据加密装置及方法。
背景技术:
服务器主板上的内存有内存条和表贴内存颗粒两种形式。对于加固型服务器,内存往往采用表贴内存颗粒的方式,以提高稳定性和可靠性。由于表贴内存颗粒不同于内存条厂商生产的标准化的内存条,需要根据内存参数配置规范和主板的PCB特性设计专用的SPD(Serial Presence Detect)配置参数,否则可能由于内存参数设置不合理导致主板无法启动。因此内存SPD配置数据对加固服务器厂商很重要。
表贴内存颗粒的SPD配置数据可以存放在板载的EEPROM中,也可以内置于BIOS(Basic Input/Output System)固件中,出于节约成本、SPD保护和减少生产环节的考虑,加固型服务器多采用BIOS内置SPD的方式。但是,在这种方式中由于内存SPD数据以明码的形式存在于BIOS的MRC(Memory Reference Code)的SPD数据表中,根据所用的内存颗粒和DIMM(Dual-in-Line Memory Module)类型会比较容易地在编译生成的BIOS固件中找到SPD所在的明码数据块,其他厂商可以通过借鉴内存SPD配置调试自己的表贴内存。如何简单有效地对内存SPD数据进行保护是一个需要解决的技术问题。
技术实现要素:
本发明的技术任务是针对以上不足之处,提供一种内存SPD数据加密装置及方法。
一种内存SPD数据加密装置,包括:
SPD伪数据变换模块,置于BIOS固件中,用于将512字节的内存SPD数据通过可逆矩阵变换,形成SPD伪数据;
SPD数据获取模块,用于获取SPD伪数据变换模块中的内存SPD伪数据;
SPD数据映射模块,用于将内存SPD伪数据进行逆变换,得到内存SPD真实数据;
SPD数据读模块,用于重复读取得到的内存SPD真实数据,直到完成所需全部内存配置参数的获取。
所述SPD伪数据变换模块形成SPD伪数据时,首先将512字节的内存SPD数据按照一个基本单元两个字节的方式组织成256个基本单元;然后对内存SPD数据的每个基本单元施加可逆矩阵变换,以内存SPD伪数据的形式内置到BIOS固件中。
所述SPD数据获取模块、SPD数据映射模块、SPD数据读模块均存储在BIOS的MRC中。
一种内存SPD数据加密方法,基于上述内存SPD数据加密装置,其实现过程为:
一、首先通过SPD伪数据变换模块将内存SPD数据变换为SPD伪数据,进行数据加密保护;
二、当读取数据时,通过SPD数据获取模块获取SPD伪数据;
三、通过SPD数据映射模块内存SPD伪数据变换为内存SPD真实数据;
四、最后通过SPD数据读模块读取SPD真实数据。
所述步骤一中将内存SPD数据变换为SPD伪数据的具体过程为:
首先通过SPD伪数据变换模块,将512字节的内存SPD数据按照一个基本单元两个字节的方式组织成256个基本单元;
然后对内存SPD数据的每个基本单元施加可逆矩阵变换,以内存SPD伪数据的形式内置到BIOS固件中。
所述步骤二中,SPD数据获取模块获取SPD伪数据过程为:SPD数据获取模块获取内存SPD配置表中指定偏移量位置处的内存SPD伪数据,每次获取一个字节,重复执行直到获取全部512字节的内存SPD数据并存储到全局数组。
所述步骤三中将SPD伪数据变换为内存SPD真实数据的过程为,SPD数据映射模块对内置于BIOS固件中明码表示的内存SPD伪数据进行逆变换以得到用于内存参数配置的内存SPD真实数据,从而对内存SPD数据加以保护。
在步骤三中,SPD数据映射模块对全局数组中的数据以两个字节为基本单元进行逆变换得到两个字节的内存SPD真实数据,然后按照顺序覆盖全局数组原来位置处的两个字节,重复执行直到全部数据处理完毕。
所述可逆矩阵变换采用的是Hadamard矩阵,相对应的,获取SPD伪数据及真实数据的过程为:在步骤一中,对所有内存SPD真实数据以两个字节为基本单元进行矩阵向量乘法运算得到内存SPD伪数据;在步骤三中,对所有内存SPD伪数据进行同样的矩阵向量乘法运算得到内存SPD真实数据。
所述步骤四中,SPD数据读模块通过提供SPD读函数ReadSpd()函数,实现读取SPD真实数据:MRC调用SPD数据读模块提供的ReadSpd()函数,ReadSpd()函数通过读操作获取全局数组中的内存SPD真实数据并返回该内存SPD数据给上层,重复执行直到完成所需全部内存配置参数的获取。
本发明的一种内存SPD数据加密装置及方法和现有技术相比,具有以下有益效果:
本发明的一种内存SPD数据加密装置及方法,通过存储内存SPD伪数据,使得实际使用的是经过映射得到的内存SPD真实数据,只要映射方式不可知,内存SPD数据便不可知,从而仅需对MRC进行改动即可对SPD数据进行保护,简单有效,实用性强,适用范围广泛,具有很好的推广使用价值。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
附图1是本发明内存SPD数据加密装置的实现示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明的方案,下面结合具体实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如附图1所示,一种内存SPD数据加密装置,包括:
SPD伪数据变换模块,置于BIOS固件中,用于将512字节的内存SPD数据通过可逆矩阵变换,形成SPD伪数据;
SPD数据获取模块,用于获取SPD伪数据变换模块中的内存SPD伪数据;
SPD数据映射模块,用于将内存SPD伪数据进行逆变换,得到内存SPD真实数据;
SPD数据读模块,用于重复读取得到的内存SPD真实数据,直到完成所需全部内存配置参数的获取。
所述SPD伪数据变换模块形成SPD伪数据时,首先将512字节的内存SPD数据按照一个基本单元两个字节的方式组织成256个基本单元;然后对内存SPD数据的每个基本单元施加可逆矩阵变换,以内存SPD伪数据的形式内置到BIOS固件中。
所述SPD数据获取模块、SPD数据映射模块、SPD数据读模块均存储在BIOS的MRC中。
一种内存SPD数据加密方法,基于上述内存SPD数据加密装置,在系统上电,BIOS执行到MRC后开始该加密过程,其具体实现步骤为:
一、首先通过SPD伪数据变换模块将内存SPD数据变换为SPD伪数据,进行数据加密保护;
二、当读取数据时,通过SPD数据获取模块获取SPD伪数据;
三、通过SPD数据映射模块内存SPD伪数据变换为内存SPD真实数据;
四、最后通过SPD数据读模块读取SPD真实数据。
所述步骤一中将内存SPD数据变换为SPD伪数据的具体过程为:
首先通过SPD伪数据变换模块,将512字节的内存SPD数据按照一个基本单元两个字节的方式组织成256个基本单元;
然后对内存SPD数据的每个基本单元施加可逆矩阵变换,以内存SPD伪数据的形式内置到BIOS固件中。
所述步骤二中,SPD数据获取模块获取SPD伪数据过程为:SPD数据获取模块获取内存SPD配置表中指定偏移量位置处的内存SPD伪数据(内存SPD伪数据由内存SPD真实数据经过可逆矩阵变换得到),每次获取一个字节,重复执行直到获取全部512字节的内存SPD数据并存储到全局数组(此时内存不可用,不能存储到动态分配的内存缓冲区)。
所述步骤三中将SPD伪数据变换为内存SPD真实数据的过程为,SPD数据映射模块对内置于BIOS固件中明码表示的内存SPD伪数据进行逆变换以得到用于内存参数配置的内存SPD真实数据,从而对内存SPD数据加以保护。
在步骤三中,SPD数据映射模块对全局数组中的数据以两个字节为基本单元进行逆变换得到两个字节的内存SPD真实数据,然后按照顺序覆盖全局数组原来位置处的两个字节,重复执行直到全部数据处理完毕。
所述可逆矩阵变换采用的是Hadamard矩阵,相对应的,获取SPD伪数据及真实数据的过程为:在步骤一中,对所有内存SPD真实数据以两个字节为基本单元进行矩阵向量乘法运算得到内存SPD伪数据;在步骤三中,对所有内存SPD伪数据进行同样的矩阵向量乘法运算得到内存SPD真实数据。
所述步骤四中,SPD数据读模块通过提供SPD读函数ReadSpd()函数,实现读取SPD真实数据:MRC调用SPD数据读模块提供的ReadSpd()函数,ReadSpd()函数通过读操作获取全局数组中的内存SPD真实数据并返回该内存SPD数据给上层,重复执行直到完成所需全部内存配置参数的获取。
下面给出一个实施例:
一个加固型服务器,采用由DDR4组成的UDIMM表贴内存,无存放内存SPD数据的EEPROM,SPD内置于BIOS固件中。
如果不采用本发明所述的内存SPD保护方法,SPD数据以明码方式存在于BIOS固件中,则根据UDIMM的内存模组形式及内存颗粒为DDR4等信息,结合DDR4SPD规范,可以推测DDR4SPD General Configuration Section中的几个比较固定的字段的数据。
例如在本实施例中的SPD前四个字节也就是SPD General Configuration Section前四个字节的数据很可能为“23 11 0C 02”:
“23”表示SPD Bytes Total为512,SPD Bytes Used为384,DDR4内存SPD总字节数一般为512,SPD使用字节数一般为384,此值比较确定;
“11”表示SPD Revision为Revision 1.1,这是常见版本,此值比较确定;
“0C”表示DRAM Device Type为DDR4 SDRAM,这个字节是被系统BIOS用作决定如何翻译SPD EEPROM(这里为BIOS固件中的SPD数据表)中所有其他字节的Key Byte,根据所用内存颗粒可以确定此值;
“02”表示Module Type为UDIMM,这个字节也是Key Byte,根据所用的内存模组形式也可以确定此值。
因此可以在十六进制的BIOS固件中搜索上述四个字节,一般都可以搜索到,如果不能搜索到则可以改变第一个或者第二个字节的内容,或者只搜索第三个和第四个字节的内容,根据上下文便可确定搜索到的数据是否为SPD数据区块的前四个字节或者第三个和第四个字节,进而可以确定整个SPD数据区块。
采用本发明所述的内存SPD数据加密方法,内存SPD真实数据不是以明码的形式直接编译到BIOS固件中,而是将512字节的内存SPD数据按照一个基本单元两个字节的方式组织成256个基本单元,对内存SPD数据的每个基本单元施加可逆矩阵变换后以内存SPD伪数据的形式内置到BIOS固件中,在BIOS的MRC中添加内存SPD数据映射模块,该模块对内置于BIOS固件中明码表示的内存SPD伪数据进行逆变换以得到用于内存参数配置的内存SPD真实数据,从而对内存SPD数据加以保护。
一种可选的可逆矩阵为Hadamard矩阵,对所有内存SPD真实数据以两个字节为基本单元进行矩阵向量乘法运算得到内存SPD伪数据,对所有内存SPD伪数据进行同样的矩阵向量乘法运算得到内存SPD真实数据。一种可选的Hadamard矩阵为:
变换矩阵和逆变换矩阵是同一个矩阵。
例如,内存SPD真实数据的前四个字节为“23 11 0C 02”,以两个字节为基本单元进行运算:
对“23 11”进行变换:
对上述结果进行逆变换:
变换前后结果一致;
对“0C 02”进行变换:
对上述结果进行逆变换:
变换前后结果一致。
为了简化计算,本实施例采用的可逆矩阵是对Hadamard矩阵改动后得到的矩阵:
变换矩阵:
逆变换矩阵:
上述变换过程为:
对“23 11”进行变换:
对上述结果进行逆变换:
变换前后结果一致;
对“0C 02”进行变换:
对上述结果进行逆变换:
变换前后结果一致。
由内存SPD真实数据得到内存SPD伪数据时使用变换矩阵,MRC由内存SPD伪数据得到内存SPD真实数据时使用逆变换矩阵,MRC获取到的是内存SPD真实数据。其他厂商在不掌握可逆矩阵的情况下无法根据硬件组成和SPD规范获取用于搜索的关键字段的数据,也就无法获取整个SPD的数据。
通过上面具体实施方式,所述技术领域的技术人员可容易的实现本发明。但是应当理解,本发明并不限于上述的具体实施方式。在公开的实施方式的基础上,所述技术领域的技术人员可任意组合不同的技术特征,从而实现不同的技术方案。
除说明书所述的技术特征外,均为本专业技术人员的已知技术。