admin 管理员组

文章数量: 1086019


2024年12月24日发(作者:哪个数据分析培训好)

(19)中华人民共和国国家知识产权局

(12)发明专利说明书

(21)申请号 CN2.6

(22)申请日 2017.08.18

(71)申请人 郑州云海信息技术有限公司

地址 450000 河南省郑州市郑东新区心怡路278号16层1601室

(72)发明人 李小春

(74)专利代理机构 济南信达专利事务所有限公司

代理人 张靖

(51)

(10)申请公布号 CN 107479931 A

(43)申请公布日 2017.12.15

权利要求说明书 说明书 幅图

(54)发明名称

方法

(57)摘要

本发明公开了一种linux系统应用

一种linux系统应用层刷新BIOS的

层刷新BIOS的方法,所述方法通过处理

器的out指令发送SMI中断指令,使CPU

进入SMM模式,在SMM模式下,BIOS

获取控制权,进行自身区域的更新,刷新

BIOS。本发明方法相对DOS启动U盘来

刷新BIOS的方法,通过使用linux应用层

刷新BIOS,不需要制作启动U盘,也不需

要多次重启系统,可以直接运行在宿主的

linux操作系统之上,向CPU发出最高优先

级的请求,并通过BIOS预先设置好的处

理程序来更新自己的数据。

法律状态

法律状态公告日

法律状态信息

法律状态

权 利 要 求 说 明 书

1.一种linux系统应用层刷新BIOS的方法,其特征在于,所述方法通过处理器的out

指令发送SMI中断指令,使CPU进入SMM模式,在SMM模式下,BIOS获取控制权,

进行自身区域的更新,刷新BIOS。

2.根据权利要求1所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法通过读取刷新中每个进程的pagemap文件,并根据规则来分析此文件,在linux

操作系统应用层获取到一个虚拟地址对应的物理地址。

3.根据权利要求1或2所述的一种linux系统应用层刷新BIOS的方法,其特征在于,

所述方法在系统启动阶段,BIOS分配内存布局时候,在内存地址空间中保留部分区域

作为BIOS的ROM的地址空间,操作系统起来之后,无法操作这部分区域的内存。

4.根据权利要求3所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法还包括内容如下:

Linux操作系统以页为单元来管理物理内存;

MMU通过页来管理系统中的页表;

通过在应用层用memalign来强制指定二者对齐分配,分配连续的一页大小的空间,并

保证此空间中物理地址连续。

5.根据权利要求4所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法验证BIOS文件的完整性的过程包括:通过从BIOS文件中提取签名和公钥,用公

钥解密提取签名,得到对BIOS数据加密前的一个hash值;用同样的hash算法对选择

的文件中的BIOS的数据计算一个hash值;对比两个hash值,如果相同即数据验证通

过。

6.根据权利要求5所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法在x86架构的linux操作系统上,在root用户下面调用ioperm或iopl系统获取

对0x82f端口的访问权限,实现在用户空间访问IO端口。

7.根据权利要求6所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法通过在linux系统的上层软件中分配4KB的buffer,把BIOS文件数据分成4KB

大小单元,然后每次的请求处理数据大小都以4KB为准,把虚拟地址转换成物理地址。

8.根据权利要求7所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

虚拟地址转换成物理地址包括过程如下:

在linux系统下查找一个进程中虚拟地址和物理地址映射关系的时候,通过

/proc/<pid>/pagemap这个文件来获取虚拟地址对应的物理地址:首先取出虚拟

地址的高20位作为虚拟页索引,然后乘以每个索引的大小得到物理页框的条目在

pagemap文件中的偏移;读出偏移处的8字节的数值和FPN_MASK相与就得到了物

理页框的地址,最后用物理页框左移12位或上虚拟地址的后12位即可得到虚拟地

址对应的物理地址了。

9.根据权利要求8所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

BIOS的刷新过程包括:

定位BIOS文件中属于BIOS数据的最开始部分,并把开始的4KB数据载入到分配

好的buffer中,以后每次获取数据都从上一次位置下移4KB取数据到buffer中;

