rk3568 Linux 内核提取编译环境

rk3568 Linux 内核提取编译环境

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

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


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

文章目录

  • rk3568 Linux 内核提取编译环境
  • 1 kernel 编译内核
    • 1.1 交叉编译工具链
    • 1.2 编译内核模块
    • 1.3 删减编译文件和源码
  • 2. 编译 ko,验证内核环境
    • 2.1 编写KO模块代码
    • 2.2 创建 Makefile
    • 2.3 编译ko
  • Tips
  • 结语


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 
#include 
#include 

#include 
#include 

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/.ko"
adb shell "insmod /vendor/lib/modules/.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) 内核环境和编译工具链共同组成内核编译环境,缺一不可。

结语

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

你可能感兴趣的:(Linux,linux)