开发板:FL2440      内核:linux-3.0       交叉编译器:buildroot-2012.08

1. Linux内核基础知识

1.1 关于Linux版本

查看内核版本

[zzx@localhost ~]$ uname -a
Linux localhost.localdomain 2.6.32-573.el6.i686 #1 SMP Thu Jul 23 12:37:35 UTC 2015 i686 i686 i386 GNU/Linux
[zzx@localhost ~]$ cat /proc/version 
Linux version 2.6.32-573.el6.i686 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) ) #1 SMP Thu Jul 23 12:37:35 UTC 2015
[zzx@localhost ~]$  

Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.28.1内核的Makefile中:

VERSION       =  2

PATCHLEVEL   =  6

SUBLEVEL     =  28

EXTRAVERSION =  .1

其中的“VERSION”和”PATCHLEVEL”组成主版本号,比如2.42.52.6等。稳定的版本号用偶数表示(用偶数版最好),开发中的测试版本用奇数表示。但是3.0以后均为稳定版。“SUBLEVEL”成为版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRAVERSION”扩展版本号,不分奇偶,顺序递增。

1.2 Linux内核启动过程概述

一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,根文件系统,应用程序。 

其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核,linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(rootfs),根文件系统是linux系统的核心组成部分,也是内核启动时首先要挂载的就是跟文件系统。它可以作为linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用程序需要的库,保证了人和内核的信息交互。应用程序则是嵌入式系统所要达到的目标,一切的准备都是为了实现程序。若是没有应用程序,硬件上再精良嵌入式系统都没有实用意义。

Bootloader在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行它最根本的功能就是为了启动linux内核.为了启动内核Bootloader要依次完成初始化RAM初始化串口检测处理器类型设置Linux启动参数调用LInux内核镜像。

文件系统Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。


2. Linux内核移植与启动

2.1下载并解压缩linux-3.0.tar.bz2 源代码
首先到 Linux Kernel 官方网站www.kernel.org下载得到 linux-3.0.tar.bz2 文件,把它放到一个你有权限读写的文件夹,运行下面命令解压缩并进入解压后的文件夹:
[zzx@localhost kernel]$ tar -xjf linux-3.0.tar.bz2

[zzx@localhost kernel]$ cd linux-3.0


2.2配置内核编译参数

1. 首先修改顶层目录的Makefile文件

这里首要便是交叉编译器环境变量和选择开发平台类型,然后要将生成的zimage拷贝到当前目录,再手动增加mkimage工具来自动把Zimage生成可执行的.bin文件。
注:内核编译之后会生成两个文件。一个Image,一个Zimage。image为内核映像文件,而Zimage为内核映像压缩文件。

修改arch和交叉编译器

[zzx@localhost linux-3.0]$ vim Makefile  

  


添加zimage

 560     cp arch/arm/boot/zImage . -f
 561     mkimage -A arm -O linux -T kernel -C none -a 30008040 -n "Linux Kernel" -     d zImage linuxrom-s3c2440.bin
 562     rm -f zImage 

 

其中的mkimage在编译好的u-boot下的tools中,找到mkimage,将其放到/bin目录下。


修改distclean添加删除linuxrom-s3c2440.bin

 

下面是补丁文件。



2.  修改晶振频率

因为自己使用的是FL2440的开发板,根据datesheet可知晶振频率为12M。所以下一步修改晶振频率。

[zzx@localhost linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c 



3. 修改驱动的串口

[zzx@localhost linux-3.0]$ vim drivers/tty/serial/samsung.c 

  


4.参考mini2440.config文件作为我们的默认.config文件

 


5.切换vt100模式,make menuconfig进行内核配置

打开文本窗口来选定即将要编译的模块,保存后会将里面的信息保存到同时生成的.config配置文件中。
另外:make menuconfig时出来的文本窗口中的信息是通过读取在内核源代码目录下的Kconfig文件来配置的。根据Makefile文件来编译,而Makefile文件中的变量则通过.config来进行赋值操作。仅仅在Kconfig中添加选项。

[zzx@localhost linux-3.0]$ vt100

[zzx@localhost linux-3.0]$ make menuconfig

  

 

 


6.修改MACHINE ID设备编号

同样因为是做FL2440的内核,所以我们选择三星SMDK2440这个开发板。因为我U-boot中使用的machine id为1999,而且自己使用的是s3c2440这个板子。将mini2440和和s3c2440的machineID对调。

[zzx@localhost linux-3.0]$ vim arch/arm/tools/mach-types

 

 


7.对nandflash进行分区

[zzx@localhost linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c 


板子上nandflash是256M,给bootloader1M用来启动,内核15M以及48M的根文件系统。其他自由分配。

注意:此时若要再进行分区就要选择相应的文件系统。Nandflash比较常用的有yaffs2,ubifs,cramfs以及initramfs等等。


8.make

[zzx@localhost linux-3.0]$ make

。。。。。。。


此时能编译成功,但是生成的linux-s3c2440.bin文件依旧不能在板子上跑起来。因为内核启动时首先挂载的是根文件系统,我们还没有做根文件系统给予内核支持,系统会出错而退出启动。根文件系统制作请看接下来的几篇。

OK!!!


Logo

更多推荐