目录
一. 嵌入式设备带操作系统的启动过程
上电自检(Power-On Self-Test,POST):当嵌入式设备上电时,硬件会进行自检,以确保所有的硬件组件都正常工作。这个过程由设备的固件(如BIOS或UEFI)控制,它会检测和初始化处理器、内存、外设等硬件组件。
引导加载程序(Bootloader):在自检完成后,引导加载程序被执行。引导加载程序是一个小型的软件程序,通常存储在设备的非易失性存储器中,如闪存或EEPROM。它的主要任务是加载操作系统的核心部分到内存中,并将控制权转交给操作系统。
操作系统加载:引导加载程序会读取存储介质(如硬盘、闪存)上的操作系统映像,将其加载到设备的内存中。操作系统映像通常包括内核和一些必要的系统文件。
内核初始化:一旦操作系统映像被加载到内存中,引导加载程序将控制权转交给操作系统的内核。内核开始执行,并进行初始化过程。它会设置各种数据结构、初始化设备驱动程序、建立进程管理等核心功能。
用户空间初始化:内核初始化完成后,操作系统会启动用户空间的初始化。用户空间是操作系统提供给应用程序运行的环境,包括进程管理、文件系统、网络协议栈等。操作系统会加载并初始化用户空间的各个组件,使其准备好接收应用程序的运行。
用户程序加载与执行:一旦用户空间初始化完成,操作系统就可以加载和执行用户程序了。用户程序可以是预装的应用程序,也可以是用户自己开发的应用程序。操作系统会为每个用户程序创建一个独立的进程,并将控制权转交给该进程,使其开始执行。
以上是嵌入式设备带操作系统的一般启动过程。需要注意的是,具体的启动过程可能因设备类型、操作系统类型以及设备配置等因素而有所不同。此外,某些嵌入式设备可能不使用传统的操作系统,而是采用实时操作系统(RTOS)或裸机编程方式来实现特定的功能。
二. 如何进行内核编译
2.1 查看树莓派4B的内核版本号
uname -r
得知树莓派4B的内核版本为5.10.63-v7l。
2.2 获得树莓派Linux的源码
因为在2.1中查看树莓派4B的内核版本号为5.10.63-v7l,所以要下载 linux-rpi-5.10.y 这一版本的。
打开树莓派的官方GitHub仓库:https://github.com/raspberrypi/linux (速度有点慢)
打开百度网盘下载(linux-rpi-5.10.y):https://pan.baidu.com/s/1ApQsk8VkZbO_nKhYBs_Eww 提取码:8888
打开百度网盘下载(linux-rpi-4.14.y):
https://pan.baidu.com/s/17Vk0k78f1ax_2TdvmqDpyw 提取码:8888
下载两个版本的源码,并在自己的ubantu中解压 (两个都需要后面会用到)
先cp到工作路径中,再进行解压
2.3 树莓派Linux源码目录的了解
使用 ls 查看
arch
: 包含与特定体系结构相关的代码,如ARM、x86等。
block
: 包含块设备子系统的代码,用于处理块设备(如硬盘)的读写操作。
certs
: 包含用于验证内核模块签名的证书。
crypto
: 包含密码学相关的代码,提供加密、解密和哈希等功能。
drivers
: 包含各种设备驱动程序的代码,用于支持不同类型的硬件设备。
fs
: 包含文件系统相关的代码,用于管理文件和目录的创建、读写和删除等操作。
include
: 包含内核头文件,定义了内核中使用的数据结构、宏和函数原型等。
init
: 包含内核初始化和启动代码,负责设置初始环境并启动内核。
ipc
: 包含进程间通信(IPC)机制的代码,如管道、信号量和共享内存等。
kernel
: 包含内核的核心代码,包括调度器、中断处理、内存管理和进程管理等。
lib
: 包含内核常用的库函数和工具函数。
mm
: 包含内存管理相关的代码,用于分配、释放和管理系统内存。
net
: 包含网络子系统的代码,用于处理网络协议栈和网络设备驱动。
samples
: 包含一些示例代码,用于演示特定功能或API的使用方法。
scripts
: 包含一些用于构建、配置和测试内核的脚本工具。
security
: 包含与系统安全相关的代码,如访问控制、安全策略和权限管理等。
sound
: 包含音频子系统的代码,用于处理声音设备和音频数据。
tools
: 包含一些辅助工具和实用程序,用于内核开发和调试。
2.4 内核的配置
编译内核时,需要进行配置以选择所需的功能和驱动程序,并将不需要的部分排除在外,以减小内核的大小并提高效率。
在给某款芯片配置内核时,可以使用配置工具(如
make menuconfig
或make config
)打开配置界面,根据需要选择、启用或禁用不同的配置选项。通过这些配置选项的设置,可以指导Makefile将有用的组件和驱动程序组织成内核。最终,配置过程会生成一个名为
.config
的配置文件,其中包含了所有已选择的配置选项。这个配置文件会被Makefile读取,根据其中的配置信息来编译和组织内核代码。
2.5 内核的裁剪
树莓派4B的配置文件通常是以
bcm2711_defconfig
命名的。这个文件是基于Broadcom BCM2711芯片的树莓派4B的默认配置。ARM体系结构的Linux内核进行配置和编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make bcm2711_defconfig
此命令功能是将
bcm2711_defconfig
的配置复制到.config
文件中。
ARCH=arm
:指定目标体系结构为ARM。这将告诉编译系统使用ARM体系结构相关的配置和工具链。
CROSS_COMPILE=arm-linux-gnueabihf-
:指定交叉编译工具链的前缀。交叉编译是在一种体系结构上的主机系统上编译另一种体系结构的软件。arm-linux-gnueabihf-
是一个常见的ARM体系结构的交叉编译工具链前缀。
KERNEL=kernel7l
:指定内核的名称。这里的kernel7l
是针对某个特定的ARM处理器(如树莓派4B)的内核配置。
make bcm2711_defconfig
:执行make
命令,并使用bcm2711_defconfig
作为配置文件。bcm2711_defconfig
是一个特定的内核配置文件,用于配置ARM架构下的BCM2711芯片(例如树莓派4B)的内核。
2.6 编译ARM体系结构的Linux内核、模块和设备树
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make -j4 zImage modules dtbs
make -j4
:执行make
命令,并使用-j4
参数指定并行编译的任务数。这里的-j4
表示同时运行4个编译任务,以加快编译速度。你可以根据自己的系统资源进行调整。
zImage
:指定要编译生成的内核镜像类型为zImage。zImage是一种压缩的内核镜像格式,常用于ARM体系结构。
modules
:指定编译生成内核模块。
dtbs
:指定编译生成设备树(Device Tree Blob)。编译成功:
在源码树目录(Linux内核源码最顶层目录)中可以看到vmlinux文件
在
arch/arm/boot
目录下可以看到zImage镜像文件
2.7 打包树莓派4B可用的镜像
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
出现错误:
在该版本中的打包工具mkknlimg被淘汰了。
解决错误:
之前下载的4.14.y版本的源码中,有该打包工具,将其进行拷贝即可。
三. 将新的镜像拷贝至树莓派4B
1. 创建两个目录:
mkdir data1 data2
2. 将树莓派4B的SD卡映射到Ubantu上(将读卡器插到电脑):
查看内核的信息和底层硬件数据 dmesg
3. 挂载该SD卡:
sudo mount /dev/sdb1 data1 sudo mount /dev/sdb2 data2
data1:是fat分区,boot相关的内容,kernel的img文件就放在这个分区里
data2:是ext4分区,也就是系统的根目录分区
4. 进行模块的安装:
需要进到源码的目录底下
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make INSTALL_MOD_PATH=/home/blue/data2 modules_install
5.备份旧的镜像文件,拷贝新的镜像文件
备份: cp /home/blue/data1/kernel7l.img kernel7l.img.bak 拷贝: cp kernel_new.img /home/blue/data1/kernel7l.img
6. 拷贝其他相关配置文件:
sudo cp arch/arm/boot/dts/.*dtb* /home/blue/data1 sudo cp arch/arm/boot/dts/overlays/.*dtb* /home/blue/data1/overlays/ sudo cp arch/arm/boot/dts/overlays/README /home/blue/data1/overlays/
7. 验证 (将卡插回树莓派4B,并启动)
这样,我们就将原先树莓派4B的内核版本为5.10.63-v7l,改为想要的5.10.110-v7l版本了。