rk3568 Linux 内核提取编译环境

本文详细介绍了如何在rk3568环境中设置Linux内核编译环境,包括交叉编译工具链的使用、内核模块的编译与验证,以及如何根据需求定制和移植内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rk3568 Linux 内核提取编译环境

Linux 内核开发环境提供了一个强大、灵活和可定制的平台,适用于各种应用场景和硬件架构。对于需要高度定制和优化的系统而言,Linux内核开发环境可以帮助开发人员提高开发效率和性能。
开源:Linux内核是一个开源项目,意味着任何人都可以查看、修改和使用内核源代码。这使得内核开发者和社区能够共同协作,快速解决问题和改进内核。
易于定制:由于 Linux 内核是开源的,因此用户可以根据自己的需要对其进行定制。这意味着您可以根据应用程序和硬件需求选择特定的功能和模块,并编译出适合自己的内核镜像。这样可以提高系统性能和安全性,同时减少系统资源消耗。
多架构支持:Linux 内核是为多种硬件架构设计的,包括x86、ARM、MIPS等。这使得 Linux 内核可以被部署在各种设备上,从服务器、台式机到嵌入式设备、智能手机等。
可移植性强:Linux 内核源代码可以被移植到许多不同的平台上。这意味着您可以将现有的 Linux 应用程序或驱动程序移植到其他操作系统上,或将自己开发的应用程序或驱动程序移植到 Linux 平台上。

作者:炭烤毛蛋 ,点击博主了解更多。


提示: 操作有风险,测试需谨慎。


1 kernel 编译内核

Linux的内核采用gcc交叉编译工具链编译,编译方式基本相同。

1.1 交叉编译工具链

内核交叉编译工具链路径:

prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/

1.2 编译内核模块

编译内核环境所需基础环境,以基础官方的 rk3568-evb6-ddr3-v10-linux.dts为例。

# 编译内核配置
make ARCH=arm64 rockchip_defconfig -j$(nproc)
# 编译内核
make ARCH=arm64 rk3568-evb6-ddr3-v10-linux.img -j$(nproc)

1.3 删减编译文件和源码

内核编译环境仅为编译内核后的环境,不一定存在源码;如提供给第三方开发,可删除源码和编译文件,只提供编译环境。

# remove source code
find -name *.c | xargs rm
find -name *.ko | xargs rm
find -name *.img | xargs rm
find -name *.o | xargs rm
find -name *.a | xargs rm

# remove source code directory
rm drivers/ -rf
rm arch/arm64/boot/dts/rockchip/ -rf
rm *.img
rm arch/arm64/boot/dts/ -rf
rm .git  -rf
rm Documentation/ -rf
rm vmlinux
rm ./crypto/
rm ./crypto/ -rf
rm ./arch/arm64/boot
rm ./arch/arm64/boot -rf
rm net/ -rf
rm sound/ -rf
rm fs/ -rf
rm tools/ -rf
rm block/ -rf
rm arch/arm/boot/ -rf
rm kernel/ -rf
rm samples/ -rf
rm -rf security/
rm -rf usr/
rm -rf ipc/

2. 编译 ko,验证内核环境

2.1 编写KO模块代码

kernel源码目录下创建my_module目录;在my_module目录中,创建一个新的C语言源文件,例如module.c,编写您的KO模块代码。在该代码中,您可以包含所需的头文件、定义模块和初始化函数等。这些代码将用于生成KO库。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void) {
    printk(KERN_INFO "Hello, dynamic KO module!\n");
    return 0;
}

void cleanup_module(void) {
    printk(KERN_INFO "Goodbye, dynamic KO module!\n");
}

module_init(init_module);
module_exit(cleanup_module);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("user no body");
MODULE_DESCRIPTION("module demo");

2.2 创建 Makefile

在my_module目录中,创建一个名为Makefile的文件,并添加以下内容:

obj-m := module.o

all:
	@rm -rf *.ko
	@make -C /path/to/aosp/source M=$(PWD) modules
	@rm -rf *.mod* *.sym* .*.cmd *.order *.o

