嵌入式系统启动过程
电源----BootLoader----Linux内核----文件系统----应用程
BootLoader
引导操作系统启动,启动大多分为两个阶段:
一阶段主要依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。
硬件初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)。
固态存储媒质中,复制Bootloader二阶段代码到RAM。
预备RAM空间。
设置堆栈。
二阶段C语言完成,实现复杂的功能,程序有更好的可读性和可移植性。
初始化硬件。
检测系统内存映射。
内核映像和根文件系统映像从Flash读到RAM。
为内核设置启动参数。
调用内核。
为什么要关闭Cache?
使用Cache以及buffer提高系统性能,由于Cache的使用改变访问主存的数量、类型和时间,Bootloader通常是不需要的跳转到第二阶段的C程序入口点
Linux源码目录
arch:硬件体系结构相关的代码。包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
block:部分块设备驱动程序。
crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
Documentation:关于内核各部分的通用解释和注释。
drivers:设备驱动程序,每个不同的驱动占用一个子目录。
fs:各种支持的文件系统,如ext、fat、ntfs等。
include:头文件。系统相关的头文件被放置在linux子目录下。
init:内核初始化代码(注意不是系统引导代码)。
ipc:进程间通信的代码。
kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。
lib:库文件代码。
mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
net:网络相关代码,实现了各种常见的网络协议。
scripts:用于配置内核文件的脚本文件。
security:主要是一个SELinux的模块。
sound:常用音频设备的驱动程序等。
usr:实现了一个cpio(文件备份程序及文件格式)。
树莓派Linux源码配置(ubuntu18.04)
内核配置方式:copy已发布的config,依据已发布的config配置(make menuconfig)
驱动加载的两种方式:编译进内核(zImage内),生成moudle启动后加载(insmod)
解压源码包
unzip linux-rpi-4.14.y.zip
内核配置
cd linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
ARCH:指定架构
CROSS_COMPILE:指定编译工具(提前做好环境变量)
KERNEL:内核版本
make:配置命令
后缀为内核文件
树莓派Linux内核编译(ubuntu18.04)
搭建编译环境
sudo apt-get install -y bc l libncurses5-dev libncursesw5-dev zlib1g:i386 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
编译
cd /root/linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
j4: 指定编译资源
zImage:生成内核镜像(arch/arm/boot/)
modules:生成驱动模块
dtbs:生成配置文件
生成vmlinux
打包镜像
cd /root/linux-rpi-4.14.y
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
挂载树莓派SD卡
cd /root
mkdir fat ext4
mount /dev/sdb1 fat
mount /dev/sdb2 ext4
fat分区是boot相关,kernel_img
ext4分区是系统的根目录分区
安装modules, 设备驱动文件(hdmi,usb ,wifi,io...)
/root/linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/root/ext4 modules_install
备份
备份树莓派原有镜像(fat)
cd /root/fat/
cp kernel7.img kernel7_old.img
拷贝新的镜像为树莓派镜像(fat)
cp /root/linux-rpi-4.14.y/kernel_new.img /root/fat/kernel7.img
拷贝配置文件
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/.*dtb* /root/fat/
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/overlays/.*dtb* /root/fat/
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/overlays/README /root/fat/
取消挂载,重启树莓派查看内核
linux文件系统
文件系统
文件系统是操作系统用于明确存储设备组织文件的方法。即文件管理系统,简称文件系统。
文件系统分类
FAT VFAT NTFS EXT1/2/3/4 HFS等(df -T)
vfat:boot(bootloader, kernel)
ext4:根目录
tmpfs:内存文件系统
文件目录结构
/bin:二进制文件目录,含系统启动和运行的命令。
/boot:启动Linux系统所需的文件,如内核文件和启动加载程序。
/dev:设备文件目录,含与硬件设备相关的文件。
/etc:配置文件目录,含系统的各种配置文件。
/home:用户主目录。
/lib:系统库文件目录,含运行基本命令和程序所需的库文件。
/media:可移动媒体设备挂载目录,包括U盘、光盘等。
/mnt:挂载目录,用于临时挂载其他文件系统。
/opt:可选应用程序目录,含第三方应用程序。
/proc:虚拟文件系统目录,当前运行的系统进程信息和内核状态信息。
/root:超级用户的主目录。
/run:系统运行时的临时文件目录。
/sbin:系统管理员命令目录,含系统管理命令。
/srv:服务数据目录,含与特定服务相关的数据文件。
/sys:虚拟文件系统目录,含系统硬件设备相关的信息。
/tmp:临时文件目录,用于存放一些临时文件。
/usr:用户程序和数据目录,含系统安装的应用程序和用户数据文件。
/var:可变数据目录,含系统运行过程中的可变数据,如日志文件和缓存文件等。
分区
嵌入式系统分为4个区:
bootloader:启动代码
para:启动代码向内核传递参数的位置
kernel:内核分区
根分区等
虚拟文件系统
vfs是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口。不管文件类型,不管文件是磁盘还是设备,都只用open, read,write统一操作。