Linux内核转移实训报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“linux实训报告图文”。
广州航海高等专科学校
嵌入式实验3——Linux内核移植
实验日期:2010.11.16
专业班号:计算机081学号: 22姓名:陈徭
指导教师:封斌老师
一、实验目的:完成linux2.6.14内核向S3C2410实验箱的移植
二、实验内容 :
1、准备实验环境,包括:安装VMware station、安装VMware Tools,准备源码文件。
2、修改环境变量,对flash进行分区,将分区信息加入内核源码,指定启动时的设备初始化,3、下载Yaffs2,解压Yaffs2并将其加入Linux内核,修改Makefile,4、配置内核产生.config文件,然后编译:make zImage,5、修改、创建根文件系统,6、安装内核和根文件系统,启动系统。
三、实验环境:
PC+linux操作系统(第1~5步),S3c2410实验箱(第6步)。
四、实验步骤
1.准备工作
◆在PC机D盘建立目录“vmshare”,将上述文件拷贝到“vmshare”目录下,然后安装vmware虚拟机和vmware tools
◆启动linux后,配置虚拟机与winxp的文件共享,PC机上的共享目录是d盘下的vmshare目录,linux下的共享目录是/mnt/hgfs/vmshare
2.修改内核源码,修改环境变量,将分区信息加入内核源码,指定启动时的设备初始化
1)展开源码
在本步骤中,展开源码,并设置环境变量
mkdir/home/armlinux//创建工作目录
cp/mnt/hgfs/vmshare/*/home/armlinux //把所有源码拷贝到工作目录下 cd///回到根目录
tar-jxvf/home/armlinux/arm-linux-gcc-3.4.1.tar.bz2//展开交叉编译工具 cd/home/armlinux//回到工作目录下
tar-jxvflinux-2.6.14.tar.bz2//展开内核源码
2)建立环境变量、修改Makefile
将交叉编译工具路径和内核源码路径加入环境变量。修改/root/.bash_profile文件,添加以下内容:
exportKERNEL=/home/armlinux/linux-2.6.14
exportPATH=/usr/local/arm/3.4.1/bin:$PATH
添加完成后存盘退出,执行命令:
source/root/.bash_profile
echo$KERNEL//判断KERNEL变量是否成功定义,应该显示/home/armlinux/linux-2.6.1
4进入内核源码目录下$KERNEL,修改对应的Makefile文件:
cd$KERNEL
viMakefile
找到ARCH与CROSS_COMPILE,修改为
ARCH = arm//注意arm后不能有空格
//注意arm-linux-后不能有空格//说明内核源码目录 //说明交叉编译工具路径 CROSS_COMPILE = arm-linux-
保存退出
3)修改内核源码
◆将分区信息加入内核源码(修改arch/arm/mach-s3c2410/devs.c)
#vi$KERNEL/arch/arm/mach-s3c2410/devs.c 添加头文件:
#include
#include
#include 添加分区结构,其中name: 代表分区名字,size: 代表flash分区大小(单位:字节),offset: 代表flash分区的起始地址(相对于0x0的偏移),目标板计划分5个区,分别存放bootloader, bootloader param,kernel, rootfs和yaffs。
staticstructmtd_partitionpartition_info[]={
};
name: “loader”,//分区名字,任意 size: 0x00020000,//分区大小 offset: 0x0,//分区的起始地址,相对于0x0的偏移 },{ name: “param”, size: 0x00010000, offset: 0x00020000, },{ name: “kernel”, size: 0x00200000, offset: 0x00030000, },{ name: “rootfs”, size: 0x00300000, offset: 0x00230000, },{ name: “yaffs”, size: 0x03A00000, offset: 0x00530000, }
加入Nand Flash分区,nr_partitions:指明partition_info中定义的分区数目,partitions:分区信息表
structs3c2410_nand_setnandset={
};
加入对Nand Flash芯片的支持:tacls, twrph0, twrph1的意思见S3C2410手册sets: 支持的分区集,nr_set:分区集的个数
struct s3c2410_platform_nand superlpplatform={
//NAND Flash芯片支持
//参数意义可参考S3C2410手册
tacls: 0,nr_partitions: 5,//分区数量 partitions: partition_info,//分区表
};
twrph1: 0, sets: &nandset, nr_sets: 1,修改s3c_device_nand,以加入NAND Flash驱动:name: 设备名称,id: 有效设备编号,如果只有唯一的一个设备为1,有多个设备从0开始计数。num_resource: 有几个寄存器区,resource: 寄存器区数组首地址,dev: 支持的Nand Flash设备
structplatform_devices3c_device_nand = {
数
};
◆指定启动时的设备初始化
kernel启动时依据我们对分区的设置进行初始配置,修改.resource = s3c_nand_resource,//寄存器区的首地址 //添加如下信息,表示NAND Flash设备.dev={.platform_data=&superlpplatform }.name = “s3c2410-nand”,//设备名称.id =-1, //有效设备编号,-1表示唯一设备.num_resources = ARRAY_SIZE(s3c_nand_resource),//寄存器区的个arch/arm/mach-s3c2410/mach-smdk2410.c文件,修改smdk2410_devices[]结构,指明初始化时包括在前面所设置的flash分区信息
vi$KERNEL/arch/arm/mach-s3c2410/mach-smdk2410.c
找到结构platform_device,在结构定义的最后加入一个条项&s3c_device_nand: static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, //添加如下信息 &s3c_device_nand,};
◆禁止Flash ECC效验
内核通过vivi把数据写入NAND Flash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NAND Flash控制器产生的,所以在此必须禁用NAND Flash ECC。修改drivers/mtd/nand/s3c2410.c 文件:
vi$KERNEL/drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip->eccmode = NAND_ECC_NONE;
保存,退出。
3.安装Yaffs2,解压Yaffs2并将其加入Linux内核,修改Makefile ◆解压Yaffs2并将其加入Linux内核
cd/home/armlinux
tar-zxvfyaffs2.tar.gz
cdyaffs2
shpatch-ker.shc$KERNEL
1.配置内核产生.config文件,然后编译系统内核
为了使内核支持devfs,启动时在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs/Kconfig文件
cd$KERNEL
vifs/Kconfig
找到menu “Pseudo filesystems”,添加以下语句:
config DEVFS_FS
config DEVFS_MOUNT
bool “Automatically mount at boot” defaulty depends on DEVFS_FS bool “/dev file system support(OBSOLETE)” defaulty
4.配置内核产生.config 文件,然后编译系统内核
cparch/arm/configs/smdk2410_defconfig.config
makemenuconfig
在smdk2410_defconfig基础上,所增删的内核配置项如下:
Loadable module support >
[*] Enable loadable module support [*] Automatic kernel module loading
System Type >
Boot options >Default kernel command string:
noinitrd root=/dev/mtdblock3init=/linuxrc console=ttySAC0,115200
#说明:mtdblock3代表的第4个flash分区,它是rootfs,而console=ttySAC0,115200使kernel#启动期间的信息全部输出到串口0上,2.6内核对于串口的命名改为ttySAC0,但这不影#响用户空间的串口编程。用户空间的串口编程针对的仍是/dev/ttyS0等
Floating point emulation >
#接下来要做的是对内核MTD子系统的设置
Device Drivers >
Memory Technology Devices(MTD)--->[*] MTD partitioning support#支持MTD分区,这样我们在前面设置的分[*] NWFPE math emulation [*] S3C2410 DMA support 区才有意义
Character devices--= >[*] Nonstandardserial port support [*] S3C2410 RTC Driver NAND Flash Device Drivers---> NAND Device Support NAND Flash support for S3C2410/S3C2440 SoC[*] Command line partition table parsing#支持从命令行设置flash分区信息,灵活 RAM/ROM/Flash chip drivers---> Detect flash chips by Common Flash Interface(CFI)probe Detect nonCFI AMD/JEDECcompatible flash chips Support for Intel/Sharp flash chips Support for AMD/Fujitsu flash chips Support for ROM chips in bus mapping
#接下来做的是针对文件系统的设置,目标板上的根文件系统是cramfs,所以做如下配置 File systems ->
Second extended fs support#去除对ext2的支持 Pseudo filesystems >[*] /proc file system support [*] Virtual memory file system support(former shm fs)[*] /dev file system support(OBSOLETE)[*] Automatically mount at boot(NEW)#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了 Compreed ROM file system support(cramfs)#支持cramfs NFS file system support Miscellaneous filesystems > Network File Systems >
保存退出,产生.config文件.◆编译内核
makezImage
编译成功后,在$KERNEL/arch/arm/boot目录下,生成zImage文件。
5.烧录系统
(未完成)
五、实验感想:
本次实训中遇到了不少问题,但我都及时请教老师或同学而得到了解决。解决问题后的那种感觉真的很好。以前总觉得Linux系统内核的移植是非常陌生、非常高深的,通过实训后发现只要肯花心思去搞懂,任何东西都会变得容易很多的。