mini2440 移植linux2.6.30.10 及yaffs2文件系统 2011-03-12 10:17:18

时间:2021-07-27 14:51:07

研究了四天linux内核移植和文件系统制作,总算移植成功,在这里和大家分享一下,我是一个初学者,有不对的地方,请大家指点。
参考网友的资料:
http://blog.chinaunix.net/u3/104564/sho ... 91186.html
http://www.ourdev.cn/bbs/bbs_content.js ... bs_id=1032
http://blog.sina.com.cn/s/blog_5fe42fc90100cp4z.html

一,准备工作
1,内核版本:2.6.30.10
busybox 1.13.0 
编译器:arm-linux-3.4.1
文件系统:yaffs2
平台:mini2440 
2,移植linux
1)Linux 2.6.30.10的下载地址:
http://www.kernel.org/
 

2)yaffs2文件系统的下载地址:
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
 
点击Download GNU tarball,下载cvs-root.tar.gz
3)busybox的下载地址:
http://www.busybox.net/downloads/
 
我用的是busybox-1.13.0.tar.bz2 
4)下载mkyaffs2image
http://www.arm9.net/download-mkyaffs2image.asp
 



二、移植内核
1,解压内核源码包
# tar jxvf linux-2.6.30.10.tar.bz2 -C /opt/FriendlyARM/mini2440/

2,进入内核目录
# cd /opt/FriendlyARM/mini2440/linux-2.6.30.10

3,修改顶层Makefile
# gedit Makefile
在193行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-

4,修改机器码
# gedit arch/arm/tools/mach-types
在379行
s3c2440 ARCH_S3C2440 S3C2440 362
修改为
s3c2440 ARCH_S3C2440 S3C2440 782
与supervivi传入的机器码参数一致即可!

5,修改时钟频率
# gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在160行

static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
//s3c24xx_init_clocks(16934400); //注释这句,加入下一句
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

6,修改Nand Flash分区
# gedit arch/arm/plat-s3c24xx/common-smdk.c
在109行

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "supervivi",
.size = 0x00030000,
.offset = 0,
},
[1] = {
.name = "Kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};

7,加入对yaffs2文件系统的支持

1,解压yaffs2文件系统源码包
# tar zxvf cvs-root.tar.gz -C /opt/FriendlyARM/mini2440/

2,进入yaffs2源码目录
# cd /opt/FriendlyARM/mini2440/cvs/yaffs2

3,打补丁
# ./patch-ker.sh c ../../linux-2.6.30.10
Updating ../../linux-2.6.30.10/fs/Kconfig
Updating ../../linux-2.6.30.10/fs/Makefile

8,配置内核
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
1,机器类型只选以下三项:

System Type ---> S3C2410 Machines ---> [*] SMDK2410/A9M2410
S3C2440 Machines ---> [*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module

2,我用得编译器是3.4.1没有配置Kernel Feature


3,File systems ---> [*] Miscellaneous filesystems ---> <*> YAFFS2 file system support

4,Boot options-
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 

9,重新编译内核
# make zImage
注意:如果是重新编译内核需要遵守以下步骤:
1、make dep
make dep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一 个模块/子程序)。而你在做 make config的时候将一个设备的驱动 由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A....如果程序数量非常多, 你是很难手工完全做好此工作的。make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要make dep。
2、make clean
清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。
3、make zImage
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩 形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空 间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。
编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。


三,制作yaffs2文件系统

1,修改并配置BusyBox
解压busybox
#tar jxvf busybox-1.13.0.tar.bz2 –C /opt/FriendlyARM/mini2440/
2,然后进到源码中,修改Makefile 文件
ARCH ? =arm
CROSS_COMPILE ?=arm-linux-
3,#make menuconfig,进入配置单:
然后配置如下:(没有列出的选项,可以采用默认,也可以根据自己的需要添加。)
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
Busybox Library Tuning --->
(
[*] vi-style line editing commands
[*] Fancy shell prompts
Linux Module Utilities --->
(/lib/modules) Default directory containing modules
(modules.dep) Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
--- Options common to multiple modutils
4,编译并安装BusyBox
在命令行输入:make;make install,编译结束后会在busybox-1.13.0根目录下面生成一个名为“_install”的目录。
完成busybox 的编译之后,我们就可以进行文件系统的构建了。
5,在“/opt/ FriendlyARM/mini2440/”目录下面建立一个“root_yaff2”的目录,复制刚刚编译出来的_install下的“bin”
目 录、“sbin”目录、“usr”目录和“linuxrc”到“root_2.6.25fs”目录下,然后新建“dev”、“etc”、“home”、 “lib”、“mnt”、“opt”、“proc”、“root”、“sys”、“tmp”、“var”和“web”目录,并在原有的“usr”目录下面 新建一个“lib”目录。
6,添加内容
1)“dev”目录
下面的内容在内核挂载完毕文件系统后,系统会使用mdev 自动建立。
不过mdev 是调用init 进程来启动的,在使用mdev 构建“dev”目录前,init 进程需要用到“/dev/console”和“/dev/null”这两个设备文件,所以,我们需要在制作文件系统时静态创建这两个设备文件,方法如下:
#mknod console c 5 1
#mknod null c 1 3
如果不创建这两个设备文件,在文件系统启动时会出现错误信息.大概是不能初始化控制台。

2)“etc”目录
用来存放系统的配置文件。
在“etc”目录下面有如下常用的文件:
fstab:指明需要挂载的文件系统;
group:用户组;
inittab:init 进程的配置文件;
passwd:密码文件;
profile:用户环境配置文件;
mdev.conf:因为2.6.18 版本开始linux 放弃使用devfs 而采用udev(mdev 是udev 的简化版本),这里的
mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我采用了为空;
resolv.conf:存放DNS 信息的文件,访问外网时需要DNS 的信息。
常用的目录有:
init.d 目录:启动文件目录,该目录下面有个“rcS”的文件,里面存放了系统启动时配置以及自启动加载
的进程等;
sysconfig 目录:在我们的文件系统里面,该目录下面存放了名为“HOSTNAME”的文件,该文件内容为:
tianchunlong,这句话就是我们在文件系统里面看到那个“[root@ tianchunlong /]” rc.d 目录:在我们的文件系统里面用来存放一些自启动所要调用的脚步等;
boa 目录:我们的文件系统特有的目录,用来存放web 服务器的配置脚本。
下面分别列出“etc”下面各个文件的内容。
【fstab】:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
【group】:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:tianchunlong
501:x:501:tianchunlong
【inittab】:参考busybox 源码下面的“examples/inittab”文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
注 意:上面红色部分在busybox 的参考文件中是ttySAC0,而在s3c24xx 系列芯片的串口驱动里面我们用了s3c2410_serial 做为设备名(在内核源码的“drivers/serial/s3c2410.c”文件的949 行),然后我们又是用的串口0 作为控制台的,所以这里我们使用s3c2410_serial0。
【passwd】:
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
tianchunlong:$1$8GIZx6d9$L2ctqdXbYDzkbxNURpE4z/:502:502:Linux User,,,:/home/tianchunlong:/bin/sh

