嵌入式系统篇--上电启动流程

1.ARM芯片上电启动流程

在这里插入图片描述

我们首先来了解几个关键词:
IROM (Internal ROM):芯片内部固化存储代码的存储器
IRAM (Internal RAM):在IROM启动运行的时候,外置SDRAM还没有初始化好,而IRAM是可用的,因此必须要把BL1加载到IRAM中运行,由BL1对SDRAM进行初始化。
Nand Flash :芯片外部非易失闪存技术的存储器,没有地址总线,不能直接运行代码,需要将代码加载到RAM上面才能运行。
SDRAM:芯片外部的运行内存,由运行在IRAM上的BL1进行初始化,用于运行BL2与应用程序。
BL0:固化在芯片iROM中的启动代码。
  作用:初始化PPL和时钟,设置看门狗,关闭中断和看门狗,初始化堆和栈;判断硬件的启动方式,去不同的启动方式的启动设备里面加载BL1。
BL1:是指在IRAM自动从外扩存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件的头,最大16K(一般是4K或8K)代码。
  作用:初始化硬件,初始化RAM,初始化串口,分配堆栈空间,清空.BSS段,加载BL2。
BL2:是指在代码重定向后在内存中执行的uboot的完整代码。
  作用:初始化本阶段要使用的硬件设备,加载内核,将内核映像和根文件系统映像从FLASH上读到RAM空间中,为内核设置启动参数。

上电启动流程:

  • CPU先读取运行IROM里面固化的启动代码BL0,进行一些基本的初始化,比如初始化PLL和时钟,关闭看门狗初始化堆栈,将flash中BL1的代码加载到IRAM中,跳转到IRAM中BL1的执行地址执行BL1。
  • 在BL1中初始化硬件设备,初始化串口,初始化SDRAM,将flash中BL2的代码加载到SDRAM中,分配堆栈空间,设置好栈跳转到SDRAM中BL2的执行地址执行BL2。
  • 初始化本阶段使用的硬件设备,初始化MMU,检测系统内存映射, 将内核和文件系统从Flash读取到RAM中,为内核设置启动参数,加载内核,挂载文件系统。

note:

  • 1、为什么BL0不初始化SDRAM呢?
    那是因为支持的SDRAM规格是可变的,由固化代码来初始化显得不够灵活,而且固化代码往往代码量比较小,因为越多越容易出BUG。
  • 2、为什么不把BL2也加载到IRAM上运行?
    因为IRAM非常小,一般是96KB,而BL2一般会比96KB大,所以要在BL1中初始化SDRAM,然后将BL2加载到SDRAM中运行。

1.1 内核引导

在这里插入图片描述
当计算机打开电源后,首先是 BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

1.2 运行init初始化进程—— 初始化系统环境

在这里插入图片描述
  init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
  由于init是 第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。
  注意,Debian Linux环境下,内核文件加载以后,就开始运行第一个程序 /sbin/init

1.3 运行级别 —— runlevel

在这里插入图片描述
  许多程序需要开机启动。在 Windows叫做" 服务“(service),在 Linux就叫做” 守护进程“(daemon)。
  init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。 Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别”,确定要运行哪些程序。

  Linux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登录后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

  那么,运行级别有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
上面目录名中的" rc",表示 run command(运行程序),最后的d表示 directory(目录)。下面让我们看看树莓派 /etc/rc3.d 目录中到底指定了哪些程序。

pi@raspberrypi:/etc $ ls -al  /etc/rc3.d
total 16
drwxr-xr-x   2 root root  4096 Nov  9 15:03 .
drwxr-xr-x 134 root root 12288 Nov 18 16:34 ..
lrwxrwxrwx   1 root root    13 Sep 22 01:13 K01fio -> ../init.d/fio
lrwxrwxrwx   1 root root    22 Sep 22 01:07 S01avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx   1 root root    19 Sep 22 01:06 S01bluetooth -> ../init.d/bluetooth
lrwxrwxrwx   1 root root    26 Sep 22 01:07 S01console-setup.sh -> ../init.d/console-setup.sh
lrwxrwxrwx   1 root root    14 Sep 22 01:03 S01cron -> ../init.d/cron
lrwxrwxrwx   1 root root    14 Sep 22 01:13 S01cups -> ../init.d/cups
lrwxrwxrwx   1 root root    22 Sep 22 01:13 S01cups-browsed -> ../init.d/cups-browsed
lrwxrwxrwx   1 root root    14 Sep 22 01:06 S01dbus -> ../init.d/dbus
lrwxrwxrwx   1 root root    16 Sep 22 01:07 S01dhcpcd -> ../init.d/dhcpcd
lrwxrwxrwx   1 root root    16 Nov  9 15:03 S01docker -> ../init.d/docker
lrwxrwxrwx   1 root root    24 Sep 22 01:07 S01dphys-swapfile -> ../init.d/dphys-swapfile
lrwxrwxrwx   1 root root    17 Sep 22 01:09 S01lightdm -> ../init.d/lightdm
lrwxrwxrwx   1 root root    17 Sep 22 01:03 S01paxctld -> ../init.d/paxctld
lrwxrwxrwx   1 root root    18 Sep 22 01:10 S01plymouth -> ../init.d/plymouth
lrwxrwxrwx   1 root root    37 Sep 22 01:13 S01pulseaudio-enable-autospawn -> ../init.d/pulseaudio-enable-autospawn
lrwxrwxrwx   1 root root    22 Sep 22 01:05 S01raspi-config -> ..
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值