基于树莓派4b(raspberry pi 4b)内核编译流程,交叉编译环境搭建,loadable kernel module (LKM)编译方法

树莓派4b编译Linux内核&交叉编译环境的搭建

使用树莓派4b编译内核很简单,具体可以参考以下树莓派官网中关于Build the Kernel的内容:

 https://www.raspberrypi.com/documentation/computers/linux_kernel.html#building-the-kernel

使用树莓派4b编译内核就一个字:慢!我买的是8G RAM版本的4b(以下简称rpi 4b),感觉每次编译要花掉1个小时的时间。所以我会选择用笔记本运行虚拟机来交叉编译rpi 4b的内核,具体硬件配置为CPU: i7-11800H,RAM:32GB。软件为:虚拟机VMware Workstation 16.1.2 build-17966106,Ubuntu 18.04.6 LTS,Ubuntu内核版本5.4.0-105-generic。树莓派内核源码使用rpi-5.15.y。用以上配置的笔记本编译一次内核大约需要8分钟。因为两者编译时间上的巨大差异,所以导致我经常用笔记本编

loadable kernel module (LKM)交叉编译方法

      本人主要用rpi 4b学习Linux的驱动开发。习惯在rpi 4b上搭建samba服务,然后通过VScode直接打开rpi 4b上的项目文件夹来开发,MobaXterm通过SSH辅助运行make,加载模块等命令。自我感觉这套开发流程比较时候初学者,可以先主要把精力放在学习编程本身,先避开学习繁琐的传统Linux开发工具。我这种习惯也导致在笔记本上编译的Linux内核还有内核模块,拷贝并加载到rpi 4b SD卡上的时候,会导致在rpi 4b上编译内核出现错误,其中之一的错误为:

pi@gf-raspberrypi:~/LinuxDeviceDD/18_dtsplatform $ make
make -C /home/pi/rpi4_kernel_5.15.y/linux M=/home/pi/LinuxDeviceDD/18_dtsplatform modules
make[1]: Entering directory '/home/pi/rpi4_kernel_5.15.y/linux'
  MODPOST /home/pi/LinuxDeviceDD/18_dtsplatform/Module.symvers
ERROR: modpost: "__might_fault" [/home/pi/LinuxDeviceDD/18_dtsplatform/leddriver.ko] undefined!
make[2]: *** [scripts/Makefile.modpost:134: /home/pi/LinuxDeviceDD/18_dtsplatform/Module.symvers] Error 1
make[2]: *** Deleting file '/home/pi/LinuxDeviceDD/18_dtsplatform/Module.symvers'
make[1]: *** [Makefile:1783: modules] Error 2
make[1]: Leaving directory '/home/pi/rpi4_kernel_5.15.y/linux'
make: *** [Makefile:9: kernel_modules] Error 2

解决办法很简单,把笔记本虚拟机的内核根目录中的.config文件拷贝到rpi 4b内核根目录中,替换原来的.config文件并重新用rpi 4b编译,编译完成后别忘sudo make modules_install(当然前提是虚拟机与rpi 4b用的是同一版本的Linux源码)。成功编译项目模块:

pi@gf-raspberrypi:~/LinuxDeviceDD/18_dtsplatform $ make
make -C /home/pi/rpi4_kernel_5.15.y/linux M=/home/pi/LinuxDeviceDD/18_dtsplatform modules
make[1]: Entering directory '/home/pi/rpi4_kernel_5.15.y/linux'
  CC [M]  /home/pi/LinuxDeviceDD/18_dtsplatform/leddriver.o
  MODPOST /home/pi/LinuxDeviceDD/18_dtsplatform/Module.symvers
  CC [M]  /home/pi/LinuxDeviceDD/18_dtsplatform/leddriver.mod.o
  LD [M]  /home/pi/LinuxDeviceDD/18_dtsplatform/leddriver.ko
make[1]: Leaving directory '/home/pi/rpi4_kernel_5.15.y/linux'

 如果想用虚拟机交叉编译rpi 4b的loadable kernel module,

  1. 安装工具链:sudo apt install crossbuild-essential-armhf
  2. 编译模块的时候使用以下命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

你可能感兴趣的:(linux)