|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 u' D! q. X% J5 C$ V/ E. z; ] T
6 y7 S- o2 W. X4 B) c! Y0 s# v
Linux在ARM平台上的移植
$ ]' b# |- H! D4 [. \0 A- _; l" a. v. x
1. SBC2410硬件平台介绍9 k4 h. p+ @* _5 n+ B8 c
6 v/ ]1 c% |( `5 I% z: C SBC2410硬件平台是具有基于ARM9处理器SBC2410A,可支持ARM—Linux、WindowsCE等操作系统的嵌入式硬件平台。主要硬件资源有一片64 MB SDRAM,一片64 MBNandFlash,一片1 MB Nor Flash,一个串口COM0,一个USB Host A型接口,一个USB Slave B型接口,以及一个标准的JTAG接口等。3 `* N X+ T9 M, o4 p/ J; ?' X1 Z9 X
h- \$ G) T0 _; d( Q: D 2. Linux在ARM平台上的移植准备
4 |9 W6 `5 a% C5 y- V1 x% |5 y% i v0 j0 G2 J6 z" l
首先是要建立交叉编译环境。交叉编译环境是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要包括编译器gCC,二进制工具binutils,目标系统的标准c库glibc和目标系统的Linux内核头文件。宿主机要选好做嵌入式开发的Linux操作系统,配置好网络、NFS服务等。因为目标机没有足够的资源运行开发工具和调试工具,所以要在宿主机上建立交叉编译环境,然后由交叉编译工具生成可执行二进制代码(并不能在宿主机上运行),再下载到目标板上调试和运行。交叉编译标准c环境的生成步骤包括以下四步:
- f8 S0 H+ L5 H8 {. B
. ?# k8 Y9 _1 H. c; T# {- b% I+ } (1)获得binutils、gcc、glibc的源码;
3 N, F" ~0 z! T- {
2 Q$ L: |1 d C! u9 | (2)配置编译binutils,得到汇编器和连接器;
& w4 ?; V6 {. o( l( U& p+ Z$ R# g: b& Y* ^3 S9 `3 k
(3)配置编译gcc源码,生成gcc编译器;8 V( W2 i X2 M; Y0 c0 L
2 S' V: i8 e l
(4)配置glibc编译生成glibc的c库函数。5 C) ?, }1 R- o' y
. l5 e2 M+ j! | 3. 引导程序移植bootloader% [% v; D$ \- K
2 F1 B! K: s/ n
引导程序bootloader是与体系结构紧密相关的部分,是操作系统内核和应用程序运行之前运行的一小段程序,用于完成系统的启动和加载。它类似于PC机中的BIOS程序。bootloade严重依赖于硬件实现,一般在嵌入式系统中建立一个通用的bootloader是不可能的。用户必须自己编写这一小段程序,从而完成硬件设备的初始化,建立内存空间的映射图,将系统的软硬件带到一个合适的状态,为操作系统内核的运行做准备。
( f# `) B& V& L0 t
' L) B! W; R$ o) B0 F& N1 J 通常bootloader移植分为两步:
+ F2 E' G! g" |
" U2 J* u2 |" ` B5 o 第一步常用汇编语言实现依赖于CPU体系结构的代码。主要包括硬件设备初始化;为加载bootloader准备RAM空间;拷贝bootloader到RAM空间中;设置好堆栈。
) K0 d z/ J6 s% z
) \5 L3 Z2 D5 v5 V, W 第二步常用C语言来实现。即:初始化本阶段要使用到的硬件设备;检测系统内存映射(memory map);将kernel映像和根文件系统映像从flash上读到ram空间中;为内核设置启动参数;调用内核。图1所示是bootloader的工作流程图。5 e3 t: H0 n1 e8 C) w: a% j
% M. U7 w' F9 Z4 m( t: j8 e' {
4. 内核移植
, d5 n) x2 A0 {" M1 ^: g4 [1 o; }+ T: i
内核移植首先应当启动操作系统,完成内存管理、任务调度、进程管理、加载驱动程序、网络等功能,然后执行应用程序或等待用户命令。虽然各功能之间存在复杂的调度关系,但由于Linux分层结构的特点,已将其中硬件相关的代码独立了出来,因此,移植过程中只需要改动进程管理、内存管理和设备管理中与硬件相关的那部分代码。* N7 k1 F3 k; Y7 J( o+ e
% `! Z( S9 u; z. m0 R 一般情况下,从官方网站上下载的内核不能直接在硬件平台上运行,而要跟据具体的硬件平台重新裁剪、编译内核,并根据硬件平台特性编写相应的硬件相关的代码,将Linux移植到硬件平台。对内核代码的修改包括以下部分:
4 w3 v3 z" M" x
6 r n5 ~; _; S (1)修改内核目录树根下的Makefile,找到ARCH和CROSS_COMPILE,修改ARCH=arm,CROSS_COMPILE=armlinux,然后设置PATH环境变量,在文件bashrc中添加expor PATH=/usr/LOCal/arm/3.4.4/bin:$PATH,使其可以找到交叉编译工具链,然后重新登陆。0 {1 @9 |$ j& b d) v) w
, a( _1 m: h2 C8 E: o# a) N
(2)设置flash分区,修改arch/arm/machSBC2410/devs.c用以指明分区信息,该文件的内容建立nand flash分区表;修改arch/arm /machSBC2410/machSMDk2410.c文件指定启动时初始化,并在kernel启动时依据对分区的设置进行初始配置。在Linux源文件目录下,执行makemenuconfig命令,配置内核产生config文件,选择处理器类型为SBC2410,选择串口驱动设备,完成后保存config文件。
2 @( I& \+ T0 I2 `/ x7 k
' f3 a4 G* `9 J) e! |+ m W3 ` 在完成内核的裁减之后,执行命令make clean,编译内核之前先把环境给清理干净,也可以用makerealclean或makemrproper来彻底清除相关依赖,保证没有不正确的文件存在,最后将zimage下载到开发板。
2 `, P5 \. ~6 t5 [, d h: E |
|