开发内核的两种方法
参考文档:
Note:
devtool与bitbake类似,同属于yocto中的构建工具,使用前通过如下命令进行声明: source ~/poky/oe-init-build-env
【开发内核前,推荐了解bitbake的常用命令】
1. 内核开发准备
1.1 devtool内核开发准备
1. 初始化bitbake环境
source ~/poky/oe-init-build-env
2. 准备conf/local.conf 文件,该文件包含了构建的环境变量,默认下:
MACHINE = “qemux86”
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
3. 创建一个层,存放修改后的内核补丁文件:
cd poky/build
bitbake-layers create-layer ../../meta-mylayer
4. 配置自定义层的构建环境
cd poky/build
bitbake-layers add-layer ../../meta-mylayer
5. 构建可扩展的SDK:
cd poky/build
bitbake core-image-minimal -c populate_sdk_ext
(完成后,在目录poky/build/tmp/deploy/sdk/下,存在poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-3.3.1.sh)
6. 安装SDK:
./poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-3.3.1.sh
7. 声明SDK中的环境变量(如交叉编译器):
source poky_sdk/environment-setup-i586-poky-linux
echo $CROSS_COMPILE # 查看是否声明成功
8. 构建原始的内核镜像:
devtool build-image
1.2 传统内核开发准备
1. 初始化bitbake环境
source ~/poky/oe-init-build-env
2. 准备conf/local.conf 文件,该文件包含了构建的环境变量,默认下:
MACHINE = “qemux86”
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
3. 创建一个层,存放修改后的内核补丁文件:
cd poky/build
bitbake-layers create-layer ../../meta-mylayer
4. 配置自定义层的构建环境
cd poky/build
bitbake-layers add-layer ../../meta-mylayer
5. 创建一个本地git库:
cd ~
git clone git://git.yoctoproject.org/linux-yocto-4.12 --branch standard/base
(yocto project 2.4 之后不能使用linux-yocto-4.12版本)
6. 创建本地内核缓存 Git 库:
cd ~
git clone git://git.yoctoproject.org/yocto-kernel-cache --branch yocto-4.12
7. 声明SDK中的环境变量(如交叉编译器):
source poky_sdk/environment-setup-i586-poky-linux
echo $CROSS_COMPILE # 查看是否声明成功
8. 构建原始的内核镜像:
devtool build-image
2. 创建和准备层
1. 创建一个层的结构体:
mkdir meta-mylayer
mkdir meta-mylayer/conf
mkdir meta-mylayer/recipes-kernel
mkdir meta-mylayer/recipes-kernel/linux
mkdir meta-mylayer/recipes-kernel/linux/linux-yocto
2. 创建一个层的配置文件:
vim meta-mylayer/conf/layer.conf
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "mylayer"
BBFILE_PATTERN_mylayer = "^${LAYERDIR}/"
BBFILE_PRIORITY_mylayer = "5"
3. 创建内核配方的 .bb 文件:
vim meta-mylayer/recipes-kernel/linux/linux-yocto_4.12.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI_append = " file://patch-file-one.patch"
SRC_URI_append = " file://patch-file-two.patch"
SRC_URI_append = " file://patch-file-three.patch"
3. 使用devtool工具开发内核
1. 检查内核源文件:
source ~/poky/oe-init-build-env;
devtool modify linux-yocto (出现的调试错误可忽略)
2. 进入内核源码目录,修改内核源码:
cd poky_sdk/workspace/sources/linux-yocto/
vim init/calibrate.c
void calibrate_delay(void)
{
unsigned long lpj;
static bool printed;
int this_cpu = smp_processor_id();
printk("*************************************\n");
printk("* *\n");
printk("* HELLO YOCTO KERNEL *\n");
printk("* *\n");
printk("*************************************\n");
if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
.
.
.
3. 更新修改后的内核源码:
devtool build linux-yocto
4. 创建内核新镜像:
cd ~
devtool build-image core-image-minimal
5. 测试修改后的内核:
烧录目标系统,查看启动日志 dmesg (printk)
6. 暂存并提交修改后的内核:
cd poky_sdk/workspace/sources/linux-yocto
git status
git add init/calibrate.c
git commit –m “calibrate: Add printk example”
7. 导出内核修改后的补丁并创建.bb文件:
devtool finish linux-yocto workdir/meta-mylayer
meta-mylayer 为自定义的层, 上述命令完成后,补丁文件和 .bb 文件将位于workdir/meta-mylayer/recipes-kernel/linux/)
8. 利用修改的内核,构建整个镜像:
cd ~/poky/build
bitbake core-image-minimal
4. 使用传统方法开发内核
1. 进入内核源码目录,修改内核源码:
cd ~/linux-yocto-4.12/
vim init/calibrate.c
void calibrate_delay(void)
{
unsigned long lpj;
static bool printed;
int this_cpu = smp_processor_id();
printk("*************************************\n");
printk("* *\n");
printk("* HELLO YOCTO KERNEL *\n");
printk("* *\n");
printk("*************************************\n");
if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
.
.
.
2. 阶段性提交修改后的内核:
git add init/calibrate.c
git commit –m “calibrate: Add printk example”
3. 更新local.conf配置文件,指向内核源码:
cd poky/build/conf
vim local.conf
SRC_URI_pn-linux-yocto = "git:///path-to/linux-yocto-4.12;protocol=file;name=machine;branch=standard/base; \
git:///path-to/yocto-kernel-cache;protocol=file;type=kmeta;name=meta;branch=yocto-4.12;destsuffix=${KMETA}"
SRCREV_meta_qemux86 = "${AUTOREV}"
SRCREV_machine_qemux86 = "${AUTOREV}"
4. 使用bitbake构建修改后的内核镜像
cd poky/build
bitbake core-image-minimal
5. 测试修改后的内核:
烧录目标系统,查看启动日志 dmesg (printk)
6. 产生内核修改后的补丁文件:
cd ~/linux-yocto-4.12/init
git format-patch -1
0001-calibrate.c-Added-some-printk-statements.patch
7. 移动补丁文件到上文创建的层:
mv ~/linux-yocto-4.12/init/0001-calibrate.c-Added-some-printk-statements.patch ~/meta-mylayer/recipes-kernel/linux/linux-yocto
8. 在recipes-kernel/linux目录下创建 .bb 文件:
vim linux-yocto_4.12.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI_append = "file://0001-calibrate.c-Added-some-printk-statements.patch"
9. 重新构建修改后的内核:
cd poky/build
bitbake -c cleanall yocto-linux
bitbake core-image-minimal -c cleanall
bitbake core-image-minimal
【脱离yocto命令的传统内核开发】
传统方法开发内核也可不依赖于yocto中的工具:
1. 将 yocto 目录下的内核拷贝出来, 内核源码目录可通过如下命令查询:
bitbake -e linux-yocto | grep ^S=
2. 找到相应芯片厂商的内核补丁包,将其复制出来,一般在 meta-厂商 目录下
(将所有补丁放在内核源码的上一层)
3. 声明SDK中的环境变量(如交叉编译器):
source poky_sdk/environment-setup-i586-poky-linux
echo $CROSS_COMPILE # 查看是否声明成功
4. 进入内核目录,打入补丁包并进行编译:
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done # 将所有补丁打入内核中
cd ~/linux-yocto-4.12
make menuconfig
make