一、LK简介
Lk的主要功能:
1、初始化硬件模块,比如时钟,中断,UART,USB,LCD,PMIC,eMMC等。打开MMU,使能I/D-cache,加速lk执行,显示logo、充电相关。
2、从emmc的boot分区取出boot.img解压,将根文件系统(ramdisk)、zImage 加载到DRAM;
3、解析dtb,写入到DRAM指定区域;
4、关闭MMU、irq / fiq,关闭I/D-cache, 拉起 kernel;
二、详细流程分析
1、crt0.S
在system-onesegment.ld中有定义ENTRY(_start),跳转到crt0.S中的_start执行reset,它的主要功能是初始化cpu,设置 irq, fiq, abort, undefined,system/user堆栈, 设置管理模式。然后通过“bl kmain”跳转到main.c中执行。
2、main.c
void kmain(void) { /* 早期初始化线程池的上下文,包括运行队列、线程链表的建立等, lk架构支持多线程,但是此阶段只有一个cpu处于online,所以也只有一条代码执行路径. */ Thread_init_early(); /* 架构初始化,包括DRAM,MMU初始化使能,使能协处理器, preloader运行在ISRAM,属于物理地址,而lk运行在DRAM,可以选择开启MMU或者关闭,开启MMU可以加速lk的加载过程. */ Arch_early_init(); /* 平台硬件早期初始化,包括irq、timer,wdt,uart,led,pmic,i2c,gpio等, 初始化平台硬件,建立lk基本运行环境。 */ platform_early_init(); // 目前为空方法 Target_early_init(); //初始化构造函数 Call_constructors(); //内核堆链表上下文初始化等 |