树莓派-linux内核编译
装虚拟机[^1]配置共享文件夹配置交叉编译工具下载树莓派linux系统内核[^3]树莓派等芯片带操作系统的启动过程树莓派linux源码目录树树莓派linux源码配置配置树莓派linux的内核[^5]编译拷贝内核文件到SD内存卡装虚拟机1
用于生成一个放linux系统2的虚拟硬件设备
配置共享文件夹
linux的共享文件夹路径
/mnt/hgfs/linux-gongxiang
配置交叉编译工具
因为有时,有的平台刚开始是没有能编译的环境,有的是没有办法配置编译环境,所以就需要交叉编译
1、cp /mnt/hgfs/linux-gongxiang/tools-master.zip .
从共享文件夹复制下载的交叉编译工具链压缩包,到当前文件夹下
2、unzip tools-master.zip
解压文件tools-master.zip
3、vi /home/yang/.bashrc
打开要修改的配置文件
4、在文件最后一行加入配置的环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/yangyingchun/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
或者
export PATH=$PATH:/home/yangyingchun/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
5、source /home/yang/.bashrc
加载这个配置文件,使其马上生效
6、arm-linux-gnueabihf-gcc -v
查看交叉编译工具链的版本
下载树莓派linux系统内核3
许多操作系统可用于 Raspberry Pi,包括 Raspberry Pi OS、树莓派官方4支持的操作系统以及来自其他组织的操作系统。
1、cp /mnt/hgfs/linux-gongxiang/linux-rpi-4.14.y.zip .
从共享文件夹复制下载的树莓派系统内核压缩包,到当前文件夹下
2、unzip linux-rpi-4.14.y.zip
解压树莓派系统
树莓派等芯片带操作系统的启动过程
C51、STM32(裸机的状态下是没有BIOS以后的东西)这些芯片是单纯的C语言直接操控底层寄存器实现相关业务
遥控灯:while(1)一直检测用户是否按下了某个按键,给出对应的反应
垃圾桶:WemosD1 LOOP循环
恩智浦智能车:STM32
x86、Intel、windows
启动过程:电源——>BIOS——>windows内核——>C盘,E盘——>程序启动(QQ、微信、钉钉)
嵌入式产品:树莓派,mini2440,mini6410,nanopi,海思,RK(瑞芯微)
启动过程:电源——>BootLoader(引导操作系统启动)——>linux内核——>文件系统(根据功能来组织分隔存放对应内容的文件夹,带访问权限)——>KTV点歌机,人脸识别打卡器,智能家居主控……
安卓
启动过程:电源——>fastBoot/BootLoader——>linux内核——>文件系统——>虚拟机——>HOME应用程序——>靠点击应用程序图标来打开某APP
BootLoader
1、需要处理CPU跟内存,FLASH,串口,IIC,IIS,数据段,这些东西之间的沟通,就需要驱动这些设备(汇编和C语言结合)
2、引导linux内核启动(纯C语言)
树莓派linux源码目录树
tree 查看文件夹的整个文件的目录树,会把当前文件夹下的所有文件以树状结构展示
linux-rpi-4.14.y内核:5549个目录,76482个文件
1、linux是一个开源的,支持多架构,多平台代码,可移植性非常强,非常厉害。
2、linux内核编译出来一般,就几MBit大小,原因是在整个linux内核中只用抽取需要编译的平台,需要的架构的那部分代码去编译,所以就做到了轻量化,可移植性强
3、因为支持多平台,多架构,所以编译之前需要配置,配置成适合目标平台的架构来用
现有的架构:
ARM(海思,友善之臂、RK、树莓派、nanoPi)、X86、PowerPC、MIPS
**arch:**放硬件架构,平台相关的代码,X86,ARM等
重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
block
crypto
Documentation
drivers
fs
include
init
ipc
kernel:内核核心
lib
mm
net
scripts
security
sound
usr
树莓派linux源码配置
驱动代码的编写:
驱动代码的编译需要一个提前编译好的内核
编译内核就需要配置内核里需要的内容
配置好后会生成一个 .config文件,该文件指导Makefile去把需要的东西组织成内核
配置方法:
一般芯片厂家会提供linux内核源码,比如树莓派linux源码
第一种:
复制厂家提供的.config文件
第二种:
make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种:
完全自己来弄
配置树莓派linux的内核5
1、获取交叉编译工具
2、获取linux源码
3、配置环境变量
4、用厂家提供的配置config编译内核
使用源码里自带的config配置文件:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfigARCH=arm 指定ARM架构CROSS_COMPILE=arm-linux-gnueabihf- 指定编译器KERNEL=kernel7 树莓派内核make bcm2709_defconfig make为配置命令
获取当前树莓派的config
已经开机的树莓派上会有这个节点:/proc/config.gz,从这个节点可以获取本树莓派的config。
如果没有这个节点的话则需要先加载模块:sudo modprobe configs
把 config.gz 内容复制到要编译的电脑上:
scp pi@[ip]:/proc/config.gz .
解压,保存为.confg文件。
zcat config.gz > .config
注:必须在linux环境下解压,在mac下会乱码。
把此config文件复制到linux源码的根目录。
编译
安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
1、执行menuconfig
用工具界面配置config配置文件
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
剪切,更改内核一些内容,如果没什么改的就不用执行这一步。
驱动的两种加载方式:
[ * ] * 代表Y,编译进内核 zImage文件包含了驱动
[ M ] 模块的方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载驱动
2、编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs命令:make -j4 zImage modules dtbs-j4 用多少电脑资源进行编译zImage 生成内核镜像modules 要生成的驱动模块dtbs 要生成的配置文件
查看是否编译成功:
1、看编译是否出错
2、源码目录树文件是否生成 vmlinux 文件,有就成功,失败则无此文件
3、linux-rpi-4.14.y/arch/arm/boot 查看此内核文件路径下 zImage 内核镜像文件的生成
3、打包zImage文件
打包 zImage 内核镜像文件为xxx.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
拷贝内核文件到SD内存卡
dmesg 查看打印内核的一些信息
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。
1、数据拷贝
mkdir data1 data2
挂载U盘
sudo mount /dev/sdb1 data1 挂载U盘里sdb1文件分区到当前目录data1文件夹,fat分区
sudo mount /dev/sdb2 data2 挂载U盘里sdb2文件分区到当前目录data2文件夹,ext4分区
2、安装modules,设备驱动文件,HDMI,USB,wifi,IO …
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/yang/data2 modules_install
操作ext4分区,需要root权限。
3、更新 kernel.img 文件,注意镜像文件名称为:kernel7.img
避免新内核出错,所以需要先备份一下以前的内核
cd /home/yang/data1
cp kernel7.img kernel7OLD.img
在把新编译的内核拷贝到data1文件夹下
cp kernel_new.img /home/yang/data1/kernel7.img
du kernel7.img 查看文件大小
du kernel7.img -h 查看文件大小,结果按kb,M显示
md5sum kernel7.img 查看文件独有的文件编码
4、其它配置文件拷贝
cp arch/arm/boot/dts/.*dtb * /home/yang/data1
cp arch/arm/boot/dts/overlays/.*dtb * /home/yang/data1/overlays
cp arch/arm/boot/dts/overlays/README /home/yang/data1/overlays/
更新完成后插回树莓派即可开机,开机后可以用 uname -a 命令查看kernel信息已经改变
uname -r 查看内核版本
删除挂载到linux的文件夹
fuser -km 文件夹
sudo umount 文件夹
rm -rf 文件夹
VMware虚拟机 ↩︎
Ubuntu-linux系统 ↩︎
树莓派系统内核下载 ↩︎
树莓派官网 ↩︎
树莓派内核开发参考 ↩︎