学习记录
一、使用raspberry官方工具将64bit系统刷入SD卡
二、拉取git代码
首先确认当前树莓派上的内核版本
uname -r
我这里显示的是 6.1.63-v8+ 接下来要确认拉取的代码分支和这里一样
git clone https://github.com/raspberrypi/linux.git -branch rpi-6.1.y
三、编译源码
- 配置环境
sudo apt install raspberrypi-kernel-headers
sudo apt install bc bison flex libssl-dev make
- 安装64位使用的交叉编译工具aarch64-linux-gnu-(32位使用arm-linux-gnueabihf-)
sudo apt-get install gcc-aarch64-linux-gnu
- 编译源码(源码目录下)
KERNEL=kernel8 //(64bit os)
//配置编译环境,生成config文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
//使用配置文件构建 -j是使用的核心数
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j16
四、替换内核
- 将树莓派上的内存卡插入ubuntu主机上,使用命令sudo dmesg打印内核信息查看ubuntu将读卡器识别成sdb或是sdc亦或其他
- 挂在sd卡到ubuntu主机上
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdc1 mnt/fat32 //这里根据自己的来
sudo mount /dev/sdc2 mnt/ext4 //根据自己的来
- 将内核模块安装到sd卡上
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
- 将内核和设备树复制到sd卡上,使用不同的名字,以备份旧的内核,通过修改config.txt来生效
sudo cp arch/arm64/boot/Image mnt/fat32/kernel8_new.img
//拷贝剩下的文件
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
编辑文件mnt/fat32/config.txt,使用新的内核
在
#Run in 64-bit mode
arm_64bit=1
下面一行添加上
kernel=kernel8_new.img
保存并退出
5. 卸载sd卡
sudo umount mnt/fat32
sudo umount mnt/ext4
重启后查看内核版本 uname -r
至此内核替换完成,可以开始内核驱动模块开发学习环节,下面添加一个hello world内核模块驱动试一下
五、hello world内核模块加载测试
- 在源码目录下找到drivers/char,添加一个hello.c文件
cd drivers/char
touch hello.c
- 代码内容:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
static int hello_init(void)
{
printk(KERN_ALERT"Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
- 修改char目录下的Makefile
添加一行
obj-m += hello.o
- 编译模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules
成功生成ko文件在drivers/char目录下:hello.ko
5. 将hello.ko复制到树莓派上
scp drivers/char/hello.ko xxx@192.168.1.xx:/home/name/ //注意替换成自己的路径和ip,看不懂建议百度一下scp用法
- 加载ko文件
insmod hello.ko //在树莓派上
可以看到打印的消息hello world了
如果看不到,是设置的系统打印日志等级过高,可以运行dmesg来看
此致,敬礼