一、芯片上电启动流程

芯片上电解复位后执行第一段程序的执行地址指向0x00000000或0xffff0000,这段程序被称为Bootrom loader,该段程序在芯片制造过程中固化到其内部的ROM空间,只读不可修改

1、启动片内bootrom程序后,根据设置的启动模式,决定从什么介质启动,sd-card或emmc;所有的存储设备的bootloader都无法校验通过,则会自动进入MaskRom模式

2、初始化ddr

3、bootloader完整代码到DDR内存中并运行

二、U-BOOT启动流程

RK平台的U-Boot 启动流程如下,仅列出一些重要步骤,参考rk文档

start.s// 汇编环境=> IRQ/FIQ/lowlevel/vbar/errata/cp15/gic => _main=> stack // ARM架构相关的lowlevel初始化// 准备好C环境需要的栈    //【第一阶段】C环境初始化,发起一系列的函数调用=> board_init_f: init_sequence_f[]initf_mallocarch_cpu_init                                    // SoC的lowlevel初始化serial_init                                          //   串口初始化dram_init                                          //   获取ddr容量信息reserve_mmu                                   // 从ddr末尾开始往低地址reserve内存reserve_videoreserve_ubootreserve_mallocreserve_global_datareserve_fdtreserve_stacks  dram_init_banksize                           sysmem_initsetup_reloc                                       // 确定U-Boot自身要reloc的地址// 汇编环境=> relocate_code                                  // 汇编实现U-Boot代码的relocation// 第二阶段:C环境初始化,发起一系列的函数调用=> board_init_r: init_sequence_r[]initr_caches                                       // 使能MMU和I/Dcacheinitr_mallocbidram_initrsysmem_initrinitr_of_live                                        // 初始化of_liveinitr_dm                                             // 初始化dm框架board_init                                          // 平台初始化,最核心部分board_debug_uart_init                  // 串口iomux、clk配置init_kernel_dtb                               // 初始化dtbclks_probe                                     // 初始化系统频率regulators_enable_boot_on           // 初始化系统电源io_domain_init                                //io-domain初始化set_armclk_ratedvfs_init rk_board_init console_init_rboard_late_init                                    // 平台late初始化rockchip_set_ethaddr                     // 设置mac地址rockchip_set_serialno                    // 设置serialno setup_boot_mode                          // 解析reboot XX命令charge_display                               rockchip_show_logo                       // 显示开机logosoc_clk_dump                                 // 打印clk treerk_board_late_initboot_jump_linux                          // uboot 跳转到linux内核run_main_loop                                     // 进入命令行模式,或执行启动命令

uboot的启动过程分为BL1和BL2两个阶段,BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现;BL2阶段主要是对外部设备如网卡、Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现。

1、BL1阶段

uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下:

(1) 指定uboot的入口。在链接脚本uboot.lds中指定uboot的入口为start.S中的_start。

(2)设置异常向量(exception vector)

(3)关闭IRQ、FIQ,设置SVC模式

(4)关闭L1 cache、设置L2 cache、关闭MMU

(5)根据OM引脚确定启动方式

(6)在SoC内部SRAM中设置栈

(7)lowlevel_init(主要初始化系统时钟、SDRAM初始化、串口初始化等)

(8)设置开发板供电锁存

(9)设置SDRAM中的栈

(10)将uboot从SD卡拷贝到SDRAM中

(11)设置并开启MMU

(12)通过对SDRAM整体使用规划,在SDRAM中合适的地方设置栈

(13)清除bss段,远跳转到start_armboot执行,BL1阶段执行完

2、BL2阶段

start_armboot函数位于lib_arm/board.c中,是C语言开始的函数,也是BL2阶段代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,BL2阶段的主要功能如下:

(1)规划uboot的内存使用

(2)遍历调用函数指针数组init_sequence中的初始化函数

(3)初始化uboot的堆管理器mem_malloc_init

