linux内核移植

Linux内核移植

实验目的:熟悉linux内核移植过程

实验过程:

一、 下载源代码

下载地址:http://www.kernel.org/pub/software/scm/git/ 安装Git工具: (1)、命令安装: #: yum –y git

(2)、源码安装Git工具:

#: tar zxvf git-1.6.6.tar.gz #: cd git-1.6.6

#: ./configure –prefix=/usr/local #: make

#: make install 使用git命令下载内核源码:

Wgethttp://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz

二、 解压2.6.32.2并证实环境与代码是否正确

由于内核的启动过程是,运行完bootlader之后linux内核要进行初始化,其初始化的内容有初始化存储器分区,初始化外围一些硬件的状态,初始化网卡接口等,然后加载驱动程序,目前开发板使用的bootlader是由友善之臂提供的supervivi。

1、解压内核

假如源码放在/root/kernel目录下,执行以下命令: #cd /root/kernel #tar jxvf linux-2.6.32.2.tar.bz

转到解压后的目录: #cd linux-2.6.32.2

2、指定交叉编译变量

首先,我们的目标平台为ARM的平台修改当前目录下的Makefile #vim Makefile 将如下内容: export KBUILD_BUILDHOST :=$(SUBARCH) ARCH ?=$(SUBARCH) CROSS_COMOILE ?=

改为:

export KBUILD_BUILDHOST :=$(SUBARCH) ARCH ?=arm

CROSS_COMPILE ?=arm-linux-

其中,ARCH是指定目标平台为arm,CROSS_COMPILE是指定交叉编译器,这里指定是系统默认的交叉编译器,如果使用其它的,则要把编译器的全路径在这里写出。如图所示:

首先要测试一下linux的编译是否能够正确通过。 执行:

#make mini2440_defconfig(使用缺省内核配置文件,mini2440_defconfig是由一位外国人士为mini2440所写的缺省文件)

#make zImage(生成的镜像在arch/arm/boot目录下) 然后将编译生成的镜像下载到开发板上看能否运行。 如下图所示:

Copy linux kernel from 0x00060000 to 0x30008000, size = 0x00500000 ... done

zImage magic = 0x016f2818

Setup linux parameters at 0x30000100

linux command line is: \console=ttySAC0\MACH_TYPE = 1999

NOW, Booting Linux...... Uncompressing

Linux.....................................................................................................

............................ done, booting the kernel.

Linux version 2.6.32.2 (root@tom) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #3 Sun Mar 28 17:10:56 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177 CPU: VIVT data cache, VIVT instruction cache Machine: FriendlyARM Mini2440 development board

ATAG_INITRD is deprecated; please update your bootloader. Memory policy: ECC disabled, Data cache writeback CPU S3C2440A (id 0x32440001)

S3C24XX Clocks, (c) 2004 Simtec Electronics

S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

PID hash table entries: 256 (order: -2, 1024 bytes)

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 64MB = 64MB total

Memory: 60596KB available (3588K code, 417K data, 132K init, 0K highmem) SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1

这即证明了编译器能够使用,而且证明源代码没问题。

三、 建立自己的目标平台

现在使用的是linux内核本身的目标平台配置,它对应于SMDK2440。现在我们参考SMDK2440加入自己的开发平台,我们使用的是mini2440,因此取名为MINI2440。

需要说明的是,Linux-2.6.32.2 本身已经包含了mini2440 的支持,这样就出现了重名。

那怎么办呢?在此我们依然使用MINI2440 这个名称,只不过在后面的移植步骤中,把原始内

核自带的mini2440 代码部分直接删除就可以了,以免和我们自己移植的混淆了。

首先,很关键的一点,内核在启动时,是通过bootloader传入的机器码(MACH_TYPE)

确定应启动哪种目标平台的,友善之臂已经为mini2440 申请了自己的机器码为1999,它位于

linux-2.6.32.2/arch/arm/tools/mach_types文件中,如图:

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4