基于openwrt编译环境的initramfs固件编译方法及系统与流程

文档序号:12122776阅读:1895来源:国知局
基于openwrt编译环境的initramfs固件编译方法及系统与流程

本发明涉及initramfs固件编译方法及系统,特别涉及一种基于openwrt编译环境的initramfs固件编译方法及系统。



背景技术:

在嵌入式设备上进行软件新功能研发过程中,短时间内需要进行快速迭代开发,那么就面临着频繁迭代版本。每个版本的发布都必须包含固件,目前采用openwrt编译系统编译固件编译周期较长,如此便造成版本发布在软件研发过程中产生瓶颈。

使用openwrt进行编译时,其基本原理:从0开始构建编译环境,利用构建好的编译环境进行固件编译,整个过程包含工具链编译、内核编译、软件包编译、固件生成,这种方法的不足之处在于:编译周期相当长,且占用磁盘空间非常大,若存在多个分支版本并行发布,则大大延长版本发布时间,不满足快速迭代开发的需求。

并且,openwrt的固件编译环境的可移植性较差,编译环境只能在当前编译环境中使用,无法共享到其他PC上运行,导致开发者自己在研发的过程中需要不断的编译测试固件,每个研发人员都需要耗费较长时间用于固件编译,增加开发时间成本。

当然,也有使用openwrt的image_builder工具进行编译,其基本原理是保存openwrt编译后生成的内核、rootfs等文件。用户可以将自定义文件重新打包到新的固件中,其不足之处在于,不支持initramfs格式的固件打包。



技术实现要素:

本发明的目的就是为了解决现有技术中存在的上述问题,提供一种基于openwrt编译环境的initramfs固件编译方法及系统。

本发明的目的将通过以下技术方案得以实现:

基于openwrt编译环境的initramfs固件编译方法,包括如下步骤:

S1,接收用户指令,将编译完成的内核文件vmlinux中的.init.data段内容保存至包含已压缩的rootfs文件的init_data文件中;

S2,将所述init_data文件按照两个分割点拆分为3份,拆分后形成的3个文件分别命名为head、body、tail,其中body文件为压缩后的rootfs文件系统;

S3,接收待更新的rootfs文件,将所述待更新的rootfs文件打包压缩形成新的压缩文件,并使其压缩格式与S2步骤中的body文件的压缩格式及文件大小相同;

S4,将S3步骤生成的压缩文件与S2步骤中的head文件、tail文件合并生成new_init_data文件;

S5,将所述new_init_data文件的内容更新至内核文件vmlinux中的.init.data段中,得到新的vmlinux内核文件;

S6,根据目标系统固件格式将新的vmlinux内核文件打包生成对应的固件。

优选的,所述的基于openwrt编译环境的initramfs固件编译方法,其中:

所述S2步骤中的两个分割点中,第一个分割点为已压缩的rootfs文件的起始位置,第二个分割点根据固件系统的位数进行确定。

优选的,所述的基于openwrt编译环境的initramfs固件编译方法,其中:

在S2步骤中,当所述固件系统的位数为32位,所述第二分割点为倒数第四个字节;

当所述固件系统的位数为64位,所述第二分割点为倒数第八个字节。

优选的,所述的基于openwrt编译环境的initramfs固件编译方法,其中:

在所述S3步骤中,当所述新压缩文件的大小不足所述S2步骤中的body文件大小时,在所述新压缩文件中填充0字节内容。

基于openwrt编译环境的initramfs固件编译系统,包括

文件提取单元,用于接收用户指令,将编译完成的内核文件vmlinux中的.init.data段内容保存至包含已压缩的rootfs文件的init_data文件中;

文件拆分单元,用于将所述init_data文件按照两个分割点拆分为3份,其中,第一个分割点为已压缩的rootfs文件的起始位置,第二个分割点根据固件系统的位数进行确定,拆分后3个文件分别命名为head、body、tail,其中body文件即为压缩后的rootfs文件系统;

扩容单元,用于接收待更新的rootfs文件,将所述待更新的rootfs文件打包压缩形成新的压缩文件,并使其压缩格式与S2步骤中的body文件的压缩格式及文件大小相同;

合成单元,用于将扩容单元生产的压缩文件与S2步骤中的head文件、tail文件合并生成new_init_data文件;

更新单元,用于将new_init_data文件内容更新至内核文件vmlinux中的.init.data段中,得到新的vmlinux内核文件;

以及,生成单元,用于根据目标系统固件格式将新的vmlinux内核文件打包生成对应的固件。

优选的,所述的基于openwrt编译环境的initramfs固件编译系统,其中:所述文件拆分单元的第一个分割点为已压缩的rootfs文件的起始位置;当所述固件系统的位数为32位,所述第二分割点为倒数第四个字节;当所述固件系统的位数为64位,所述第二分割点为倒数第八个字节。

优选的,所述的基于openwrt编译环境的initramfs固件编译系统,其中:所述扩容单元中设置有内核patch文件。

本发明技术方案的优点主要体现在:

本发明设计精巧,过程简单,采用本固件编译方法和系统使得固件编译速度大幅提升,且编译系统磁盘占用空间小,可移植性大大增强,满足固件版本快速迭代开发。

