实验四Linux内核移植实验_linux内核移植实验
实验四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命令生成内核映像文件