【profile】:
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
【mdev.conf】:
暂时空
【resolv.conf】:
nameserver 202.96.128.166
【init.d/rcS】:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
注意:在上面红色部分是关于mdev 的使用,请参考busybox 的“docs/mdev.txt”文件。
最后还要改变它的属性使它能够执行。chmod +x etc/init.d/rcS
【rc.d/init.d/httpd】:
#!/bin/sh
base=boa
# See how we were called.
case "$1" in
start)
/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
【boa/boa.conf】:

【sysconfig/HOSTNAME】:
tianchunlong

3)“home”目录
存放用户文件的目录,在这里,我建立了一个名为“tianchunlong”的目录,前面的passwd 文里面有个用户名就是对应tianchunlong这个目录
“lib”目录
常用的库文件,获取库文件的方法:
#cp -f -a /usr/local/arm/3.4.5/arm-linux/lib/*so* ./lib 
这里拷贝了常用的库文件,如果需要特殊的库,需要再从相应的位置复制过来。
4)“mnt”目录
我们一般用来挂载的U 盘之类的外设,这里建立两个目录“udisk”和“sd”,分别用来挂载U 盘和SD卡。
5)“opt”目录

6)“proc”目录
提供一些目录和虚拟文件系统。
7)“root”目录
超级用户的目录。
8)“sys”目录
9)“tmp”目录
存放临时文件的目录。
10)“var”目录
存放临时文件的目录。
11)“web”目录
存放web 服务器的相关文件的目录,建议直接从以前制做好的文件系统中拷贝过来。
12)“lib”目录
讲mini2440的根文件系统root_qtopia.tar.gz解压讲lib目录下的所以库函数拷贝到lib目录下。

7,到此,文件系统的框架就基本搭好了,然后把它做出yaffs 文件系统格式的镜像就可以使用了。使用如下命令制作:
#mkyaffs2image root_yaffs2/ root_yaffs2.img
烧写到开发板即可进入控制台。