以想移植个2.6上去.由于bootloder的移植烧写也是比较麻烦的事,我决定暂时先用实验箱自带的ZLG/BOOT.
实际上使用ZLG/BOOT对于linux内核的移植是比较方便的, ZLG/BOOT的运行机制是这样的:启动或复位硬件
后,ZLG/BOOT会识别nandflsh上创建的启动目录,你只需通过ftp将内核及根文件系统下载到nandflash中指定目录
(a:\boot\)下.当你选择启动linux的选项,ZLG/BOOT会自动将该目录下的linux内核(zImag)和根文件系(init.img)以及
linux启动参数文件(param.bin)拷贝到内存(ram)中指定的地址,并跳至linux内核的首地址,开始运行linux.
在nandfllash的a:\boot\目录下还有两个重要文件zlg_boot.init和param.bin,其中前者是可编辑文件,可以通过
ftp上传到主机(PC)后进行编辑修改,之后再下载下去,但是后者是二进制文件,只能通过实验箱带的专门修改此文件的
软件来修改关键参数.实际移植过程中也可以不对这两个文件进行修改,但有几需要注意的地方:
1,在zlg_boot.init中有这样一段代码:
load 0x30008000 a:\boot\zImag
load 0x30000100 a:\boot\parm.bin
load 0x33C00000 a:\boot\init.img
其作用是分别将liunx内核,启动参数以及根文件系统等几个文件拷贝到ram中相应的地址.这里要注意的是这几
个文件名要与你实际下载到a:\boot\目录下的文件名一致,否则加载时找不到相应文件.所以,移植过程中如果不修改
zlg_boot.init文件,那么你在制作内核和根文件系统是一定要把文件名定义为zImag(一般没什么问题)和init.img.
2,在parm.bin中可修改的参数如下:
root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8
以上是实验箱原来自带的参数,实际这些都是linux命令,用于告诉linux以下信息:根文件系统的加载地址,读写
属性,文件系统大小和控制台信息--tty0表示控制台为液晶显示器,ttyS0表示控制台为串口0.这里要注意的是在2.6内
核中对串口0的表示已改成ttySAC0,如果移植2.6内核后继续使用ttyS0,当linux启动时就会在串口终端出现:
Uncompressing Linux.................................................................. done,
booting .
然后就卡住不动了.
其实上面param.bin中这些命令和linux内核配置时boot option选项中第三行的内容是同一个东西,在实际中是
raram.bin中的内容把boot option中的内容覆盖了,使得boot option中的内容不起作用.所以在移植过程中要么修改
param.bin,要么在内核中把param.bin屏蔽掉,使得boot option内容生效,并修改其内容.
网上大多数介绍inux2.6到s3c2410的移植过程对2.6内核主要有两个方面的修改,一是修改nandflash分区以及
nand设备启动代码的添加,用来引导内核以及根文件系统的启动;二是添加支持devfs的相关内容(有关devfs引用网友原
话"linux-2.6.13以前的内核都支持devfs,而之后版本的内核就把devfs这块去掉了,虽然还能在内核源码中找到对应
的源码,你也可以把它加进内核"). 根据上面的介绍,基于ZLG/BOOT的内核移植可以简单到不用对2.6内核源码做任何
修改,配置编译后用ZLG/BOOT直接下载到指定目录替代原来的2.4内核,就可启动运行2.6内核了.不用对nanflsh进行分
区设置是因为,内核及根文件系统的引导完全由ZLG/BOOT完成. 当然为了能在串口终端正常显示linux启动信息,要对
启动参数文件parm.bin进行修改,即把ttyS0改为ttySAC0.这样linux内核虽然启动了,但是还存在两个小小的问题:
1,启动信息中会出现4000多行的:Bad eraseblock at 0x*****,(2.6.22和2.6.20都有这现象),这可能是由于
ZLG/BOOT已经对nandflsh分区并写保护了,当linux按自己的分区方式再次对nandflash进行擦除和分区时就出现了这种
情况.解决办法是,在linux内核源码中取消对nandflash设备的启动.网上说出现Bad eraseblock是因为没去掉没去掉
nand的ECC校验,我试着修改过此处,并没好使,所以真正原因应该就是我上面说的那样.
2,linux启动并输出大量输出信息后会卡在这条信息上;Warning: unable to open an initial console.这是由
于原来2.4内核及其使用的文件系统都支持devfs,而现在的2.6内核不支持.解决办法有两个,一是换一个不支持devfs的
根文件系统(具体制作方法下节会讲),二是修改内核代码及配置使之支持devfs.
下面我说一下详细步骤:一些通用步骤援引了网友原文,关键步骤我会具体说明.
我在移植时用的是linux-2.6.22内核,写这篇文档时我又移植了linux-2.6.20来做验证,下面将以linux-2.6.20为
例
平台信息:目标板 s3c2410
主机操作系统 redhat9.0
交叉编译器 arm-linux-gcc3.4.1
1. 将Linux2.6.20内核源码放到工作目录下,并解压。
#tar xzvf linux2.6.20.tar.gz
# cd linux2.6.20
2. 修改内核源码根目录下的Makefile文件
#vi Makefile
......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# -e s/arm.*/arm/ -e s/sa110/arm/ \
# -e s/s390x/s390/ -e s/parisc64/parisc/ \
# -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
ARCH = arm
CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-
注:CROSS_COMPILE根据自己所使用的交叉编译器路径设置。
**3.修改arch/arm/mach-s3c2410/common-smdk.c文件,(linux2.6.22.19中的目录为arch/arm/plat-
s3c24xx/common-smdk.c)
找到如下数据结构
static struct platform_device __initdata *smdk_devs[] = {
// &s3c_device_nand, 注释掉或者删除该语句,防止linux对nandflash进行二次擦除和分区.
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};
4. 如果想使你的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。可以
编辑fs/Kconfig:
在menu "Pseudo filesystems"下面添加如下代码:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y //注意t和y之间有个空格,否则执行make menuconfig 后会报错:unexpected T_WORD
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
注意:如果继续使用原来2.4版本用的ramdisk文件系统,这第4步是必需得做的,同时还需要在文件系统dev/目录
下创建如下节点:
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1
如果重新制作新ramdisk根文件系统,根文件系统可以和linux2.6内核同时都配置devfs或者都不配置,都
不配置时第4步就不用添加了.(建议重新制作,具体方法见下节内容)
5.解决串口0控制台信息输出问题,(否则会在此卡
住:UncompressingLinux.................................................................. done, booting
.) 以下两种方法可以任选其一:
(1)修改内核代码屏蔽掉ZLG/BOOT中设定启动参数,并在配置时修改启动参数.具体如下:
将内核中的arch/arm/kernel/setup.c文件中的parse_tag_cmdline()函数中的内容注释掉,禁止使用默认
的参数。这样你只要在配置内核Boot options选项的时候正确配置 也就OK了。而且还很方便,哪天你要引导2.4内核
了就可以直接把console=ttySAC0,115200改为console=ttyS0,115200就可以了,很是简单!
(2)修该ZLG/BOOT中的param.bin文件将其中的ttyS0改为ttySAC0,要通过专门修改param.bin的软件来完成.(
建议用方法(1))
6. 配置内核
在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
以下是在 s3c2410_defconfig 基础上要配置的选项
General setup --->
[*] Configure standard kernel features (for small systems) --->
选上这项,否则文件系统中的一些选项不会出现
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410 留下这项就够了,其他全部“N”掉
“N”掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 里的所有选项,都是和
2410无关的选项。
Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成 (root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8) Default kernel command
string 注:很重要,具体功能上面有解释.
Userspace binary formats --->
< > Kernel support for a.out and ECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,
在ARM-Linux下一般都用ELF,所以这两种基本用不上。)
Networking --->
Networking options --->
<*> Packet socket
[*] Packet socket: mmapped IO
Device Drivers --->
“N”掉 Parallel port support ---> 里的所有选项。
Plug and Play support --->里的所有选项一定要“N”掉,不然编译会出错!!!!!!!!
Network device support --->
Ethernet (10 or 100Mbit) --->
“N”掉< > DM9000 support和< > Generic Media Independent Interface device support
“N”掉 [ ] Ethernet (1000 Mbit) --->和 [ ] Ethernet (10000 Mbit) --->
Wireless LAN --->
[*] Wireless LAN (pre-802.11)
[*] Wireless LAN (IEEE 802.11)
USB Network Adapters --->
<*> Multi-purpose USB Networking Framework
<*> MMC/SD card support --->
Real Time Clock --->
“N”掉 [ ] Set system time from RTC on startup and resume
#接下来做的是针对文件系统的设置,我实验时目标箱上要挂的根文件系统是ramdisk故做如下配置
File systems -->
<*> Second extended fs support #注意ext2相关的几项一定要选上,因为我们使用的ramdisk文件系统属于
ext2格式,很多移植后使用cramfs的内核在配置时都把这项N掉了.
[*] Ext2 extended attributes
[*] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels
[*] Ext2 execute in place support
<*> Ext3 journalling file system support
<*> Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Filesystem in Userspace support
Pseudo filesystems -->
[*] Virtual memory file system support (former shm fs)
<*> Userspace-driven configuration filesystem (EXPERIMENTAL)
Miscellaneous filesystems -->
<*> YAFFS2 file system support
“N”掉[ ]Autoselect yaffs2 format 和
[ ]Cache short names in RAM ,因为这是给每页大于1024B的NAND Flash设计的
<*> Journalling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] JFFS2 summary support (EXPERIMENTAL)
[ ] JFFS2 XATTR support (EXPERIMENTAL)
[*] Advanced compression options for JFFS2
[*] JFFS2 ZLIB compression support
[*] JFFS2 RTIME compression support
[*] JFFS2 RUBIN compression support
JFFS2 default compression mode (priority) --->
Network File Systems -->
<*> NFS file system support
--以下最好选上,因为在挂载NFS时可能出现protocol不支持的情况--
[*]Provide NFSv3 client support
[*]Provide client support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 client support (EXPERIMENTAL)
[*] Allow direct I/O on NFS files
-------------------------------------------------------------------------
<*> NFS server support
[*] Provide NFSv3 server support
[*]Provide server support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 server support (EXPERIMENTAL)
--- Provide NFS server over TCP support
[*] Root file system on NFS
保存退出,产生.config文件。
7.编译内核
#make zImage
从本质上讲,基于ZLG/BOOT完成一个最简单的linux2.6内核移植只需把内核代码注释掉两句话,然而我在做的过程
中是饶了很大圈子的,刚上来也是按网上的说明对nandflash进行分区,而ZLG/BOOT源码中对nandflash的分区部分只给
了二进制文件,所以二者一直对应不起来,遇到了很多网上常见的问题,然而他们的解决方法却很多不适合我,直到弄清
了ZLG/BOOT的工作机制,问题才迎刃而解.
过程中得到了网上不少资料的帮助,尤其是下面这个链接,在此表示感谢!
参考文献 : http://hi.baidu.com/operationsystem/blog/item/b96528c63e6db6d4d0006060.html