Little Kernel分析与移植
2012-10-27王正元孟庆民张艳彬
杨 浩 王正元 孟庆民 张艳彬
1.南京邮电大学电子科学与工程学院,江苏 南京 210003
2.南京邮电大学通信与信息工程学院,江苏 南京 210003
Little Kernel分析与移植
杨 浩1王正元1孟庆民2张艳彬2
1.南京邮电大学电子科学与工程学院,江苏 南京 210003
2.南京邮电大学通信与信息工程学院,江苏 南京 210003
Little Kernel(lk)是被Android系统接受进入源码树的Bootloader程序,并被多款智能手机和平板电脑所采用。论文介绍了lk的主要功能,分析了lk的源码结构,并在此基础上详细说明了lk移植的方法和过程。将移植后的lk进行编译并下载至TCC8801 DEMO板上,lk能够正常启动并引导linux内核。
Little Kernel;嵌入式系统;移植;TCC8801
little kernel; embedded system; porting; tCC8801
引言
近年来,ARM Cortex-A8高性能处理器被广泛应用于智能手机、平板电脑等设备。而这些嵌入式系统启动时需要bootloader程序,所谓bootloader是在操作系统内核运行前执行的一小段程序。这段程序负责完成对硬件设备的基本初始化,创建某些必要信息通过相关机制传递给内核,引导和加载内核,并最终调用操作系统内核[1-
2]。
目前,常见的bootloader有[3]:Redboot、U-Boot、Blob、vivi等。其中以U-Boot应用最为广泛,支持的操作系统和处理器芯片最多。Little Kernel 是最近几年才推出的一种Bootloader,并被Android系统所接受进入Android源码树,大量应用于智能手机与平板电脑。Little Lernel除了支持高通、TI、三星、Telechips等公司的芯片组,目前还具备如下功能[4]:
a、支持多种NAND Flash启动;
b、提供USB驱动,支持开发过程中通过USB升级image文件;
c、提供键盘驱动,支持开发人员进入fastboot模式升级image文件;
d、提供显示驱动用于调试和点亮显示屏;
e、支持多线程。
Little Kernel不仅代码量小、运行耗时少,更为重要的特点是代码可维护性好。在Little Kernel架构中将处理器芯片归为平台,对于使用同一芯片的不同目标板则对于不同的目标[4]。
1 Little Kernel 源码分析
为了进行移植,必须仔细分析Little Kernel(下面简称lk)的源码目录结构,据此理解lk的系统架构,只有这样移植工作才会有的放矢、事半功倍。
lk的目录结构如表1所示。
表1
从表1可以看出,lk的架构清晰、功能简捷。
lk启动流程如下[5]:
Step1:从lk链接文件lkarcharm system-onesegment.ld可知,入口点在_ start。而_start在汇编语言文件crt0.S中,从_start跳转到reset,开始进行CPU早期初始化、建立堆栈等常规的初始化任务,然后跳到kmain()函数执行。
Step2:进入kmain()函数后,首先执行thread_init_early()函数。Lk支持多线程,因此需要该函数进行相关初始化,例如,初始化线程队列,初始化线程列表,创建运行线程等。
Step3:执行arch_early_init()函数。主要初始化MMU(内存管理单元)、ARM NEON通用SIMD(单指令多数据)引擎。
Step4:执行platform_early_init()函数。如前所述,lk将每种具体型号的ARM处理器归为一个平台。platform_early_ init()函数对具体型号的处理器进行初始化,包括设置时钟、设置中断向量、初始化定时器/串口/I2C总线控制器等。
Step5:执行target_early_init()、call_constructor()、heap_init()、thread_ init()、dpc_init()、timer_init()函数,而target_early_init()没有具体实现。
Step6:执行thread_resume(thread_ create(“bootstrap2”,&bootstr ap2, NULL,DEFAULT_PRIORITY,DEFAULT_STACK_SIZE)),即进入引导第二阶段,对架构、平台、目标板进行具体初始化,并装载、引导内核程序。
2 Little Kernel移植
从lk的源码目录和架构组织思想可知,lk将不同体系架构处理器相关的文件放在lkarch目录下,目前主要支持ARM处理器,以后会逐步增加更多的处理器。而对于同一体系架构处理器,不同厂家或者不同系列处理器又归属在不同的平台之下,将某类处理器共用的代码放在lkplatform目录下。而对于采用特定处理器设计的目标板,其相关代码则放在lk arget下。同时在lkproject目录下为相应目标板编写顶层规则文件用于编译lk。
基于上述思想及对lk启动流程的分析,为某个目标板(简称board_xxx)进行Little Kernel移植时可以遵循以下步骤:
a、在lk源码目录中lk arget下新建子目录board_xxx,在父其目录下找到与board_xxx采用相同处理器电路板(简称board_orig)的代码,将board_orig的所有文件拷贝至目录lk argetoard_xxx之下,以board_orig的代码为基础进行修改。
b、在lkproject目录下为board_xxx建立顶层规则文件board_xxx.mk,向该文件添加目标板的名称、调试开关设置。
c、修改lk argetoard_xxx目录下的文件,这些文件包括编译规则文件rules.mk,头文件ddr.h,C文件atags.c、gpio.c、init_clock.c、init_memory.c、init.c。
规则文件rules.mk中必须指明:采用的平台、内存基地址、内存大小、目标板硬件版本号、SDRAM控制器的类型、处理器型号、SDRAM芯片型号、显示器型号、标签列表的地址、内核的地址、RAMDISK的地址等。移植时只要修改目标板硬件版本号,其他基本不用修改。
头文件ddr.h定义一些参数用于配置SDRAM,主要包括:物理SDRAM片数、逻辑SDRAM片数、最大速度、页面大小、突发长度等等相关参数。倘若目标板上采用的SDRAM在头文件ddr.h没有定义,则在头文件增加该款SDRAM的参数定义,否则不用修改ddr.h。
文件atags.c用于操作标签列表,而标签列表用于向内核传递引导参数。移植时重点修改文件中的内存信息、目标板的版本号。
文件gpio.c用于对目标板上处理器的通用输入/输出端口进行配置。lk启动阶段需要配置的端口不多,而大量的端口配置留待内核启动以后再进行配置。lk需要配置的端口主要包括串行口、I2C总线接口、按键接口和相关的控制接口。
文件init_clock.c用于对处理器的时钟进行初始化,一般不需要修改。
文件init_memory.c中相关函数根据规则文件rules.mk中指明SDRAM芯片型号,查找头文件ddr.h中定义的参数,根据这些参数对处理器的SDRAM控制器进行初始化、配置参数,保证处理器能够正确读写SDRAM。
文件init.c中的主要函数是target_ init(),该函数用于对目标板初始化,包括对键盘初始化、修改NAND Flash中的信息等。
3 编译与测试
lk移植后需要进行编译并下载到目标板上测试,验证移植后的lk能否正确引导linux内核。本文的移植工作在基于TCC8801处理器的目标板上进行,TCC8801是Telechips公司生产的一款ARM Cortex-A8处理器,目标板采用7英寸显示屏,型号为AT070TN93,内存采用DDR3,型号MT41J128M8JP-15E。编译服务器采用浪潮塔式服务器NP3060,操作系统采用Ubuntu11.04-Server-64bit。编译lk及测试过程如下所述:
Step1:搭建编译环境
a、安装必须的底层包,例如flex、bison、curl等工具软件。
b、安装Java环境JDK,要求安装Jdk1.6版本,并设置环境变量。
c、安装工具repo和git。
d、利用repo工具下载android2.3-gingerbread源码。
e、 将开发板board_xxx相关代码与android2.3-gingerbread源码整合。
Step2:编译lk
a、初始化编译环境,使用命令source build/envsetup.sh。
b、进入lk目录,将移植过的lk文件拷贝至lk目录下相应子目录。
c、从键盘输入编译命令make board_ xxx编译lk并生成lk.rom文件。
d、进入linux目录,编译linux内核,并生成zImage文件。
Step3:下载
a、准备PC端烧录环境。Telechips公司提供相应的烧写程序FWDN及驱动vtcdrv,在PC机上安装驱动程序vtcdrv,并验证PC与开发板可连接。
b、拨动TCC8801DEMO 板上的启动方式设置开关,使TCC8801处于USB启动方式。
c、打开FWDN软件,将lk.rom及zImage写入相应NAND Flash分区。
Step4:测试
a、拨动TCC8801DEMO 板上的启动方式设置开关,使TCC8801处于NAND Flash启动方式。
b、加电启动DEMO板,观察LCD能否正常点亮并显示logo图标。
DEMO板加电后,lk引导 kernel过程中向串口输出的信息如下:
以上信息反映出lk.rom能够引导内核,且LCD正确显示logo图标,说明按照本文移植方法生成的lk.rom是可用的。
4 结语
Little Kernel是一种小型的bootloader程序,代码量小,便于移植与维护,启动速度快,多用于手机和平板电脑。本文通过对Little Kernel的源码分析,给出具体的移植过程。测试结果表明移植过程和方法是正确的,能够正确引导Linux内核。
[1]刘刚,赵建川.Linux系统移植[M].清华大学出版社, 2011.
[2]杨红涛等.嵌入式Linux系统实用开发[M].电子工业出版社, 2010.
[3][EB/OL] http://baike.baidu.com/ view/1223454.htm.
[4][EB/OL] https://www.codeaurora. org/2010/03/02/little-kernel-based-android-Bootloader.
[5][EB/OL] http://blog.csdn.net/hankhanti/article/ details/6133570.
Analysis and Porting of Little Kernel
Yang Hao1, Wang Zhenyuan1, Meng Qingming2, Zhang Yanbin2
1.ElectroniSc ciencea nd EngineerinNg,a njingU niversityo f Po ts and TelecommunicatJioiannsg, suN anjingC, hina;
2.Communication and Information Engineering, Nanojfi nPgo sUtn ainvder Tseitlye communications, Jiangsu Nanjing, China
The Little Kernel(lk)i s a Bootloadepr rogra m acceptedi nto the sourcet ree of Androids ystem. It is adoptebd y a variety of smart phoneas nd tablet PCs. In the paper, lk’s main functio ns are describeda, nd the structure of its sourc e codes is analyzed. The methoda nd process of portingo f lk are also describeAd.f ter compilinlkg and downloadtinog TCC8801 DEMO target board, the linux kernel can be started up correctly.
TP311.54
A
10.3969/j.issn.1001-8972.2012.22.035
江苏省高校自然科学研究项目(09KJB510015)
杨浩(1969-),男,讲师,博士,主要研究方向为图像处理、嵌入式系统设计。