树莓派Linux内核源码配置编译挂载开启新内核
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派Linux内核源码配置编译挂载开启新内核相关的知识,希望对你有一定的参考价值。
目录
一、树莓派Linux源码配置(适合树莓派)
总体概述
配置的三种方式
参照博文(一般厂家会给到这样的操作手册,没有就凉凉了,玩不了):http://nicekwell.net/blog/20171108/shu-mei-pai-nei-he-kai-fa-shuo-ming-xia-zai-dai-ma-bian-yi-ti-huan-nei-he.html
前提:交叉编译工具要先安装好,在我的博文树莓派内核开发准备第一节有讲到。因为内核配置全部在宿主机ubuntu下完成的,必须要有交叉编译工具。
1.照搬厂家的配置(使用这种方式)
在内核源码目录文件下搜索厂家配置文件(此步骤作为了解)
可以找到树莓派3、树莓派4使用的厂家配置文件bcm2709_defconfig
find . -name *_defconfig
- 执行命令
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
注意:这个命令要在路径/linux-rpi-4.14.y(存放的源码目录文件)下执行,否则提示 “make: *** 没有规则可制作目标“bcm2709_defconfig”。
- 执行结果
可以发现 厂家config 变成了 .config
2.参考厂家的配置(感受一下)
基于厂家的config,用make menuconfig一项项配置,通常需要自主增删一些驱动
首先要安装必要的库
- 系统自带,一般都有
sudo apt-get install bc
- 必须
sudo apt-get install libncurses5-dev libncursesw5-dev
- 必须
sudo apt-get install zlib1g:i386
- ↓ 若这一步提示“E: 无法定位软件包 lib32ncurses5”可以先留着不做
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
执行menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
可以看到以下界面
回车 selects submenus 进入子菜单带<>的
[ ]表示略过的,不参与编译
空格键切换状态
驱动的两种加载方式:
[*] built-in:表示编译进了内核,zImage包含了驱动。
[M] modularizes:表示以模块的方式生成驱动文件xxx.ko。系统启动后,通过命令inmosd xxx.ko临时加载
3.完全自主配置(需要一定工作经验)
可以工作2-3年后在涉猎。
二、树莓派Linux内核编译
编译指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
是否成功编译?
可以看到在内核的源码树目录下生成了vmlinux(没有压缩的linux)即为成功。
而我们真正想要的目标镜像是/arch/arm/boot/zImage
三、树莓派挂载新内核
1.用linux源码包里的工具打包zImage文件成kernel_new.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
树莓派的镜像文件结尾就是.img,这个文件就是要放到sd卡中的文件
2.镜像拷贝
树莓派sd卡映射到ubuntu上
树莓派断电,把SD卡插入读卡器后按照下图配置
查看内核信息,有设备接入的时候内核会打印出驱动层面的信息。
dmesg
接入成功!
sdb1,2分别是树莓派sd卡的两个分区
①一个fat分区。是boot相关的内容,kernel的img文件在此分区。
②一个是ext4分区,也就是系统的根目录分区。(cd /进入的就是系统的根目录)
数据拷贝
这里我在我的ubuntu桌面底下(/Desktop)新建两个文件夹
mkdir data1
mkdir data2
然后分别关联到sd卡的两个分区中
sudo mount /dev/sdb1 data1
sudo mount /dev/sdb2 data2
查看data1,2分别存放的是什么
可以看到data1为fat分区(boot相关),data2为ext4分区(系统根目录相关),要对应好。
3、安装modules
modules就是内核驱动相关,少了这一步类似网卡,wifi,usb,HDMI这些都用不了
注意:操作的是ext4分区,对应的就是data2
来到linux-rpi-1.14.y文件路径下操作
安装modules的指令是:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
实际使用的时候要将“[ext4]”更改为自己data2的绝对路径 ,这里根据我自己的文件路径修改成:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/zhugl/Desktop/data2 modules_install
可以看到很多的.ko文件,这与驱动相关。出现的提示make: arm-linux-gnueabihf-gcc: Command not found不用管它。
4.安装更新kernel.img文件
注意查看原来镜像名字是kernel7.img
ls /home/zhugl/Desktop/data1
因为原来的这个kernel7.img将要被覆盖(树莓派镜像规定必须要定义成这个名字),为了防止刷机失败,或者拷贝过程中文件损坏,需要提前用别名备份这个文件。打开新的终端(ctrl alt t)(方便操作罢了),进入其存放路径(cd /home/zhugl/Desktop/data1)
sudo cp kernel7.img kernel7OLD.img
从源码树目录(linux-rpi-4.14.y)拷贝kernel_new.img(是由zImage打包而成)到data1并且命名为kernel7.img覆盖原来的文件
sudo cp kernel_new.img /home/zhugl/Desktop/data1/kernel7.img
检查拷贝是否有问题
md5sum显示文件的唯一编码号,若相同则为同一个文件
md5sum kernel_new.img
md5sum /home/zhugl/Desktop/data1/kernel7.img
编码号一样,拷贝正确。
5.拷贝其他文件到fat
都是从目录linux-rpi-4.14.y进行拷贝
这些配置文件是为了能够加载驱动以及一些其他的配置。
————————①
- 更改前
cp arch/arm/boot/dts/.*dtb* [fat]/
- 根据实际更改后
sudo cp arch/arm/boot/dts/.*dtb* /home/zhugl/Desktop/data1/
————————②
- 更改前
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
- 根据实际更改后
sudo cp arch/arm/boot/dts/overlays/.*dtb* /home/zhugl/Desktop/data1/overlays/
————————③
- 更改前
README有没有都行
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
- 根据实际更改后
sudo cp arch/arm/boot/dts/overlays/README /home/zhugl/Desktop/data1/overlays/
四、在树莓派上运行
1.用window配置sd卡文件方便观看启动过程
如果之前在做别的项目,例如串口编程时用于串口数据交互和传输会把这个配置信息删掉,这时需要添加回来,用来观察操作系统启动过程
点击选择断开连接sd卡,使其重新挂载在windows上。
打开sd卡中boot文件夹下的cmdline.txt
按照上图位置添加(直接在虚拟机上修改这个配置文件也可以)
console=ttyAMA0,115200
2.sd卡插回树莓派
sd卡插回树莓派,USB-TTL连接。注意树莓派要在断电下操作
3.打开secureCRT 串口方式登陆树莓派
树莓派重新上电,可以看到启动正常。
如何确定内核已经更换了呢?
查看内核版本号
uname -r
原来版本为4.14.98-v7
所以成功啦!
有意思的是,之前在上一个内核版本树莓派里编写的一些Demo文件都在!而且以前配置的SSH登录、固定IP地址配置都原样不动!所以内核新配置的那两个分区并没有改变以前的一些文件和配置。。
以上是关于树莓派Linux内核源码配置编译挂载开启新内核的主要内容,如果未能解决你的问题,请参考以下文章