Linux内核移植与启动
1. Linux内核基础知识
在动手进行linux内核移植之前,我们有必要对linux内核进行一定的了解。
Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.28.1内核的Makefile中:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 28
EXTRAVERSION = .1
Linux内核启动过程概述
一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,文件系统,应用程序。
其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核,linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(rootfs),根文件系统是linux系统的核心组成部分,也是内核启动时首先要挂载的就是跟文件系统。它可以作为linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用程序需要的库,保证了人和内核的信息交互。应用程序则是嵌入式系统所要达到的目标,一切的准备都是为了实现程序。若是没有应用程序,硬件上再精良嵌入式系统都没有实用意义。
Bootloader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。它最根本的功能就是为了启动linux内核.为了启动内核Bootloader要依次完成初始化RAM—初始化串口—检测处理器类型—设置Linux启动参数—调用LInux内核镜像。
2.Linux 内核移植与启动
2.1
交叉编译器:buildroot-2012.08 Bootloader:U-boot-2010.09
Target borad:FL2440
2.2 下载并解压缩linux-3.0.tar.bz2源代码
首先到 Linux Kernel 官方网站www.kernel.org下载得到linux-3.0-rc4.tar.bz2文件,把它放到一个你有权限读写的文件夹,运行下面命令解压缩并进入解压后的文件夹:
2.3配置内核编译参数
1.首先修改顶层目录的Makefile文件
$ vim Makefile
这里首要便是交叉编译器环境变量和选择开发平台类型
然后要将生成的zimage拷贝到当前目录,再手动增加mkimage工具来自动把Zimage生成可执行的.bin文。
注:内核编译之后会生成两个文件。一个Image,一个Zimage。image为内核映像文件,而Zimage为内核映像压缩文件。Image大约为4M,而Zimage不到2M。
2. 修改晶振频率
因为我使用的是FL2440的开发板,根据datesheet可知晶振频率为12M。所以下一步修改晶振频率。
$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
3. 修改驱动的串口
$ vim drivers/tty/serial/samsung.c
参考mini2440的.config文件作为我们的默认.config文件。改好之后再
$ Make menuconfig
打开文本窗口来选定即将要编译的模块,保存后会将里面的信息保存到同时生成的.config配置文件中。
另外:make menuconfig时出来的文本窗口中的信息是通过读取在内核源代码目录下的Kconfig文件来配置的。根据Makefile文件来编译,而Makefile文件中的变量则通过.config来进行赋值操作。仅仅在Kconfig中添加选项。
4.修改MACHINE ID设备编号
OK,同样因为是做FL2440的内核,所以我们选择三星SMDK2440这个开发板。
因为我U-boot中使用的machine id为1999,而且我使用的是s3c2440这个板子。
将mini2440和和s3c2440的machineID对调。
$ vim arch/arm/tools/mach-types
配置就绪之后
Make
显示成功
此时已经会生成一个linux-s3c2440.bin的可执行二进制文件。
5.对nandflash进行分区
$ vim arch/arm/plat-s3c24xx/common-smdk.c
注意:此时若要再进行分区就要选择相应的文件系统。Nandflash比较常用的有yaffs2,ubifs,cramfs以及initramfs等等。
$ make
此时能编译成功,但是生成的linux-s3c2440.bin文件依旧不能在板子上跑起来。
因为内核启动时首先挂载的是根文件系统,我们还没有做根文件系统给予内核支持,系统会出错而退出启动。
烧录结果如下:
****内核移植过程中遇到的问题:
1.SecureCRT界面开启得太小,导致要编译的模块的文本窗口无法打开。
解决:-直接最大化。
2.交叉编译器的路径没有设置正确。
解决:
将 /opt/buildroot-2012.08.packet/buildroot-2012.08/arm920t/usr/bin/arm-linux-
改为 /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-(自己交叉编译器的路径)
3.
解决:要将生成的zimage拷贝到当前目录,再手动增加mkimage工具来自动把Zimage生成可执行的.bin文。
4.TFTP路径没有设置正确,路径中包含中文名文件夹,导致无法下载到开发板。
解决:创建一个英文名文件夹,将linuxrom-s3c2440.bin文件放入,设置好TFTP路径。
5.linuxrom-s3c2440.bin没法转出。
解决:将 mkimage -A arm -O linux -T kernel -C none -a 30008040 -n "Linux Kernel" -d zImage\ linuxrom-s3c2440.bin去掉“/”
即改为mkimage -A arm -O linux -T kernel -C none -a 30008040 -n "Linux Kernel" -d zImage linuxrom-s3c2440.bin