前言
linux内核配置,编译
官方文档:
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compiling-the-kernel
一、linux源码目录树
嵌入式开发比较关心设备驱动开发相关,而驱动部分的编译需在一个提前编译好的内核,编译内核就必须先配置内核。
Linux内核源代码目录树结构:
arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
block:部分块设备驱动程序。(块设备:和存储设备相关的设备)
crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
Documentation:关于内核各部分的通用解释和注释。
drivers:设备驱动程序,每个不同的驱动占用一个子目录。
fs:各种支持的文件系统,如ext、fat、ntfs等。(file system)
include:头文件。其中,和系统相关的头文件被放置在linux子目录下。
init:内核初始化代码(注意不是系统引导代码)。
ipc:进程间通信的代码。
kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。
lib:库文件代码。
mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
net:网络相关代码,实现了各种常见的网络协议。
scripts:用于配置内核文件的脚本文件。
security:主要是一个SELinux的模块。
sound:常用音频设备的驱动程序等。
usr:实现了一个cpio。
二、linux内核
1.linux源码下载
先查看自己树莓派板子系统的版本(5.15 32位)
uname -a
树莓派github中linux一栏,选择系统型号,下载linux源码,
将源码放入共享文件夹,将其拷贝到ubuntu中并解压,进入其文件夹
2.内核配置
配置的最终目标会生成 .config文件,该文件的作用是指导Makefile去把有用东西组织成内核
首先安装必要的库
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
安装工具链
sudo apt install crossbuild-essential-armhf //32位内核
sudo apt install crossbuild-essential-arm64 //64位内核
进入到linux源码文件夹,配置内核
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make bcm2711_defconfig //树莓派4 32位
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig //树莓派2.3 32位
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel make bcmrpi_defconfig //树莓派0,1 32位
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel7l make bcm2711_defconfig //所有型号 64位
//ARCH指定内核架构,CROSS_COMPILE指定交叉编译工具链,KERNEL树莓派指定
也可继续进入到menuconfig一项项配置
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make menuconfig //参数同上
3.内核编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make -j4 zImage modules dtbs //32位 KERNEL参数同上
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel7l make -j4 Image modules dtbs //64位
//-jn:指定用多少电脑资源进行编译, n 是处理器数量 * 1.5,zImage生成内核镜像,modules要生成驱动模块,dtbs生成配置文件
等内核编译生成后,会在源码目录下生成一个vmlinux文件,而目标镜像文件在
源码目录/arch/arm/boot //32位
源码目录/arch/arm64/boot //64位
4.内核拷贝
将树莓派的sd卡通过读卡器连接到虚拟机上
挂载u盘
先创建两个文件夹
mkdir ~/mnt/fat32
mkdir ~/mnt/ext4
sudo mount /dev/sdb1 ~/mnt/fat32 //boot相关内容,存放内核镜像
sudo mount /dev/sdb2 ~/mnt/ext4 //根目录文件夹
进入到源码目录下,安装modules(设备驱动文件: hdmi usb wifi io)
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=~/mnt/ext4 modules_install
更新内核镜像
sudo cp ~/mnt/fat32/$KERNEL.img ~/mnt/fat32/$KERNEL-backup.img #备份旧内核
sudo cp arch/arm/boot/zImage ~/mnt/fat32/$KERNEL.img #32位更新
sudo cp arch/arm64/boot/Image ~/mnt/fat32/$KERNEL.img #64位更新
复制其他文件
#32位
sudo cp arch/arm/boot/dts/*.dtb ~/mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* ~/mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README ~/mnt/fat32/overlays/
#64位
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/
卸载设备
sudo umount ~/mnt/fat32
sudo umount ~/mnt/ext4
将sd卡插入树莓派中启动查看版本
总结
1.启动过程:
C51,STM32(裸机)->C直接操控底层寄存器实现相关业务
X86,Intel windows等:电源 -> BIOS ->windows内核->C,D盘等-> 程序启动
嵌入式产品: 树莓派,nanopi,等:电源->BootLoader(引导操作系统启动)->Linux内核->文件系统(根据功能性来组织文件夹,带访问权限)->程序
安卓:电源->fastBoot/Bootloader/->linux内核->文件系统->虚拟机(跑java程序)->HOME应用程序->点某图标打开某APP
2.uname -r 显示系统的发行版号
uname -a显示系统名、节点名称、操作系统的发行版号、内核版本等等。
nproc:查看cpu核数
dmesg:查看内核信息,当有设备接入时,内核会打印驱动的一些相关信息
sudo mount /dev/sdb1 mnt/fat32 挂载设备
sudo umount ~/mnt/fat32 卸载设备
md5sum:文件内容相同时,md5值也是相同的,检查拷贝过程中是否损坏文件
getconf LONG_BIT:查看多少位处理器
3.tree:当前目录下采用树状的形式列出目录的内容
安装tree:
sudo apt install tree
4.make:是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。
比如>make a.txt
此时调用make命令并不起作用,因为make本身并不知道如何做出a.txt,需要有人告诉它,如何调用其他命令完成这个目标,所以有了Makefile,(Makefile文件也可以写为makefile),makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。
make的一个好处就是当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,
make 命令必须要在 Makefile 的当前目录执行
配置内核方法:make config(基于文本的为传统的配置界面)、make oldconfig(在原来内核配置的基础上修改一部分)、make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)、make menuconfig(基于文本选择的配置界面,字符终端下推荐使用),以上4种配置方式的目的都是在源码的顶层目录下面生成一个 .config 文件(配置文件)
defconfig文件:平台厂商提供,内核编译用作.config的参考
5.在参考官方文档之前参考过别的博主博文过程中出现的一些问题,但之后在按照官方文档这些问题被修复