如果想要树莓派的内核文件,可以到
Raspberry Pi · GitHub
中选择linux(在连接树莓派的终端中利用指令uname -r来知道自己的树莓派版本)
选择对应的版本,在code里选择download.zip下载压缩包,放到windows中自己之前弄过的共享文件夹中,方便在Ubuntu中文件的传递
我们把下载好的压缩包放在一个创建好的文件夹中(SYSTEM),解压,目的是为了后续配置文件做好准备
驱动代码的编译需要一个提前编译好的内核
编译内核就需要配置
配置的最终目标会生成.config文件,该文件指导Makefile去把有用的东西组织成内核
第一种方式:
厂家配linux内核源码,比如买树莓派,树莓派的linux内核源码商家会一并给你
查找各种内核源码的指令是:find -name *_defconfig
配置对应的内核源码:
cp 厂家.config .config
第二种方式:
make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种方式:
完全自己来
我们把这个为什么配置以及方式有哪几种说清楚后,开始我们的配置工作
树莓派-内核开发-说明 下载代码 编译 替换内核_树莓派-内核开发-说明 下载代码 编译 替换内核 nicekwell-CSDN博客
Linux源码中有很多工程:
树莓派1的工程是bcmrpi_defconfig
树莓派2,3的工程是bcm2709_defconfig
我们选择使用源码里自带的config(内核配置)
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=
指定ARM架构 指定编译器 树莓派
kernel7 make bcm2709_defconfig
主要核心指令
注:上面这个指令不是分段进行
完整指令如下:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
(当然我的建议是先把下面提到的树莓派linux内核编译提到的必要的库安装完成之后在执行这个指令)
这个指令在/home/wbw/SYSTEM/linux-rpi-4.14.y这个目录下进行
注:在你自己解压好的内核源码目录下也就是(linux-rpi-4.14.y)我之所以是4.14是因为我的树莓派版本是4.14,前面有提到。
此命令功能是获取bcm2709_defconfig的配置到.config里
sudo apt-get install bc
sudo apt-get install libcurses5-dev libncursesw5-dev(或者sudo apt-get install libncurses5-dev)
如果你在安装ncurses5出现了Unable to locate package libcurses5-dev问题
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libcurses5-dev
可以考虑是apt源的问题,修改apt源
(1)备份下apt源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
(2)修改/etc/apt/sources.list文件内容
1.首先我们在修改文件内容之前先确认我们自己的Ubuntu版本和code name
可以在终端输入如下指令:
lsb_release -a
2./etc/apt# vi sources.list(在/rtc/apt目录下)(这里建议加sudo,这样可以修改里面的内容)
3.然后可以到阿里云官网(https://developer.aliyun.com/mirror/)找到Ubuntu的下载地址
4.点击进去,下滑,找到对应的源,复制
5.回到linux终端进入/etc/apt# sudo vi sources.list将里面的源替换掉,退出文件
如下是18.04(bionic)的源
deb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
(3)更新源
sudo apt-get update(也是在/etc/apt目录下进行)
(4)再执行一次sudo apt-get install libcurses5-dev libncursesw5-dev(或sudo apt-get install libncurses5-dev)
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
会进入这样一个界面
对图片中的一些东西进行解释:
General setup —>(通用选项)
[ * ] Enable loadable module support —> 内核模块选项
[ * ]Enable the block layer —> 块设备逻辑层选项(大文件支持、分区、I/O调度)
System Type —>(平台选项)
Bus support —> 总线选项
Kernel Features —>内核特征
Boot options —> 引导选项
CPU Power Management —> CPU电源管理选项
Floating point emulation —> 浮点运算
Userspace binary formats —> 用户程序格式
Power management options —> 电源管理选项
[*] Networking support —> 网络协议选项
Device Drivers —> 设备驱动
Firmware Drivers ---- 驱动固件选项
File systems —> 文件系统选项
Kernel hacking —> 内核调试选项
Security options —> 安全模块选项
[*]:编译进内核(*代表Y,编译进内核,zImage包含了驱动)
[M]:编译成模块(以模块的方式生成驱动文件xxx.ko,系统启动后,
通过命令inmosd xxx.ko来加载驱动,也可以减小一些内核大小)
[ ]:表示不需要的部分
空格可切换修改。
修改完毕后,保存退出
如果没有改的就不用执行这一步。
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
-j4:指定用多少电脑资源进行编译
zImage:生成内核镜像
modules:要生成驱动模块
dtbs:生成配置文件
编译成功后,看到源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像在arch/arm/boot底下
我们要打包zImage成树莓派可用的xxx.img
直接用linux源码包里的工具:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img(在linux-rpi-4.14.y目录下使用)
可能会出现以下报错:
bash: ./scripts/mkknlimg:No such file or directory
这是因为这个版本的linux源码包将mkknlimg工具给淘汰了,可以从一些旧版本的源码包中复制过来,也可以使用,同样位于/scripts目录。
在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
注:网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!
将树莓派SD卡插到读卡器,再与电脑连接,然后映射到虚拟机,过程中虚拟机可能会识别不到。
我的原因是会被windows系统抢占,这个时候需要在虚拟机——>可移动设备——>打开Super Top Mass Storage Device
指令dmesg可以看到内核信息
出现 sdb1 和 sdb2 说明成功映射到虚拟机上了。
把树莓派的sd卡插入Ubuntu系统电脑,树莓派的sd卡有两个分区
一个是fat分区(sdb1),是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区(sdb2),也就是系统的根目录分区
一般插入ubuntu会自动挂载,fat分区不需要root权限,ext4需要root权限操作
创建两个文件夹为挂载做准备
mkdir data1
mkdir data2
sudo mount /dev/sdb1 data1
//挂载U盘的sdb1文件分区到当前路径下的data1文件夹,
//该分区为fat分区,是boot相关的内容,kernel的img.
sudo mount /dev/sdb2 data2
//挂载U盘的sdb2文件分区到当前路径下的data2文件夹,
//该分区为ext4分区,也就是系统的根目录分区.
这个地方需要注意一些问题:关于树莓派3B+内核配置遇到的一个问题——nl80211-CSDN博客
(一定要点进去看看,很重要!!!)
运行指令安装,因为内核配置时,有一部分是编译成模块的形式配置进来的,安装后hdmi接口、usb、wifi、io口等等的设备才能使用,所以需要这么一步。
如下指令:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
[ext4]为第二分区(sdb2)虚拟机上挂载的地址(data2的位置),需要根据自己的地址更改
eg:sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=home/wbw/data2 modules_install
这个指令一定要在解压的源码文件夹(/linux-rpi-4.14.y)里运行。
有两种方式更新内核文件,
第一种:
运行以下指令,将生成的kernel_new.img文件拷贝到boot分区(也就是data1文件夹)。
cp ./kernel_new.img ~/data1
还要修改boot分区的config.text文件。
vi ~/data1/config.text
//在最后一行加入kernel=kernel_new.img
第二种:
先备份
cd /home/wbw/data1(在用户目录运行)
sudo cp kernel7.img kernel7OLD.img
再把编译新生成的拷贝到data1,起名kernel7.img
sudo cp kernel_new.img /home/wbw/data1/kernel7.img(在linux-rpi-4.14.y目录运行)
检查:
du kernel_new.img -h
可以查看文件的大小
每个文件都有一个独一无二的特殊编码号(md5),检查拷贝文件是否损坏可以通过查看两个文件的md5是否相同来确认
指令为:
md5sum kernel_new.img
md5sum /home/wbw/data1/kernel7.img
sudo cp arch/arm/boot/dts/.*dtb* [fat]/
sudo cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
sudo cp arch/arm/boot/dts/overlays/README [fat]/overlays/
[fat]为第一分区(sdb1)虚拟机上挂载的地址(data1的位置),需要根据自己的地址更改。
这样就完成了,然后断开与虚拟机的连接,windows连接,在出现的U盘里把cmdline.txt更改成以下内容。
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
最后,将SD卡插回树莓派,用串口查看是否刷机成功。
今天的分享就到这里啦!!!