发送SMI中断请求,在Linux系统上通过out指令向端口0x82F发送一个EF的命令

码,并通过通用寄存器EAX的高位指明相应的SMI处理请求为刷写BIOS;并把写入

数据buffer的物理地址,buffer大小,需写入BIOS的位置分别通过通用寄存器

ESI,ECX, EDI传入给SMI处理程序;

接收SMI中断请求后,CPU进入到SMM模式,将当前的全部寄存器以及其他的任何

需要保存的信息,保存在SMRAM的中,并接收新传入的寄存器值;然后直接跳转到

SMRAM内的入口地址开始执行;入口处的程序会解析传入的各个寄存器的值,根据

AH寄存器的值找到对应的SMI中断处理程序;

中断处理程序根据各个寄存器的值来进行操作,首先从ESI指定的物理内存地址处

取出数据,数据长度为EDX中指定的长度,然后把取出的数据写入到EDI寄存器指

定的地址处,最后把此次刷写的结果保存在AL寄存器中,并执行RSM指令,CPU退

出SMM模式,恢复到之前的保护模式中。

10.根据权利要求9所述的一种linux系统应用层刷新BIOS的方法,其特征在于,所述

方法包括内容:用mlock函数来锁住内存数据,不让其交换到SWAP中。

说 明 书

技术领域

本发明涉及固件BIOS技术领域,具体涉及一种linux系统应用层刷新BIOS的方法。

背景技术

BIOS是烧写在板卡一颗芯片上的一个系统,负责管理板卡上各芯片的参数设定,为电

脑提供最底层、最直接的硬件控制。现在BIOS多采用EEPROM,可以对EEPROM

进行重写,方便地实现BIOS升级。常见的BIOS芯片有Award、AMI、Phoenix、

MR等,在芯片上都能见到厂商的标记。

刷新BIOS是一种常见的操作,板卡上的BIOS刷新同样是用程序改写BIOS芯片里

的程序。刷新BIOS的目的主要有两个,一个是修复存在的BUG/故障,另外一个则是

增加新的功能。现有的刷新BIOS的方法很多,诸如,通过刷写芯片的刷写器刷新;通

过BIOS自带的刷新工具刷新;服务器还可以通过BMC刷新;除此以外,最常用的是

通过BIOS厂商提供的windows或者DOS工具刷新BIOS。而以上所涉及的刷新方

法,并没有在Linux系统上实现。

现有主流在线刷写BIOS方式,有通过厂商提供的Windows工具刷新,如AMI的

AFUWIN工具,Award的Awdflash工具等等,用工具定位到BIOS文件,然后点击确认,

主板BIOS就能获得更新,但是需要附加相应的windows驱动。但是好多厂商并没

有提供工具,所以大部分的方法是通过DOS工具来刷新BIOS,进入纯DOS模式后,

在命令行中输入刷新命令。

目前主流的linux系统中刷写BIOS方法为切到DOS系统中来刷新BIOS。具体步

骤如下:

1、找一台安装有windows的操作系统,在此系统中使用DOS制作工具制作一个

DOS系统的启动U盘。

2、把刷新程序和BIOS文件拷贝到制作好的U盘根目录。

3、插入制作好的U盘,重新启动系统,修改BIOS启动方式为U盘启动。

4、进入DOS系统,用dir命令查看U盘根目录中的文件,确认刷新程序和BIOS文件

都在其中。如果工具名和BIOS文件名字超过了8个字符,DOS会用“~”代替工具的

某些字符。

5、刷新BIOS,输入刷新工具的名字+空格+BIOS文件名称,并敲回车键。

6、观察终端上的刷新进度,等刷新完成后拔出U盘。

7、重新启动系统,即可用新刷的BIOS引导系统,并进入Linux操作系统。

现有技术中存在的问题:

通过DOS刷写BIOS虽然可行,但是操作过程复杂,不仅需要制作DOS启动盘,并且

还需要重新启动进入DOS系统,然后才能运行DOS刷写工具,刷新成本较高,另外还

得学习如何制作启动U盘等,复杂度也很高。

