当前位置:文档之家› 实验四Linux内核移植实验

实验四Linux内核移植实验

合肥学院嵌入式系统设计实验报告(2013- 2014第二学期)专业:实验项目:实验四 Linux内核移植实验实验时间: 2014 年 5 月 12实验成员:_____指导老师:***电子信息与电气工程系2014年4月制一、实验目的1、熟悉嵌入式Linux的内核相关代码分布情况。

2、掌握Linux内核移植过程。

3、学会编译和测试Linux内核。

二、实验内容本实验了解Linux2.6.32代码结构,基于S3C2440处理器,完成Linux2.6.32内核移植,并完成编译和在目标开发板上测试通过。

三、实验步骤1、使用光盘自带源码默认配置Linux内核⑴在光盘linux文件夹中找到linux-2.6.32.2-mini2440.tar.gz源码文件。

输入命令:#tar –jxvf linux-2.6.32.2-mini2440-20110413.tar对其进行解压。

⑵执行以下命令来使用缺省配置文件config_x35输入命令#cp config_mini2440_x35 .config;(注意:x35后面有个空格,然后有个“.”开头的 config )然后执行“make menuconfig”命令,但是会出现出现缺少ncurses libraries的错误,如下图所示:解决办法:输入sudo apt-get install libncurses5-dev 命令进行在线安装ncurses libraries服务。

安装好之后在make menuconfig一下就会出现如下图所示。

⑶配置内核界面,不用做任何更改,在主菜单里选择<Exit>退出,并选“Yes”保存设置返回到刚命令行界面,生成相应配置的头文件。

编译内核:#make clean#make zImage在执行#make zImage命令时会出现如下错误:错误:arch/arm/mach-s3c2440/mach-mini2440.c:156: error: unknown field 'sets' specified in initializer通过网上查找资料于是在自己的mach-mini2440.c中加入#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/nand_ecc.h>#include <linux/mtd/partitions.h>#include <plat/nand.h>再次make zImage以下就不会出现错误了。

编译结束后,会在arch/arm/boot目录下生成linux内核映象文件:zImage⑷进行zImage文件测试首先Nor Flash启动开发板,在超级终端中选择功能号[k],用dnw下载刚刚配置的zImage镜像文件。

然后再把开发板Nand Flash启动,x35触屏会出现小企鹅的图案,同时超级终端也会出现如下图所示画面:2、官网下载源码移植2.1 移植前准备⑴官网下载内核Linux-2.6.32.tar.bz2。

新建一个工作目录s3c2440,将内核源码包拷贝至/home/linux2.6.32.2工作目录下。

⑵下载yaffs2代码官网下载cvs-root.tar.gz压缩包,拷贝至/home/linux2.6.32.2工作目录下。

2.2 建立自己的目标平台⑴解压内核源码进入linux2.6.32.2目录下执行解压命令:#tar –jxvf linux-2.6.32.tar.bz2 ,将内核源码进行解压。

⑵进入内核目录,修改makefile,并对内核进行默认配置进行修改183行,修改:ARCH ?=armCROSS_COMPILE ?=arm-linux-⑶给内核打yaffs2文件系统的补丁执行#tar -zxvf cvs-root.tar.ga解压命令,对cvs-root.tar.gz压缩包进行解压。

①修改内核fs/Kconfig在内核fs/Kconfig文件中添加两行内容:#Patched by YAFFS Source”fs/yaffs2/Kconfig”②修改内核fs/Makefile在Makefile中添加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/③在内核fs/目录下创建yaffs2目录将yaffs2源码目录下的Makefile.kernel文件复制为内核fs/yaffs2/Makefile;将yaffs2源码目录下的Kconfig文件复制到内核fs/yaffs2目录下;将yaffs2源码目录下的*.c 和*.h文件复制到内核fs/yaffs2目录下。

④修改机器码由于Bootloader传递给Linux内核的机器号为1999,为与Bootloader传递参数一致,修改Linux内核的机器号。

友善之臂已经为 mini2440 申请了自己的机器码为 1999,它位于linux-2.6.32.2/arch/arm/tools/mach_types文件中。

⑤修改时钟源频率在 mach-mini2440.c(删除原来的mach-mini2440.c,通过复制mach-smdk2440.c 得到的新的mach-mini2440.c)的第 160 行static void __init smdk2440_map_io(void)函数中,把其中的 16934400(代表原 SMDK2440 目标板上的晶振是 16.9344MHz)改为 mini2440 开发板上实际使用的 12000000(代表 mini2440 开发板上的晶振 12MHz)。

找到MACHINE_START(S3C2440, "SMDK2440") ,修改为:MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")⑥从 SMDK2440 到 MINI2440因为我们要制作自己的 mini2440 平台体系,因此把 mach-mini2440.c 中所有的smdk2440 字样改为 mini2440。

除此之外,还有一个地方需要改动,在 mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用该函数。

2.3 定制内核配置⑴使用 Linux 官方自带的 mini2440 配置,在 Linux 源代码根目录下执行#make mini2440_defconfig命令:⑵移植 Nand 驱动并更改分区信息进入到/home/linux2.6.32.2/linux-2.6.32.2/arch/arm/mach-s3c2440文件夹中执行: # gedit mach-mini2440.c命令:在 mach-mini2440.c 中加入以下代码:static struct mtd_partition mini2440_default_nand_part[] = {[0] = {.name = "supervivi",.size = 0x00040000,.offset = 0,},[1] = {.name = "param",.offset = 0x00040000,.size = 0x00020000,},[2] = {.name = "Kernel", ; 对应/dev/mtdblock2.offset = 0x00060000,.size = 0x00500000,},[3] = {.name = "root",.offset = 0x00560000,.size = 1024 * 1024 * 1024,},[4] = {.name = "nand",;.offset = 0x00000000,.size = 1024 * 1024 * 1024,}};static struct s3c2410_nand_set mini2440_nand_sets[] = {[0] = {.name = "NAND",.nr_chips = 1,.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),.partitions = mini2440_default_nand_part,},};static struct s3c2410_platform_nand mini2440_nand_info = {.tacls = 20,.twrph0 = 60,.twrph1 = 20,.nr_sets = ARRAY_SIZE(mini2440_nand_sets),.sets = mini2440_nand_sets,.ignore_unset_ecc = 1,};如下图所示:还需要把 nand flash 设备注册到系统中,static struct platform_device *mini2440_devices[] __initdata = { &s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,&s3c_device_nand, ;把nand flash设备添加到开发板的设备列表结构};⑶配置和编译带 YAFFS2 支持的内核在执行#make zImage命令时会出现如下错误:错误:arch/arm/mach-s3c2440/mach-mini2440.c:156: error: unknown field 'sets' specified in initializer通过网上查找资料于是在自己的mach-mini2440.c中加入#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/nand_ecc.h>#include <linux/mtd/partitions.h>#include <plat/nand.h>再次make zImage以下就不会出现错误了。

执行命令:#make menuconfig要使用yaffs2文件系统,需要先配置nand flash驱动支持,在Device drivers菜单中选择MTD选项如图,并按回车进入找到NAND Device Support选项并进入选择Nand Flash驱动支持返回到内核配置主菜单,并找到File systems选项进入找到如图选项Miscellaneous filesystems并进入找到YAFFS2支持选项,如图选择然后<Exit>返回即可。

相关主题