附图说明

图1 是本发明的过程示意图;

图2是本发明的过程示意图。

具体实施方式

本发明的目的、优点和特点,将通过下面优选实施例的非限制性说明进行图示和解释。这些实施例仅是应用本发明技术方案的典型范例,凡采取等同替换或者等效变换而形成的技术方案,均落在本发明要求保护的范围之内。

本发明揭示的基于openwrt编译环境的initramfs固件编译系统,如附图1所示,包括依次连接的文件提取单元、文件拆分单元、扩容单元、合成单元、更新单元以及生成单元。

所述文件提取单元用于接收用户指令,将编译完成的内核文件vmlinux中的.init.data段内容保存至包含已压缩的rootfs文件的init_data文件中。

所述文件拆分单元用于将所述init_data文件按照两个分割点拆分为3份,其中,第一个分割点为已压缩的rootfs文件的起始位置,第二个分割点根据固件系统的位数进行确定,拆分后3个文件分别命名为head、body、tail,其中body文件即为压缩后的rootfs文件。

所述扩容单元用于接收待更新的rootfs文件,将所述待更新的rootfs文件打包压缩形成新的压缩文件,并使其压缩格式与S2步骤中的body文件的压缩格式及文件大小相同;所述扩容单元中设置有用于在编译过程中将已压缩的rootfs文件进行扩容的内核patch文件,所述内核patch在编译过程中,生成rootfs文件时,将rootfs文件尾部填充指定大小的空文件,来实现扩容,编译系统将扩容后的rootfs文件编译到内核文件中。

所述合成单元用于将扩容单元生产的压缩文件与S2步骤中的head文件、tail文件合并生成new_init_data文件。

所述更新单元用于将new_init_data文件内容更新至内核文件vmlinux中的.init.data段中,得到新的vmlinux内核文件。

所述生成单元用于根据目标系统固件格式将新的vmlinux内核文件打包生成对应的固件。

本发明进一步揭示了上述基于openwrt编译环境的initramfs固件编译系统的编译过程,如附图2所示,包括如下步骤:

S1,所述文件提取单元接收用户指令,将编译完成的内核文件vmlinux中的.init.data段内容保存至包含已压缩的rootfs文件的init_data文件中并传送给所述文件拆分单元。

S2,所述文件拆分单元将接收的所述init_data文件按照两个分割点拆分为3份,其中,第一个分割点为已压缩的rootfs文件的起始位置,第二个分割点根据固件系统的位数进行确定。

其中,所述固件系统的位数是指目标设备使用此固件启动后的系统位数,在编译前就可以知道固件系统的位数,常见有32位和64位系统,并且,由于tail保存的是rootfs文件的长度,在32位系统中使用4字节保存,在64位系统中使用8字节保存,因此当所述固件系统的位数为32位时,所述第二分割点为倒数第四个字节;当所述固件系统的位数为64位时,所述第二分割点为倒数第八个字节。

将拆分后形成的3个文件分别命名为head、body、tail,其中body文件即为压缩后的rootfs文件,并将拆分后的文件传送给扩容单元。

S3,所述扩容单元接收待更新的rootfs文件以及拆分后的文件,将所述待更新的rootfs文件打包压缩形成新的压缩文件,并使其压缩格式与拆分单元中的body文件的压缩格式及文件大小相同,当所述新压缩文件的大小不足所述S2步骤中的body文件大小时,在所述新压缩文件中填充0字节内容;当所述新压缩文件的大小大于所述S2步骤中的body文件大小时,则认定编译失败,因为每次版本发布固件大小在很小的范围内浮动,并且在编译内核可根据需求默认预留一定的空间,同样在嵌入式环境中,flash空间有限,对固件的大小也是有上限的,比如,现行的rootfs大小为17M,在内核编译时会给rootfs预留27M的空间;将新的压缩文件传送给所述合成单元。

S4,所述合成单元将所述扩容单元生成的新的压缩文件与S2步骤中文件拆分单元拆得的head文件、tail文件合并生成new_init_data文件。

S5,所述更新单元将所述new_init_data文件的内容更新至内核文件vmlinux中的.init.data段中,得到新的vmlinux内核文件。

S6,所述生产单元根据目标系统固件格式将新的vmlinux内核文件打包生成对应的固件。

通过本发明的系统和方法能够减小磁盘占用空间:这是因为openwrt默认编译环境达到20GB的空间,而采用本方法的系统只占用空间约4GB。

并且,本发明支持多分支版本并行发布:这是因为使用本系统编译一次版本只需要5分钟,而使用openwrt进行编译一次至少也需要数小时,当有多个版本同时发布,总的编译的时间就差很大,因此编译效率大幅提高。

同时,本繁忙可移植性增强:这是因为原始的openwrt编译系统首次编译完成后达20G的空间,且无法移植,开发人员必须各自编译,费时费力,使用本系统后总占用空间约4G,且能够在其他编译环境中正常运行,无依赖条件。

本发明尚有多种实施方式,凡采用等同变换或者等效变换而形成的所有技术方案,均落在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1