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 中