msm8909+android5.1启动流程(2)---lk源代码目录及入口

msm8909+android5.1启动流程(2)---lk源代码目录及入口

 

1.     Lk概述

LK是(L)ittle(K)ernel的缩写。

高通平台android普遍采用LK作为其bootloader,LK是一个开源项目。但是,LK只是整个系统的引导部分,所以它不是独立存在。LK是一个功能及其强大的bootloader,但现在只支持arm和x86平台。

LK的一个显著的特点就是它实现了一个简单的线程机制(thread),和对高通处理器的深度定制和使用。

 

2.     源代码目录

app               //主函数启动app执行的目录,第一个app在app/aboot/aboot.c中

arch              //体系代码包含x86和arm

dev               //设备目录,包含显示器,键盘,net,usb等设备的初始化代码

include        //头文件

kernel          //kernel/main.c主函数以及kernel/thread.c线程函数

lib                //库文件

make          //编译规则

platform    //不同平台代码mdmxxx,msmxxx,apqxxx,qsdxxx,还有共享的目录msm_shared

project        //整个工程的编译规则

target          //通用init.c,具体目标板的初始化(主要为板子设备资源init.c代码中),编译规则代码(一级s810.mk二级hdc8094.mk)

 

3.     Lk入口

bootable\bootloader\lk\arch\arm\rule.mk文件下相关部分:

# potentially generated files that shouldbe cleaned out with clean make rule
GENERATED += \
       $(BUILDDIR)/system-onesegment.ld\
       $(BUILDDIR)/system-twosegment.ld
 
# rules for generating the linker scripts
…
$(BUILDDIR)/system-onesegment.ld:$(LOCAL_DIR)/system-onesegment.ld
       @echogenerating $@
       @$(MKDIR)
       $(NOECHO)sed"s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/" < $< > $@
$(BUILDDIR)/system-twosegment.ld:$(LOCAL_DIR)/system-twosegment.ld
       @echogenerating $@
       @$(MKDIR)
       $(NOECHO)sed"s/%ROMBASE%/$(ROMBASE)/;s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/"< $< > $@

接着看\bootable\bootloader\lk\arch\arm\system-onesegment.ld文件

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
 
ENTRY(_start)

system-onesegment.ld连接文件中 ENTRY(_start0指定 LK 从_start 函数开始,_start 在 lk/arch/arm/crt0.S中 。crt0.S 主要做一些基本的 CPU 的初始化再通过 bl kmain ;跳转到 C 代码中。

kmain 在lk/kernel/main.c 中

 

 

你可能感兴趣的:(msm8909+android5.1启动流程(2)---lk源代码目录及入口)