发明内容

本发明要解决的技术问题是:随着国家对自主可控的不断重视,更多的国产操作系统

进入了市场,而这些国产操作系统大多都是基于Linux操作系统而实现的,所以发明

一款Linux下刷新BIOS的工具是迫在眉睫,能在Linux操作系统上方便地刷新

BIOS。

目前大的BIOS厂商虽然提供了Windows的刷写BIOS工具,但是并没有提供Linux

下的刷写BIOS的工具,因此在Linux系统上,目前还无法刷新BIOS。

本发明针对以上问题,提供一种linux系统应用层刷新BIOS的方法。

在linux操作系统下,要用制作的DOSU盘来刷新BIOS,并重启机器,效率低,调试慢。

为了解决DOSU盘刷新BIOS带来的不便,因此在linux操作系统下发明了刷新

BIOS的工具,利用此刷新BIOS工具,无需制作启动U盘,无需切换操作系统,可以在

linux操作系统上直接运行刷新BIOS的工具,就可以实现对BIOS各个区域的刷新操

作。

本发明所采用的技术方案为:

一种linux系统应用层刷新BIOS的方法,所述方法通过处理器的out指令发送SMI

中断指令,使CPU进入SMM模式,在SMM模式下,BIOS获取控制权,进行自身区域

的更新,刷新BIOS。

所述方法通过读取刷新中每个进程的pagemap文件,并根据规则来分析此文件,在

linux操作系统应用层获取到一个虚拟地址对应的物理地址。

所述方法在系统启动阶段,BIOS分配内存布局时候,在内存地址空间中保留部分区域

作为BIOS的ROM的地址空间,操作系统起来之后,无法操作这部分区域的内存。该

技术方案可以用在现在的可信计算体系中,通过此技术方案,可以在linux操作系统

之上用此方法,向BIOS中写入操作系统的关键文件的预期值,当计算机在启动的时

候可以读取磁盘上操作系统的关键文件,并计算预期值,如果相同则检查通过,如果预

期值不同则不允许启动计算机,只需在BIOS中留出部分区来存储预期值并增加计算

和检测预期值模块。

所述方法还包括内容如下:

Linux操作系统以页为单元来管理物理内存;

MMU通过页来管理系统中的页表;

通过在应用层用memalign来强制指定二者对齐分配,分配连续的一页大小的空间,并

保证此空间中物理地址连续。

所述方法验证BIOS文件的完整性的过程包括:通过从BIOS文件中提取签名和公钥,

用公钥解密提取签名,得到对BIOS数据加密前的一个hash值;用同样的hash算法对

选择的文件中的BIOS的数据计算一个hash值;对比两个hash值,如果相同即数据验

证通过,继续下一流程。

在x86架构的linux操作系统上,在root用户下面调用ioperm或iopl系统获取对

0x82f端口的访问权限,此端口是在ACPI中定义的SMI的命令端口,实现在用户空间

访问IO端口。

所述方法通过在linux系统的上层软件中分配4KB的buffer,把BIOS文件数据分成

4KB大小单元,然后每次的请求处理数据大小都以4KB为准,把虚拟地址转换成物理

地址。

所述虚拟地址转换成物理地址包括过程如下:

在linux系统下查找一个进程中虚拟地址和物理地址映射关系的时候,通过

/proc//pagemap这个文件来获取虚拟地址对应的物理地址:首先取出虚拟地址

的高20位作为虚拟页索引(vir_page_idx=vir/page_size),然后乘以每个索引的大小得

到物理页框的条目在pagemap文件中的偏移

(pfn_item_offset=vir_page_idx*sizeof(uint64_t));读出偏移处的8字节的数值和

FPN_MASK相与就得到了物理页框的地址,此处FPN_MASK等于

(((uint64_t)1)<<55)-1;最后用物理页框左移12位或上虚拟地址的后12位即可得到虚

拟地址对应的物理地址了。

所述BIOS的刷新过程包括:

定位BIOS文件中属于BIOS数据的最开始部分,并把开始的4KB数据载入到分配

