文章目录
- 一、嵌入式带操作系统的启动过程
- 二、Linux内核源码树扫盲分析
- 三、树莓派Linux源码配置
- 1.树莓派Linux的内核配置
- 2.树莓派Linux内核编译
- 3、更换树莓派内核
一、嵌入式带操作系统的启动过程
1.x86,Intel的启动过程:
电源上电->BIOS->Windows内核->C盘,D盘->应用程序启动
2.嵌入式产品(例如:树莓派、全志、海思)启动过程:
电源上电->BootLoader->Linux内核->文件系统 (文件系统介绍)->应用程序
3.安卓的启动过程:
电源上电->fastBoot/Bootloader/->linux内核->文件系统->虚拟机->HOME应用程序->通过图标打开某APP
二、Linux内核源码树扫盲分析
Linux源码大约1.3w个文件,支持多架构多平台代码,但是Linux内核编译出来一般就几M因为支持多平台,多架构,所以编译之前需要配置,配置成适合的目标平台来用。
Linux内核源码代码目录树结构:
arch目录:不同平台体系相关代码;
block目录:块驱动设备
certs目录:与认证和签名相关代码
crypto目录:内核常用加密、压缩算法等代码;
Documentation目录:描述模块功能与协议规范代码;
Drivers目录:驱动程序(USB总线、PCI总线、显卡驱动等等);
firmware目录:主要是一些二进制固件;
fs目录:虚拟文件系统代码;
include目录:内核源码依赖绝大部分头文件;
init目录:内核初始化代码,联系到内存各组件入口;
ipc目录:进程间通信,比如共享内存、信号量匿名管道等等;
kernel目录:内核核心代码,包括进程管理、IRQ、时间等等;
lib目录:C标准库的子集;
mm目录:内存管理相关实现;
net目录:网络协议代码,比如TCP、IPv6、WiFi、以太网实现等等;
samples目录:内核实列代码;
scripts目录:编译和配置内核所需脚本;Perl/bash
security目录:内核安全模型相关代码;如selinux
sound目录:声卡驱动源码;
tools目录:与内核交互;
usr目录:用户打包和压缩内核的实现源码;
virt目录:/kvm虚拟化目录相关支持实现。
三、树莓派Linux源码配置
配置的最终目标是生成.config文件,该文件指导Makefile去把有用的东西组织成内核,配置的方式主要有以下几种
方式一:厂家会配linux内核源码,厂家会提供对于芯片的内核源码,拷贝厂家的.cinfig文件进行配置
方式二:make menuconfig 一项项配置 ,通常是基于厂家的config来配置
方式三:完全自己来
1.树莓派Linux的内核配置
STEP 1: 安装树莓派的交叉编译工具链
(1)进入树莓派官网 点这里进入
下载完之后将其拷贝至Ubuntu内并解压:
unzip tools-master.zip
(2)配置交叉编译工具环境变量
进入解压好的文件夹,进入arm-bcm2708文件夹,根据电脑位数进入相应交叉编译工具的文件夹,我这里是64位
进入bin目录,这里便有树莓派所用的交叉编译工具
获取这个文件的位置,并将其加入环境变量:
a.环境变量临时有效
键入下列内容
export PATH=$PATH:/home/zh/tool-master/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
b.环境变量永久有效
打开 ~/.bashrc隐藏文件
vi ~/.bashrc
将环境变量加入其最后位置:
在另一个终端测试 发现可以用到交叉编译工具
STEP 2 :下载树莓派内核源码 树莓派官网 ,并将其拷贝到Ubuntu并解压
STEP 3:树莓派内核配置
进入内核源码文件夹键入下列内容,进行内核配置
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
ARCH:指定ARM架构
CROSS_COMPILE:指定编译器
KERNEL=kernel7:树莓派专有
make bcm2709_defconfig:使用的配置文件(主要核心指令)
2.树莓派Linux内核编译
STEP 1: 下载必须要用的库:
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
STEP 2 :树莓派Linux内核编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
ARCH:指定ARM架构
CROSS_COMPILE:指定编译器
KERNEL=kernel7:树莓派专有
j4:指定用多少电脑资源进行编译 (j4表示4核)
zImage:生成内核镜像
modules:生成驱动模块
dtbs:生成配置文件
编译成功后,在源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像在arch/arm/boot 目录下
3、更换树莓派内核
STEP 1:用mkknlimg 工具打包zImage 文件,将生成的zImage打包成树莓派可用的xxx.img比如kernel_new.img。
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
STEP 2: 插入带有树莓派系统的内存卡的读卡器并挂载到虚拟机,并键入dmesg命令后出现sda1和sda2表示连接成功
STEP 3:在根目录新建两个文件夹data1、data2并将U盘里的内容挂载到这两个文件夹中
mkdir data1 data2
sudo mount /dev/sdb1 data1
sudo mount /dev/sdb2 data2
sdb1即data1是fat分区,是boot相关的内容,kernel的img
sdb2即data2是ext4分区,也就是系统的根目录分区。、
STEP 4 :安装modules, 用于安装设备驱动文件,像无线网卡,IIC等驱动设备
进入树莓派源码树目录键入
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
[ext4]中挂载ext4分区的目录,因此我这里键入的命令为:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/zh/data2 modules_install
STEP 5:更新 kernel.img 文件
之前用 mkknlimg 工具打包了kernel_new.img文件,只要把它复制到fat分区(data1)并配置使用即可
首先备份之前的kernel.img 文件 ,防止刷机失败,进入挂载fat分区(data1)文件键入下列命令:
cp kernel7.img kernel7OLD.img
然后将之前在源码树目录生成的kernel_new.img拷贝到fat分区(data1)并替代之前的kernel7.img
cp kernel_new.img /home/zh/data1/kernel7.img
拷贝完成后需要校验md5值,如果两文件的md5值不一样则需要重行拷贝,仿真文件却少。
md5sum /home/zh/SYSTEM/linux-rpi-4.14.y/kernel_new.img
md5sum kernel7.img
STEP 6:在源码树中复制其它配置文件到fat分区(data1)
cp arch/arm/boot/dts/.*dtb* /home/zh/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/zh/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/zh/data1/overlays/
STEP 7:将配置玩的内存卡放入树莓派中键入uname -r
查看更换后的内核版
可以发现内核已经更换,之前的内核版本为4.14.114-v7+