RK Android系统开机启动流程
一、芯片上电启动流程
芯片上电解复位后执行第一段程序的执行地址指向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系统开机启动流程相关推荐
- Android系统开机启动流程及init进程浅析
Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动 Linux内核启动 Android系统启动,Launcher/app ...
- Android系统开机启动流程
第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./system/bin/servi ...
- Android系统的启动流程简要分析
这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍. 一.Android系统的架构介绍 Android的整 ...
- Android Q 开机启动流程
https://www.it610.com/article/1304931662924124160.htm Android Q 开机启动流程 开机启动概述: step 1: 上电开机 长按power键 ...
- 结合源码探讨Android系统的启动流程
结合源码探讨Android系统的启动流程 由于本人能力有限,所考虑或者疏忽错漏的地方或多或少应该存在.同时,Android从启动过程开始,实际上就涉及多个技术难点和多种通信机制的知识点. 基于上面两个 ...
- Android系统 lk启动流程简析
本篇文章是对初步学习Android系统lk启动流程的一个大致简介.方便掌握lk启动流程的大致框架,具体细节后续再进行更新 1. 前言 需要了解的文件类型: 1)编译LK的链接文件(.ld) 2)汇编文 ...
- Linux系统开机启动流程介绍
一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...
- Android系统的启动流程
1.启动电源以及系统启动 当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行.加载引导程序BootLoader到RAM中,然后执行. 2.引导程序BootLoader 引导程序BootLoad ...
- linux开机引导进程是什么,Linux系统开机启动流程介绍
一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...
- android系统开机启动很慢,为什么安卓手机升级系统后,首次启动会比较慢?
原标题:为什么安卓手机升级系统后,首次启动会比较慢? 点击 很多小伙伴对安卓手机进行系统升级后,可能都会遇到一种情况:手机首次启动的时间好久,首次打开应用的时间也比往常要长. 为什么会出现这种情况? ...
最新文章
- 基于openCV的项目实战1:信用卡数字识别
- Spring Cloud Gateway之Predict篇
- C#_细说Cookie_Json Helper_Cookies封装
- wxWidgets:wxEditableListBox类用法
- Silverlight学习笔记(九)-----RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】...
- 平均年薪60.8万!拿下这个证书,算法岗直接起飞!
- 12个很棒的Pandas和NumPy函数,让python数据分析事半功倍
- 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc
- 复合选择器-子选择器(HTML、CSS)
- C语言实现二叉树的各种遍历及求解深度
- MPLS virtual private network Spoken-Hub网络实验(华为设备)
- 用 maven 命令启动项目和直接用tomcat 启动项目的区别
- IntentService简介
- 计算机学习路线及java图书参考
- python的方向_Python有哪些就业方向
- 快速入门nebula graph
- 行列式与矩阵的初等变换总结
- 跨界融合,共创智能汽车研发新生态(技术大会诚邀您的莅临)
- 如何实现app直播源代码,通过HLS进行直播观看
- 血泪!pyinstaller打包文件过大的解决方法