好的buffer中,以后每次获取数据都从上一次位置下移4KB取数据到buffer中;

发送SMI中断请求,在Linux系统上通过out指令向端口0x82F发送一个EF的命令

码,并通过通用寄存器EAX的高位指明相应的SMI处理请求为刷写BIOS;并把写入

数据buffer的物理地址,buffer大小,需写入BIOS的位置分别通过通用寄存器

ESI,ECX,EDI传入给SMI处理程序;

接收SMI中断请求后,CPU进入到SMM模式,将当前的全部寄存器以及其他的任何

需要保存的信息,保存在SMRAM的中,并接收新传入的寄存器值;然后直接跳转到

SMRAM内的入口地址开始执行;入口处的程序会解析传入的各个寄存器的值,根据

AH寄存器的值找到对应的SMI中断处理程序;

中断处理程序根据各个寄存器的值来进行操作,首先从ESI指定的物理内存地址处

取出数据,数据长度为EDX中指定的长度(4KB),然后把取出的数据写入到EDI寄存

器指定的地址处,最后把此次刷写的结果保存在AL寄存器中,并执行RSM指

令,CPU退出SMM模式,恢复到之前的保护模式中。

所述方法包括内容如下:当内存紧缺时,为了保证物理内存页面数据不被交换出去,用

mlock函数来锁住内存数据,不让其交换到SWAP中。

linux的虚拟地址和物理地址映射关系的解除,除了进程结束,资源回收外,在资源紧

缺情况下也会把这个映射解除,交换出物理页面,当应用程序知道自己进程中的某一

个虚拟地址和物理地址的对应关系,然后下层(BIOS层)会把相关的信息通过写入物

理地址传到应用层,于是应用层可以通过虚拟地址获得bios写入的物理地址数据。

但是当系统内存资源紧张的情况下,应用层获取的数据是不正确的,而BIOS已经把

相关的数据写入到了相应的物理地址,只是应用程序通过该虚拟地址访问的数据不

正确。原因是当内存紧缺时,虚拟地址和物理地址的映射关系已经解除,把内存数据

交换到了SWAP分区中了,为了保证物理内存页面数据不被交换出去,可以用mlock

函数来锁住内存数据,不让其交换到SWAP中。

本发明涉及英文缩写如下:

BIOSBaseInput/OutputSystem基本输入输出系统;

SMISystemManagementInterrupt系统管理中断;

SMMSystemManagementMode系统管理模式;

SMRAMSystemManagementRAM系统管理内存;

MMUMemoryManagementUnit内存管理单元;

APCIAdvancedConfigurationandPowerManagementInterface高级配置和电源管理接口;

EEPROMElectricallyErasableProgrammableRead-OnlyMemory电可擦可编程只读存

储器。

本发明的有益效果为:

本发明方法相对DOS启动U盘来刷新BIOS的方法,通过使用Linux应用层刷新

BIOS,不需要制作启动U盘,也不需要多次重启系统,可以直接运行在宿主的linux操

作系统之上,向CPU发出最高优先级的请求,并通过BIOS预先设置好的处理程序来

更新自己的数据。

附图说明

图1为本发明方法实现流程图。

具体实施方式

根据说明书附图,结合具体实施方式对本发明进一步说明:

如图1所示,一种linux系统应用层刷新BIOS的方法,所述方法实现流程如下:

1、在linux系统上运行刷新BIOS工具,工具启动;

2、点击选择需要刷新的BIOS文件;

3、验证BIOS文件的完整性:通过从BIOS文件中的提取签名和公钥,用公钥解密提

取的签名,得到对BIOS数据加密前的一个hash值。用同样的hash算法对选择的文

件中的BIOS的数据计算一个hash值。对比两个hash值,如果相同即数据验证通过,

继续下一流程;

4、在x86架构的linux操作系统上,如果想在用户空间访问IO端口,可以在root用

户下面,用ioperm或iopl系统调用来获取对端口进行IO操作的权限,获取对0x82f

端口的访问权限,此端口是在ACPI中定义的SMI的命令端口;