clean:
	@rm -rf *.ko
	@rm -rf *.mod* *.sym* .*.cmd *.order *.o
	make -C /path/to/aosp/source M=$(PWD) clean

将/path/to/aosp/source替换为您的AOSP源代码路径,此文中需要改为 kernel/my_module

2.3 编译ko

  • 配置编译器环境变量
    编译机器文件路径为相对路径。
export PATH=$LINUX_BUILD_TOP/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/:$PATH
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
  • 配置内核
    是内核的默认配置文件,可以根据需要选择不同的配置文件。如果您要编译一个wifi模块,可以选择对应的wifi相关的配置文件。
make rockchip_defconfig
  • 编译 ko
# 编译全部动态库
cd kernel
make -j$(nproc) Modules
# 仅仅编译添加的模块
cd kernel/my_module
make ARCH=arm64 -C M=$PWD -j$(nproc)
  • 安装内核模块
adb push drivers/<module-name>.ko /vendor/lib/modules/
adb shell "chmod 644 /vendor/lib/modules/<module-name>.ko"
adb shell "insmod /vendor/lib/modules/<module-name>.ko"

.ko代表您要安装的内核模块的文件名。这个过程会将模块复制到设备的/vendor/lib/modules/目录,并将其加载到内核中。

Tips

  1. 内核编译工具链不确定使用哪个,可以Makefile确认系统环境变量。
cd kernel
grep -ir "gcc-" Makefile
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu),)
CROSS_COMPILE   ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf),)
CROSS_COMPILE   ?= $(srctree)/../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

编译时使用 arm64 变异工具链可以确定为 prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
2) 内核环境和编译工具链共同组成内核编译环境,缺一不可。

结语

不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋

### RK3568 平台编译生成 boot.img 方法 #### 准备工作 为了顺利编译生成适用于 RK3568 的 `boot.img` 文件,在开始前需确认已准备好以下工具和环境: - 安装有适当版本的 Linux 发行版(如 Ubuntu) - 已获取 Rockchip 提供的官方内核源码库 - 配置好交叉编译器链,通常为 aarch64-linux-gnu- - 下载必要的辅助脚本如 mkbootimg、mkbootfs 和 minigzip 等[^4] #### 编译过程 在准备就绪之后,可以按照如下方式操作以完成 `boot.img` 的构建: 进入 kernel 源代码根目录执行编译指令: ```bash make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- distclean make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rk3568_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) ``` 上述命令依次完成了清理旧配置、加载默认配置以及实际编译流程。 对于希望简化后续重复编译工作的开发者来说,可以在 kernel 目录创建一个简单的 shell 脚本来自动处理这些步骤,并最终调用 mkbootimg 将 zImage 及其他资源打包成完整的 boot image[^1]。 #### 打包 Boot Image 当拥有最新编译得到的 zImage 后,可利用预先复制过来的 mkbootimg 工具来进行最后一步封装: 假设当前路径存在所需的组件文件,则可以通过下面的方式快速制作出新的 boot.img: ```bash ./mkbootimg --kernel arch/arm64/boot/Image \ --ramdisk initrd.img.lz4 \ --cmdline "console=ttyS2,1500000 root=/dev/mmcblk0p7 rw rootwait" \ --base 0x0 \ --pagesize 2048 \ --output ./new-boot.img ``` 此段命令指定了启动镜像中的核心参数设置,包括但不限于引导控制台位置、root 文件系统的挂载点以及其他硬件初始化选项。注意这里使用的具体参数可能依据实际情况有所不同,请参照项目文档调整相应值。 #### 解包与修改 如果需要对现有的 boot.img 进行反向工程或是提取其中的内容以便于进一步定制化开发的话,那么可以借助 Python 脚本 unpack_bootimg.py 来实现这一点: ```python import os os.system('python3 unpack_bootimg.py --boot_img old-boot.img --out output_directory') ``` 这会把原始的 boot.img 分离成为独立的部分存放在指定的目标文件夹里,方便对其进行编辑后再重新组合回一个新的 boot.img 形态[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值