实验四Linux内核移植实验_linux内核移植实验

2020-02-28 其他范文 下载本文

实验四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一下就会出现如下图所示。

⑶ 配置内核界面,不用做任何更改,在主菜单里选择退出,并选“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 #include #include #include #include

再次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 ?=arm CROSS_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 #include #include #include #include

再次make zImage以下就不会出现错误了。

执行命令:#make menuconfig 要使用yaffs2文件系统,需要先配置nand flash驱动支持,在Device drivers菜单中选择MTD选项如图,并按回车进入

找到NAND Device Support选项并进入

选择Nand Flash驱动支持

返回到内核配置主菜单,并找到File systems选项进入

找到如图选项Miscellaneous filesystems并进入

找到YAFFS2支持选项,如图选择

然后返回即可。

再次进入/home/linux2.6.32.2/linux-2.6.32.2/arch/arm/boot根目录中查看Image映像文件:

zImage文件测试结果如下图所示:

3、移植 DM9000网卡驱动 3.1 设备资源初始化

找到linux-2.6.32.2/drivers/net/dm9000.c,头文件处添加2410相关的配置定义。如下图所示:

再填充该平台设备的资源设置,以便和DM9000网卡驱动接口配合起来,如下

3.2 调整DM9000所用的位宽寄存器

打开linux-2.6.32.2/ drivers/net/dm9000.c,添加如下图所示内容:

3.3 关于MAC地址

static int __devinit dm9000_probe(struct platform_device *pdev)函数中可以看出:

实际上到此为止DM9000就已经移植结束了。3.4 配置内核加入DM9000,并编译运行测试

在内核根目录下执行#make menuconfig 命令,开始在内核中配置网卡驱动,依次选择如下菜单项Device Drivers--->Network device support---> Ethernet(10 or 100Mbit)--->

然后执行:#make zImage 命令

最后生成arch/arm/boot/zImage文件。

使用”k”命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行ifconfig命令可以看到如图所示:

四、实验小结

本次实验做的是关于Linux内核移植,实验的内容多,比较复杂。在理论课中我们对Linux内核的组成部分有了了解,以及对其移植到ARM平台的流程有了一定的认识。在具体实战的时候,我们参考SMDK2440的代码,然后搭建自己的mini2440平台,最终生成内核文件zImage,,在移植Nand Flash驱动时出现了问题,最后在老师的引导下解决了问题,最后对DM9000网卡进行驱动,由于时间的原因我们对Linux内核移植只做了一部分,我们会在以后的时间进行完善。总之,实验过程中比较坎坷。

五、思考题

1、Linux内核有哪些模块组成?

答:Linux内核由进程管理、内存管理、文件系统、网络接口、进程间通信、设备驱动等模块组成。

2、简述生成内核映像文件zImage的步骤。答:(1)使用命令make config进入命令行

(2)使用make meunconfig命令进行内核裁剪

(3)使用make clean命令,清理之前生成的目标文件

(4)使用make dep命令,编译变量的依赖关系

(5)使用make zImage命令生成内核映像文件

《实验四Linux内核移植实验.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
实验四Linux内核移植实验
点击下载文档
相关专题 linux内核移植实验 内核 Linux linux内核移植实验 内核 Linux
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文