Linux 内核开发环境提供了一个强大、灵活和可定制的平台,适用于各种应用场景和硬件架构。对于需要高度定制和优化的系统而言,Linux内核开发环境可以帮助开发人员提高开发效率和性能。
开源:Linux内核是一个开源项目,意味着任何人都可以查看、修改和使用内核源代码。这使得内核开发者和社区能够共同协作,快速解决问题和改进内核。
易于定制:由于 Linux 内核是开源的,因此用户可以根据自己的需要对其进行定制。这意味着您可以根据应用程序和硬件需求选择特定的功能和模块,并编译出适合自己的内核镜像。这样可以提高系统性能和安全性,同时减少系统资源消耗。
多架构支持:Linux 内核是为多种硬件架构设计的,包括x86、ARM、MIPS等。这使得 Linux 内核可以被部署在各种设备上,从服务器、台式机到嵌入式设备、智能手机等。
可移植性强:Linux 内核源代码可以被移植到许多不同的平台上。这意味着您可以将现有的 Linux 应用程序或驱动程序移植到其他操作系统上,或将自己开发的应用程序或驱动程序移植到 Linux 平台上。
作者:炭烤毛蛋 ,点击博主了解更多。
提示: 操作有风险,测试需谨慎。
Linux的内核采用gcc交叉编译工具链编译,编译方式基本相同。
内核交叉编译工具链路径:
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/
编译内核环境所需基础环境,以基础官方的 rk3568-evb6-ddr3-v10-linux.dts为例。
# 编译内核配置
make ARCH=arm64 rockchip_defconfig -j$(nproc)
# 编译内核
make ARCH=arm64 rk3568-evb6-ddr3-v10-linux.img -j$(nproc)
内核编译环境仅为编译内核后的环境,不一定存在源码;如提供给第三方开发,可删除源码和编译文件,只提供编译环境。
# 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/
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");
在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
。
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-
make rockchip_defconfig
# 编译全部动态库
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/目录,并将其加载到内核中。
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) 内核环境和编译工具链共同组成内核编译环境,缺一不可。
不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋 。