(4)初始化SD/MMC控制器mmc_initialize

(5)环境变量重定位env_relocate

(6)将环境变量中网卡地址赋值给全局变量的开发板变量

(7)开发板硬件设备的初始化devices_init

(8)跳转表jumptable_init

(9)控制台初始化console_init_r

(10)网卡芯片初始化eth_initialize

(11)uboot进入主循环main_loop

三、kernel启动流程

启动代码位置:init/main.c

asmlinkage __visible void __init start_kernel(void){char *command_line;char *after_dashes;// 设置任务栈结束魔术数,用于栈溢出检测set_task_stack_end_magic(&init_task);   //设置处理器 IDsmp_setup_processor_id();//debug 初始化debug_objects_early_init();//cgroup 初始化, cgroup 用于控制 Linux 系统资源cgroup_init_early();//关闭当前 CPU 中断local_irq_disable();early_boot_irqs_disabled = true;//CPU 初始化boot_cpu_init();//页地址相关的初始化page_address_init();pr_notice("%s", linux_banner);// 架构相关的初始化,此函数会解析uboot传递进来的参数,读取并解析dtb内容,初始化内存等setup_arch(&command_line);//初始化内存相关mm_init_cpumask(&init_mm);setup_command_line(command_line);//如果只是 SMP(多核 CPU)的话,此函数用于获取 * CPU 核心数量, CPU 数量保存在变量setup_nr_cpu_ids();setup_per_cpu_areas();smp_prepare_boot_cpu();    /* arch-specific boot-cpu hooks */boot_cpu_hotplug_init();build_all_zonelists(NULL);    //建立系统内存页区(zone)链表page_alloc_init();......trap_init();    //完成对系统保留中断向量的初始化mm_init();    //内存管理初始化 ......init_IRQ();    //中断初始化tick_init();    //tick初始化rcu_init_nohz();init_timers();    //初始化定时器hrtimers_init();    softirq_init();    //软中断初始化timekeeping_init();.......early_boot_irqs_disabled = false;local_irq_enable();    //中断使能kmem_cache_init_late();    //slab 初始化, slab 是 Linux 内存分配器console_init();    //console init.......kmemleak_init();    //kmemleak 初始化, kmemleak 用于检查内存泄漏proc_caches_init();uts_ns_init();buffer_init();    //初始化缓冲区.......rest_init();    //初始化第一个init进程prevent_tail_call_optimization();
}

start kernel具体工作:

  1) 调用setup_arch()函数进行与体系结构相关的第一个初始化工作;对不同的体系结构来说该函数有不同的定义。

  2) 创建异常向量表和初始化中断处理函数;

  3) 初始化系统核心进程调度器和时钟中断处理机制;

  4) 初始化串口控制台(console_init);

  5) 创建和初始化系统cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。

  6) 初始化内存管理,检测内存大小及被内核占用的内存情况;

  7) 初始化系统的进程间通信机制(IPC); 当以上所有的初始化工作结束后,start_kernel()函数会调用rest_init()函数来进行最后的初始化,包括创建系统的第一个进程-init进程来结束内核的启动。

8)挂载根文件系统并启动initLinux内核启动的下一过程是启动第一个进程init,但必须以根文件系统为载体,所以在启动init之前,还要挂载根文件系统

  根文件系统至少包括以下目录:

  /etc/:存储重要的配置文件。

  /bin/:存储常用且开机时必须用到的执行文件。

  /sbin/:存储着开机过程中所需的系统执行文件。

  /lib/:存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。

  /dev/:存储设备文件。

  注:五大目录必须存储在根文件系统上,缺一不可。

四、android init进程

init进程是android系统中第一个进程,它完成下面这些事情:

1、设置和挂载文件系统

2、启动和管理属性服务property service

3、解析init.rc脚本,根据解析内容启动系统需要的基础服务

第一阶段:

Android根文件系统的镜像中不存在“/dev”目录,该目录是init进程启动后动态创建的,因此建立Android中设备节点文件的重任,也落在了init进程身上。为此,init进程创建子进程ueventd,并将创建设备节点文件的工作托付给ueventd。

第二阶段:

android的启动流程可以概括如下图

RK Android系统开机启动流程相关推荐

  1. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动 Linux内核启动 Android系统启动,Launcher/app ...

  2. Android系统开机启动流程

    第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./system/bin/servi ...

  3. Android系统的启动流程简要分析

    这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍. 一.Android系统的架构介绍 Android的整 ...

  4. Android Q 开机启动流程

    https://www.it610.com/article/1304931662924124160.htm Android Q 开机启动流程 开机启动概述: step 1: 上电开机 长按power键 ...

  5. 结合源码探讨Android系统的启动流程

    结合源码探讨Android系统的启动流程 由于本人能力有限,所考虑或者疏忽错漏的地方或多或少应该存在.同时,Android从启动过程开始,实际上就涉及多个技术难点和多种通信机制的知识点. 基于上面两个 ...

  6. Android系统 lk启动流程简析

    本篇文章是对初步学习Android系统lk启动流程的一个大致简介.方便掌握lk启动流程的大致框架,具体细节后续再进行更新 1. 前言 需要了解的文件类型: 1)编译LK的链接文件(.ld) 2)汇编文 ...

  7. Linux系统开机启动流程介绍

    一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...

  8. Android系统的启动流程

    1.启动电源以及系统启动 当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行.加载引导程序BootLoader到RAM中,然后执行. 2.引导程序BootLoader 引导程序BootLoad ...

  9. linux开机引导进程是什么,Linux系统开机启动流程介绍

    一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...

  10. android系统开机启动很慢,为什么安卓手机升级系统后,首次启动会比较慢?

    原标题:为什么安卓手机升级系统后,首次启动会比较慢? 点击 很多小伙伴对安卓手机进行系统升级后,可能都会遇到一种情况:手机首次启动的时间好久,首次打开应用的时间也比往常要长. 为什么会出现这种情况? ...

最新文章

  1. 基于openCV的项目实战1:信用卡数字识别
  2. Spring Cloud Gateway之Predict篇
  3. C#_细说Cookie_Json Helper_Cookies封装
  4. wxWidgets:wxEditableListBox类用法
  5. Silverlight学习笔记(九)-----RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】...
  6. 平均年薪60.8万!拿下这个证书,算法岗直接起飞!
  7. 12个很棒的Pandas和NumPy函数,让python数据分析事半功倍
  8. 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc
  9. 复合选择器-子选择器(HTML、CSS)
  10. C语言实现二叉树的各种遍历及求解深度
  11. MPLS virtual private network Spoken-Hub网络实验(华为设备)
  12. 用 maven 命令启动项目和直接用tomcat 启动项目的区别
  13. IntentService简介
  14. 计算机学习路线及java图书参考
  15. python的方向_Python有哪些就业方向
  16. 快速入门nebula graph
  17. 行列式与矩阵的初等变换总结
  18. 跨界融合,共创智能汽车研发新生态(技术大会诚邀您的莅临)
  19. 如何实现app直播源代码,通过HLS进行直播观看
  20. 血泪!pyinstaller打包文件过大的解决方法

热门文章

  1. c# 调用巴斯勒相机 进行图像识别
  2. Basler相机拍照
  3. Http协议详解版本一
  4. IntelliJ IDEA 2020 如何解决Commit: Local Changes Refresh提交Git代码卡住超级慢(已解决)
  5. excel游戏_Excel Jawbreak游戏
  6. editplus java快捷键_常用editplus快捷键大全
  7. linux获取本地ip命令,Shell获取当前主机ip地址
  8. 第三方登录微信登录流程
  9. APP测试面试题总结
  10. 2021年100道最新软件测试面试题,常见面试题及答案汇总