1. 参考
yocto官方文档-devtool
微信读书:嵌入式Linux系统开发:基于Yocot Project
书中对于devtool讲解较少,官方文档对devtool的工作流和使用方法较为详细。
传统开发内核是直接进入内核路径修改源码,这里简述使用devtool工具开发Linux内核。
2. 创建工作空间
/* 1. 创建工作空间 */
~/yocto$ source poky/oe-init-build-env qemux86-64-build/
~/yocto/qemux86-64-build$ devtool create-workspace ../my-workspace
~/yocto/qemux86-64-build$ cat conf/bblayers.conf
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"BBPATH = "${TOPDIR}"
BBFILES ?= ""BBLAYERS ?= " \/home/ubuntu18/yocto/poky/meta \/home/ubuntu18/yocto/poky/meta-poky \/home/ubuntu18/yocto/poky/meta-yocto-bsp \/home/ubuntu18/yocto/meta-mylayer \/home/ubuntu18/yocto/my-workspace \"创建工作空间后自动加载到bblayers.conf文件中。
3. 追加内核菜谱
/* 1. 追加内核菜谱 */
~/yocto/qemux86-64-build$ devtool modify linux-yocto
INFO: Copying kernel config to workspace
INFO: Recipe linux-yocto now set up to build from /home/ubuntu18/yocto/my-workspace/sources/linux-yocto
~/yocto/my-workspace$ tree -L 2
.
├── appends
│ └── linux-yocto_5.14.bbappend
├── conf
│ └── layer.conf
├── README
└── sources└── linux-yocto4 directories, 3 files可以看到,这里使用linux-yocto_5.14.bbappend追加linux内核菜谱。
4. 修改内核
/* 1. 修改内核 */
~/yocto/qemux86-64-build/my-workspace/sources/linux-yocto/init$ vim calibrate.c这里我们并没有在tmp/work/qemux86_64-poky-linux/linux-yocto/5.14.21+git999-r0/linux-yocto-5.14.21+git999路径
下修改内核源码,而是是my-workspace/sources/linux-yocto下修改源码。
记得使用Git开发。
/* 2. 验证 */
~/yocto/qemux86-64-build$ devtool build-image myimage
~/yocto/qemux86-64-build$ runqemu qemux86-64
root@qemux86-64:~# dmesg | grep -i DEVTOOL
*****DEVTOOL YOCTO KERNEL*****这里并未用bitbake构建镜像,而是使用了devtool build-image命令,可以进行快速测试。
5. 生成菜谱
devtool只是用于临时开发的,开发完成后,需要固化我们的成果。
buntu20@ubuntu20:~/yocto/qemux86-64-build$ devtool finish linux-yocto ../meta-mylayer
NOTE: Starting bitbake server...
ERROR: Source tree is not clean:M init/calibrate.cEnsure you have committed your changes or use -f/--force if you are sure there's nothing that needs to be committed这是没有将修改的内核源码进行暂存和提交,使用可视化界面或命令行,提交修改。
命令行如下:
~/yocto/qemux86-64-build/workspace/sources/linux-yocto$ git add -u
~/yocto/qemux86-64-build/workspace/sources/linux-yocto$ git commit -m '2022-04-16'
/* 生成菜谱 */
~/yocto/qemux86-64-build$ devtool finish linux-yocto ../meta-mylayer
INFO: Would remove config fragment /tmp/devtoole_u2lkyq/tmpvg15jgp5/devtool-fragment.cfg
NOTE: Writing append file /home/ubuntu18/yocto/meta-mylayer/recipes-kernel/linux/linux-yocto_%.bbappend
NOTE: Copying 0001-2022-04-16.patch to /home/ubuntu18/yocto/meta-mylayer/recipes-kernel/linux/linux-yocto/0001-2022-04-16.patch
INFO: Cleaning sysroot for recipe linux-yocto...
INFO: Leaving source tree /home/ubuntu18/yocto/my-workspace/sources/linux-yocto as-is; if you no longer need it then please delete it manually
/* 查看myta-mylayer */
~/yocto/meta-mylayer$ tree
.
├── conf
│ └── layer.conf
├── COPYING.MIT
├── README
├── recipes-example
│ └── example
│ └── example_0.1.bb
├── recipes-kernel
│ └── linux
│ ├── linux-yocto
│ │ ├── 0001-2022-04-16.patch
│ └── linux-yocto_%.bbappend
└── recipes-myimage└── myimage└── myimage_0.1.bb8 directories, 8 files可以看到,meta-mylayer生成了recipes-kernel菜谱,内容为补丁文件和追加文件。
/* 查看追加文件 */
~/yocto/meta-mylayer/recipes-kernel/linux$ vim linux-yocto_%.bbappend
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"SRC_URI += "file://0001-2022-04-16.patch"这里指定补丁文件,每次更改,SRC_URI会多一个补丁文件,例如SRC_URI += "0001.patch 0002.patch 0003.patch"。
~/yocto/meta-mylayer/recipes-kernel/linux/linux-yocto$ vim 0001-2022-04-16.patch
From 8d83e7994a68138a9707b8bfba4b6aafb4c7a1c6 Mon Sep 17 00:00:00 2001
From: lljwork2021 <lljwork2021@163.com>
Date: Sat, 16 Apr 2022 16:04:26 +0800
Subject: [PATCH] 2022-04-16---init/calibrate.c | 2 ++1 file changed, 2 insertions(+)diff --git a/init/calibrate.c b/init/calibrate.c
index f3831272f113..3c405d04ce5c 100644
--- a/init/calibrate.c
+++ b/init/calibrate.c
@@ -278,6 +278,8 @@ void calibrate_delay(void)static bool printed;int this_cpu = smp_processor_id();+ printk(KERN_INFO "*****DEVTOOL YOCTO KERNEL*****\n");
+if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {lpj = per_cpu(cpu_loops_per_jiffy, this_cpu);if (!printed)看到这,内心是不是很激动!我们的修改成果轻松固化下来。
6. 编译测试
~/yocto/qemux86-64-build$ bitbake myimage
~/yocto/qemux86-64-build$ runqemu qemux86-64
root@qemux86-64:~# dmesg | grep -i DEVTOOL
*****DEVTOOL YOCTO KERNEL*****