本发明涉及一种基于risc处理器的firmware替换方法,属于功能部署技术领域。
背景技术:
firmware只能在risc处理器的最高权限模式下运行。在risc处理器架构中,firmware非常重要,它负责对中断、异常和系统调用指令的响应与处理,只有在firmware中才可以使用特权指令读写core的状态寄存器。
目前risc处理器平台(桌面机、服务器等)中的firmware被保存在主板上的flash中;若想要替换新的firmware,需要在维护环境中通过维护接口将新的firmware烧写到flash中,然后重启平台。虽然可以在平台不关机的状态下烧写flash,但只有在重启平台后重新烧写的firmware才会被执行。
根据目前risc处理器平台替换firmware的流程,在升级、调试firmware时都会不可避免地擦写主板上的flash,特别是在调试firmware时通常会频繁地擦写flash,但由于flash的擦写次数是有限的,所以频繁地升级或调试firmware会加快缩短flash的使用寿命。若flash出现故障,则需要专业的技术人员更换主板上的flash部件,费时费力。
技术实现要素:
本发明的目的是提供一种基于risc处理器的firmware替换方法,其可以在不重新烧写flash、不关机的情况下替换firmware,还避免了现有替换方法中需要再次烧写替换成原来的firmware的情况。
为达到上述目的,本发明采用的技术方案是:提供一种基于risc处理器的firmware替换方法,基于以下模块:
hotswap_mod.c内核模块:用于将用户空间的内存区域中的数据复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
hotswap_user_top.c模块:用于将待替换的firmware从磁盘加载到用户空间的内存区域中,还用于通过调用hotswap_mod.c模块将存储在用户空间的内存区域中的所述待替换的firmware复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
syscall_swpfirmware_base.s模块:用于将执行该模块代码的core的firmware_base寄存器中的值修改为待替换的firmware的基地址;
hotswap_user_bottom.c模块:用于通过绑定core的方式在用户空间调用syscall_swpfirmware_base.s模块,将当前core的firmware_base寄存器中的值修改为待替换的firmware的基地址;
所述替换方法包括以下步骤:
s1、使用烧写flash的方式将原来的firmware替换为包含有syscall_swpfirmware_base.s模块的firmware;
s2、重启装有risc处理器的平台;
s3、加载hotswap_mod.c内核模块;
s4、执行hotswap_user_top.c模块代码,将待替换的firmware从磁盘加载到用户空间的内存区域中;
s5、调用hotswap_mod.c内核模块,将已加载至用户空间的内存区域中的待替换的firmware复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
s6、执行hotswap_user_bottom.c模块代码,通过绑定core的方式在用户空间调用syscall_swpfirmware_base.s模块,将当前core的firmware_base寄存器中的值修改为待替换的firmware的基地址。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
本发明一种基于risc处理器的firmware替换方法,可以在不重新烧写flash、不关机的情况下替换firmware,并让替换后的firmware立即生效,且即使替换后的firmware有问题导致了宕机,只需重启平台即可恢复到替换前的状态,避免了现有替换方法中需要再次烧写替换成原来的firmware的情况,也不需要维护环境,延长flash的使用寿命。
附图说明
附图1为本发明一种基于risc处理器的firmware替换方法的示意图。
具体实施方式
实施例:本发明提供一种基于risc处理器的firmware替换方法,基于以下模块:
hotswap_mod.c内核模块:用于将用户空间的内存区域中的数据复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
hotswap_user_top.c模块:用于将待替换的firmware从磁盘加载到用户空间的内存区域中,还用于通过调用hotswap_mod.c模块将存储在用户空间的内存区域中的所述待替换的firmware复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
syscall_swpfirmware_base.s模块:用于将执行该模块代码的core的firmware_base寄存器中的值修改为待替换的firmware的基地址;
hotswap_user_bottom.c模块:用于通过绑定core的方式在用户空间调用syscall_swpfirmware_base.s模块,将当前core的firmware_base寄存器中的值修改为待替换的firmware的基地址;
所述替换方法包括以下步骤:
s1、使用烧写flash的方式将原来的firmware替换为包含有syscall_swpfirmware_base.s模块的firmware,使平台具备热替换firmware的底层支持;
s2、重启装有risc处理器的平台;
s3、加载hotswap_mod.c内核模块,使平台具备热替换firmware的内核支持;
s4、执行hotswap_user_top.c模块代码,将待替换的firmware从磁盘加载到用户空间的内存区域中;
s5、调用hotswap_mod.c内核模块,将已加载至用户空间的内存区域中的待替换的firmware复制到物理地址连续的内存区域中,并将该段物理地址连续的内存区域的基址保存到一个预先规划好的内存中;
s6、执行hotswap_user_bottom.c模块代码,通过绑定core的方式在用户空间调用syscall_swpfirmware_base.s模块,将当前core的firmware_base寄存器中的值修改为待替换的firmware的基地址,至此之后,新的firmware立即生效。
对上述实施例的进一步解释如下:
为了提高灵活性,本方法共有4个源码文件:hotswap_user_top.c(用户态程序)、hotswap_user_bottom.c(用户态程序)、hotswap_mod.c(内核模块)、syscall_swpfirmware_base.s(risc处理器最高权限下的程序);
本方法的基本原理为:
1.每个core可以有自己的firmware,它们各自firmware的基址保存在firmware_base寄存器中;平台在上电启动阶段会将所有core的firmware_base寄存器设置为同一个固定基址,通过修改core的firmware_base寄存器可以实现替换firmware;
本方法通过syscall_swpfirmware_base.s中实现了修改firmware_base的代码;syscall_swpfirmware_base.s是为该方法新增的代码,如果需要使用该方法进行替换firmware的操作,则必须保证替换前使用的firmware含有syscall_swpfirmware_base.s。
2.通过hotswap_user_top,首先将新的firmware从磁盘加载到用户空间的内存区域中,然后在hotswap_user_top中通过系统调用接口,由内核模块hotswap_mod将存储在用户空间的内存区域中的firmware复制到物理地址连续的内存区域中;由于该内存区域是动态申请的,所以每次申请得到的内存区域可能不同;为了后续能找到该内存区域,将该内存区域的基址addr保存到一块预先规划好的内存中。
3.在hotswap_user_bottom中通过绑定core的方式将指定core的firmware_base的值修改为addr;至此之后,这些指定的core就会执行新的firmware直到再次替换firmware。
4.替换前后两版firmware中指令的物理地址虽然是不同的,但因为对于firmware的指令流访问是通过物理地址访问的,不进行虚实地址转换,所以不需要刷新itb或icache的操作。
5.由于firmware是在risc处理器最高权限下运行的程序,而在risc处理器最高权限下会屏蔽所有中断,不响应任何中断请求,所以对于新、老版本firmware中同名的程序,不会出现替换前执行的是老版本,替换后又执行的是新版。
几种典型的使用场景:
一、用于调试firmware中的某个模块
1.保持新版firmware中除要调试模块的相关代码之外的其他代码不变;
2.在所有的物理core上进行firmware热替换,至此之后,即可进行该模块的调试。
二、在不重新烧写flash、不关机的情况下使原来不支持虚拟化的risc处理器平台支持虚拟化
1.保持新版的firmware中非虚拟化相关的代码不变,仅增加虚拟化相关的代码;
2.在指定的物理core上进行firmware热替换,至此之后,这些指定的物理core上就有了对虚拟化的支持。
三、用于调试firmware中guest相关的代码
1.保持新版的firmware中host部分的代码不变,仅修改guest部分的代码;
2.在hypervisor创建或运行vcpu之前,把vcpu绑定在若干个物理core上,并在这些物理core上进行firmware热替换,至此之后,就可以调试firmware中guest相关的代码了;
由于firmware中host部分的代码在此使用场景中是保持不变的,所以替换前后对于host来说,处理逻辑是保持不变的;只是在替换后,当vcpu被调度到这些物理core上运行时,执行的firmware是新版的firmware;
3.即使firmware中guest相关的代码写的有问题导致了平台宕机,只需重启平台即可;
重启后平台的状态和替换前完全一致,不会有任何替换导致的副作用,重复之前的操作就可以继续进行firmware中guest相关代码的调试。
采用上述一种基于risc处理器的firmware替换方法时,其可以在不重新烧写flash、不关机的情况下替换firmware,并让替换后的firmware立即生效,且即使替换后的firmware有问题导致了宕机,只需重启平台即可恢复到替换前的状态,避免了现有替换方法中需要再次烧写替换成原来的firmware的情况,也不需要维护环境,延长flash的使用寿命。
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:
risc处理器:采用精简指令集的处理器。
core:处理器中的处理核心
firmware:固件,写入eprom(可擦写可编程只读存储器)或eeprom(电可擦可编程只读存储器)中的程序。
firmware_base:core(处理器核心)中用来保存该core所使用的firmware的基地址的寄存器。
flash:闪存。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。