需求
原有的工程是多年前基于yocto sumo开发,对应的linux kernel版本是4.14。 需求是要求linux kernel升级到5.10。
背景
工程由以下几部分组成,
- yocto sumo构建部分的代码,包括poky,bitbake等
- 目标平台支持多款第三方处理器,包括imx6和imx8,以及intel某款cpu,所以有meta-freescale和meta-intel等
- 我们自己的linux kernel代码,当初是基于yocto sumo 的linux kernel4.14写的,主要是几个驱动代码,还有少-部分自己维护的补丁
- 我们自己的业务代码,这部分业务代码又分成好几个模块,这里不细述。
调查评估
表面需求是升级linux kernel,我们需要调查:
- 我们当前的驱动代码可能会有问题,包括新的kernel代码可能删除了某些函数导致我们驱动编译失败,另外需要调查我们的补丁是否还适用,是否需要修改
- 为保证对应用户态基础服务能够与新kernel正常工作,对应的glibc等也需要相应升级,对应的交叉编译工具链也需要升级
- 我们的业务代码,由于kerne和#2变化,也需要相应修改以适配新的kernel,glibc和编译链
- 该需求目标平台是基于intel某款cpu的,时间关系我们可以暂时不用关心meta-freescale,重点关注meta-intel layer的升级
所以实际需求是升级整个yocto工程,调查发现yocto hardknott默认linux kernel版本是5.10, 所以需要更新我们的驱动代码,补丁和业务代码,随之带来的是需要更新recipes以适应yocto hardknott升级,基于sumo的脚本与配置也需要修改
实现
-
把poky,meta-openembedded,meta-intel升级到hardknott,meta-freescale暂先删除
-
编译打包过程中需要新的宿主机工具,在local.conf & local.conf.sample中加入HOST_TOOLS
-
layer.conf中有依赖sumo的特定部分,需要改成hardknott
-
hardknott默认python版本已经转变为python3了,对应的get_bblayers.py, set_bb_env.sh等如果还期望继续按python2执行需要把python关键字改为python2
-
bitbake-layers add-layer 指定的layers
-
build/conf/templateconf.cfg 内容需要指定为本工程的poky/meta-qti-eap/conf
-
linux kernel upstream代码如果还没有包含我们之前的补丁那就需要重新生成新补丁并打上
-
linux driver部分,主要有一些函数新的kernel代码已经删除,或者参数返回值类型有变化,相应的需要调整代码,比如
-
- Kconfig 文件语法与新kernel不兼容,需要改
-
- struct timespec 被删掉了, 需要改为timespec64, 替换 ktime_get_ts() 为 ktime_get_ts64(), time_sub →time64_sub, getnstimeofday() → ktime_get_real_ts64(),类似的还有
-
- SIOCGSTAMP, ioremap_nocache(),stubssock_no_setsockopt,sock_no_getsockopt ,setup_timer(),init_timer() ,kernel_setsockopt() cancel_work(), kernel_sock_ioctl() 不再支持,需要找到相应的替代者
-
- wakeup_source_register() ,kernel_getsockname(), send_sig_info(siginfo_t sig, ...) 原型变化,需要相应改动代码
-
用户空间代码改动也较多,简单举几个例子
-
- 不再能在头文件里定义变量,不然新的gcc会报错,需要把原先头文件里定义的变量挪到对应的.c里,如果多处.c使用该变量则用extern 关键字声明。
-
- nanopb 版本升级,对应的需要重新生成.pb.c, .pb.h
-
- recipe里例子比如python-protobuf 需改为python3-protobuf