一.环境要求
硬件设备:树莓派4B
树莓派搭载的操作系统:Ubuntu Server 20.04.5 LTS(64-bit)-----由raspberry Pi image烧录
树莓派官方教程:https://www.raspberrypi.com/documentation/computers/linux_kernel.html#applying-patches
二.本地编译
1.内核版本查看以及内核源码下载
要进行内核编译,首先要确定已经安装的内核版本:
uname -r
之后再官方内核库中下载匹配的内核源码:树莓派内核源码链接
博主的内核版本为5.4.0,因此这里选择5.4.y的内核源码
2.内核解压以及编译
下载得到的内核压缩包,若是.zip文件包,使用解压命令解压,命令如下:
sudo apt-get update
sudo apt-get upgrade
sudo apt install unzip
unzip -q xxxxxx.zip
进入内核源码,安装相关依赖以及gcc编译器:
cd linux-rpi-5.4.y
sudo apt install git bc bison flex libssl-dev make
sudo apt install gcc
内核源码配置以及编译,以64位,v8架构为例,32位版本或其他可参考官方文档:
(编译时间较长,请耐心等待,1+h)
KERNEL=kernel8
make bcm2711_defconfig
make -j4 Image.gz modules dtbs
3.内核安装以及测试
安装命令如下,此时应该是在内核源码目录下操作:
sudo make modules_install
简单查看内核是否安装成功,命令为ls /lib/modules,看是否有我们下载的版本:
ls /lib/modules
测试生成的环境:
可采用远程开发将代码映射到树莓派中,方法在此
//简单的内核模块示例
//不是一个驱动程序
//内核驱动程序是作为一个可以加载的内核模块存在的
#include <linux/init.h>
#include <linux/module.h>
//生命该模块对应的源代码遵循什么样的软件发布协议
MODULE_LICENSE("GPL");
//模块加载的时候的函数
//由于模块加载函数只被调用一次,因此这个对应的代码必须声明为STATIC
//模块加载其insmod程序根据返回值确定模块是否正确的被加载到内核中
static int __init hello_init(void)
{
printk(KERN_INFO"Hello module has been loaded!\n");
return 0;
}
//模块的卸载将调用的函数
static void __exit hello_exit(void)
{
printk(KERN_INFO"Hello module has beed removed!\n");
return ;
}
//告诉编译器哪个函数是加载及卸载执行的函数
module_init(hello_init);
module_exit(hello_exit);
Makefile:
obj-m =helloword.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
rm *.ko *.symvers *.order *.mod.c *.o
最后在root权限下安装模块、卸载模块并查看内核信息:
sudo insmod helloword.ko
sudo rmmod helloword
dmesg |tail -2
三.结语
结束。