一.树莓派等芯片带操作系统的启动过程
1.X86,Intel windows
启动过程: 电源 -》 BIOS -》windows内核-》C,D盘-》 程序启动(QQ)
2.嵌入式产品: 树莓派,mini2440, mini6410,nanopi,海思,RK(瑞芯微)------人脸识别打卡器,智能家居主控。。。
启动过程: 电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统(根据功能性来组织文件夹,带访问权限)-》KTV点歌机,
3.安卓
启动过程: 电源-》 fastBoot/Bootloader/-》linux内核-》文件系统-》虚拟机-》HOME应用程序-》点某图标打开某APP
什么是BootLoader:一阶段 让CPU 跟内存,FLASH, 串口,IIC,IIS, 数据段,打交道,驱动这些设备(汇编和C结合)
二阶段: 引导Linux内核启动 (纯C)
二.树莓派Linux源码目录树分析
参考:https://www.cnblogs.com/senior-engineer/p/4929703.html
大约有1.3w个C文件,几千万行代码,Linux是开源免费的,由Linux开源社区工作者共同维护;而且是多架构多平台代码,可执行度很高;由于支持多平台,多架构,所以在编译之前要配置,配置成适合的目标平台使用。
三.树莓派 Linux 源码配置
参考:树莓派-内核开发-说明 下载代码 编译 替换内核_nicekwell的博客-CSDN博客_树莓派内核开发
驱动代码的编译需要一个提前编译好的内核,编译内核就必须配置,配置的最终目的会生成 .config 文件,该文件指导 Makefile 把有用的东西组织成内核。
配置内核源码的几种情况:
第一种:厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码,cp 厂家.config .config
内核配置指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构 指定编译器 树莓派 主要核心指令
此命令功能是获取bcm2709_defconfig的配置到 .config里。
第二种:make menuconfig 一项项配置,通常是基于厂家的config来配置
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
会有一个基于ncurses库的图形界面:
选项前的*和M是啥意思
驱动两种加载方式:
* 编译进内核 zImage包含了驱动
M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
M和*可以通过按空格切换。
第三种:完全自己来(难)
四.树莓派linux内核编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
-jx指定用多少电脑资源进行编译
zImage生成内核镜像
modules要生成驱动模块
dtbs生成配置文件
打包zImage文件:
目标zImage镜像在arch/arm/boot底下
打包zImage成树莓派可用的xxx.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
五、挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡
1.使用dmesg查看设备
有sdb1和sdb2
创建两个文件夹: data1 和 data2
将sdb1挂载到data1,sdb2挂载到data2
2.挂载u盘,使用指令:
sudo mount /dev/sdb1 data1
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat(咱的data1)分区,是boot相关的内容,kernel的img文件就放在这个分区里,不需要root
一个是ext4分区(咱的data2),也就是系统的根目录分区,需要root
3.安装modules,设备驱动文件: hdmi usb wifi io ...
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/lzy/data2 modules_install
操作ext4(咱的data2)分区,需要root权限。
4.安装更新 kernel.img 文件,注意镜像名字是kernel7.img
先备份
cd /home/chenlc/data1
cp kernel7.img kernel7OLD.img
再把编译新生成的拷贝到data1,起名kernel7.img
cp kernel_new.img /home/lzy/data1/kernel7.img
使用md5sum检查拷贝过去的文件是否正常:
md5sum kernel_new.img
5.复制其他相关文件:
cp arch/arm/boot/dts/.*dtb* /home/lzy/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/lzy/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/lzy/data1/overlays/
.和*之间是通配