树莓派启动流程分析

您所在的位置:网站首页 树莓生活环境分析 树莓派启动流程分析

树莓派启动流程分析

2024-07-13 21:28| 来源: 网络整理| 查看: 265

玩转树莓派树莓派bootloader启动流程分析

本文分析树莓派从上电启动到linux内核启动整个流程,关于linux内核引导之后的流程那是后话,本文不涉及

首先需要说明的是,树莓派不是完整意义上的开源硬件,系统启动这一块的代码是没有的,git官网镜像提供的是已经编译好的二进制文件,我想正式树莓派这种半开源的模式成就了树莓派,一来保证了芯片供应商博通的商业利益,二来有效防止了树莓派的仿冒,从而让树莓派在开源硬件的竞争中站稳了脚跟。虽然没有源代码,关于树莓派启动这一块的分析还是可以大致分析的,下面就来简单分析下树莓派的启动流程。

为了降低成本,树莓派省去了传统计算机用来存储引导加载程序的板载存储器(BIOS), 直接把引导程序放在了SD卡中。树莓派2具有一款博通的BCM2836系统芯片, 当启动时,ARM Cortex-A7的CPU会处于复位状态,由VideoCore IV GPU核心负责启动系统,也就是boot的启动是由GPU code来完成,而不是cpu,这是与一般ARM架构的处理器不一样的地方。首先罗列下树莓派启动会用到的文件

pi@raspberrypi ~ $ ls -a /boot/. COPYING.linux LICENSE.oracle.. fixup_cd.dat overlaysbcm2708-rpi-b.dtb fixup.dat start_cd.elfbcm2708-rpi-b-plus.dtb fixup_db.dat start_db.elfbcm2708-rpi-cm.dtb fixup_x.dat start.elfbcm2709-rpi-2-b.dtb issue.txt start_x.elfbootcode.bin kernel7.img System Volume Informationcmdline.txt kernel.imgconfig.txt LICENCE.broadcom

bootloader第一阶段

树莓派的启动是有GPU和CPU协同工作完成的,上电后,首先运行的是SOC里面的一个小核心(secure core),secure core是在SOC内的FLASH预先烧录的一端程序,这段程序检查OTP并运行SOC rom内的程序,rom内的程序会初始化一些设备,但其最主要的功能是用来引导boot的第二阶段,第二阶段的程序位于SD卡的/boot目录下的bootcode.bin,是我们烧录进去的。

bootloader第二阶段

bootloader第二阶段的程序是bootcode.bin,这个bin文件相当于GPU的引导文件,bootcode.bin会初始化SDRAM然后从SD卡上检索GPU固件(start.elf),然后运行它,从而启动GPU

bootloader第三阶段

第三阶段的程序是start.elf,GPU加载执行start.elf来负责图像输出工作,start.elf读取config.txt来设置图像输出格式,在完成Video Core IV的初始化之后,start.elf会读取cmdline.txt,cmdline.txt包含内核运行的参数,用来初始化CPU的clock和串口等设备,然后将kernel.img加载到GPU分配的共享内存里,最后触发CPU的reset,将引导工作交付给CPU

这里比较有意思的是start.elf除了传递基本的内核参数给CPU,也会传递一些额外的参数,比如DMA通道、GPU参数、MAC地址、eMMC时钟速度和内核寻址范围等等,额外传递的参数如下123456789101112131415dma.dmachans=0x7f35bcm2708_fb.fbwidth=1280bcm2708_fb.fbheight=1024bcm2708.boardrev=0xebcm2708.serial=0xd9b35572smsc95xx.macaddr=B8:27:EB:B3:55:72sdhci-bcm2708.emmc_clock_freq=250000000vc_mem.mem_base=0xec00000vc_mem.mem_size=0x10000000console=ttyAMA0,115200kgdboc=ttyAMA0,115200console=tty1root=/dev/mmcblk0p2rootfstype=ext4rootwait

而这些参数在主流的内核里是没有的

bootloader第四阶段

这一阶段的启动就是嵌入开发中常规的引导过程,CPU复位之后,执行kernel.img,将内核解压缩并启动start_kernel,完成一系列设备的初始化,启动0号进程init_task(内核态),继而启动1号进程kthread(内核态),kthread负责执行内核的部分初始化工作及进行系统配置并创建若干个用于高速缓存和虚拟主存管理的内核线程,然后kthread调用execve运行init函数(内核态),然后演变成用户态1号进程,即init进程(用户态),用户态init按照配置文件/etc/initab的要求,完成系统启动工作,创建编号为1号、2号…的若干终端注册进程getty,最终进入应用程序

题外话

由于树莓派上电启动过程中用到的二进制文件代码都不是开源的,所以树莓派不像一般的CPU bootloader启动方式,但这并不影响我们使用树莓派,毕竟我们也不必老是折腾启动,同时由于树莓派的这种启动方式,导致了树莓派不是一个裸机ARM,就会出现了无法像单片机一样直接对树莓派编程,也需要其核心引导之后进入系统才行,因此拿树莓派来做裸机开发就不合适了。

值得说明的是,由于树莓派的启动核心VideoCore IV是博通的Broadcom BCM2836, 这块芯片是博通特供树莓派使用的,一般人拿不到博通的这块芯片的,博通也不会提供技术支持,树莓派核心显卡的程序是无法移植到其他的芯片上去的,所以市面上树莓派基本没有假的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3