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/
的高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/
物理地址,具体的转换:首先取出虚拟地址的高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,判断成功与否;直到最终到达文件末尾,退出刷新,提示成功为止。
实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,
在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同
的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
版权声明:本文标题:一种linux系统应用层刷新BIOS的方法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1735115482a1636673.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论