在引用层要操作IO端口,通过root用户调用ioperm或iopl系统调用来获取操作某

IO端口的权限;获取IO权限后,通过在应用程序中嵌入汇编语言,并在汇编中用out

指令向SMI的命令端口0X82F发出中断请求,使CPU进入SMM模式;

5、linux系统上层软件中分配的4KB大小的buffer,用于把BIOS文件数据分成4KB

大小单元,然后每次的请求处理数据大小都以4KB为准,这4KB大小的分配策略要

保证其物理内存地址是连续的,由于内核是把物理页作为内存管理的基本单

位,MMU是以页为单位来管理系统中的页表,所以MMU在把虚拟地址转换成物理

地址的时候只要虚拟地址是按照页对齐分配的,那么其对应的物理地址自然也就连

续了;通过用memalign系统调用来分配与系统页大小相同(4KB)的buffer空间,从而

保证了其物理地址是连续的;

6、把虚拟地址转换成物理地址:在linux系统下查找一个进程中虚拟地址和物理地

址映射关系的时候,可以通过/proc//pagemap这个文件来获取虚拟地址对应的

物理地址,具体的转换:首先取出虚拟地址的高20位作为虚拟页索引

(vir_page_idx=vir/page_size),然后乘以每个索引的大小得到物理页框的条目在

pagemap文件中的偏移(pfn_item_offset=vir_page_idx*sizeof(uint64_t));读出偏移处的

8字节的数值和FPN_MASK相与就得到了物理页框的地址,此处FPN_MASK等于

(((uint64_t)1)<<55)-1;最后用物理页框左移12位或上虚拟地址的后12位即可得到虚

拟地址对应的物理地址了;

7、Linux上的刷新BIOS工具,定位到BIOS文件中属于BIOS数据的最开始部分,并

把开始的4KB数据载入到以上分配好的buffer中,以后每次获取数据都从上一次位

置下移4KB取数据到buffer中;

定位BIOS数据是根据读取BIOS文件中的头部信息,分析此信息,可以获取BIOS数

据位于文件中的偏移和大小;

8、发送SMI中断请求,通过刷新BIOS工具,在Linux系统上用out指令向端口

0x82F发送一个EF的命令码,并通过通用寄存器EAX的高位指明相应的SMI处理

请求为刷写BIOS,另外还需要把写入数据buffer的物理地址,buffer大小,需写入

BIOS的位置分别通过通用寄存器ESI,ECX,EDI传入给SMI处理程序;

9、接收SMI中断请求后,CPU进入到SMM模式,将当前的全部寄存器以及其他的

任何需要保存的信息,保存在SMRAM的中,并接收新传入的寄存器值,然后直接跳转

到SMRAM内的入口地址开始执行,入口处的程序会解析步骤8中传入的各个寄存

器的值,根据AH寄存器的值找到对应的SMI中断处理程序;

10、中断处理程序根据步骤8中的各个寄存器的值来进行操作,首先从ESI指定的

物理内存地址处取出数据,数据长度为EDX中指定的长度(4KB),然后把取出的数据

写入到EDI寄存器指定的地址处,最后把此次刷写的结果保存在AL寄存器中,并执

行RSM指令,CPU退出SMM模式,恢复到之前的保护模式中。这样一次刷写就完成

了;

11、从SMM模式退出来之后,BIOS刷新程序会检查AL寄存器的值是否为0,如果

为0代表此次刷写成功,会执行下一步流程,如果不为0,就代表刷写出错,那么就结束

刷新操作,提示错误;

12、如果此次数据正确的刷写进BIOS中,那么BIOS刷写程序会去判断此次取出数

据后是否到达文件末端,如果到达文件尾部,说明这是最后一次刷新操作,故结束刷新

操作,提示刷新成功;如果没有到底文件末尾,说明还有数据需要刷写,所以控制流程

会回到步骤7开始,循环执行步骤7-12,再次取数据,发SMI请求,解析处理,写入

BIOS,判断成功与否;直到最终到达文件末尾,退出刷新,提示成功为止。

实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,

在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同

的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。


本文标签: 刷新 数据 系统