基于ZLG/BOOT的linux2.6内核移植(s3c2410)

p { margin-bottom: 0.21cm; }a:link { }

                                                                    基于ZLG/BOOTlinux2.6 内核移植(s3c2410)

           基于ZLG/BOOTlinux2.6 内核移植(s3c2410)    ZLG/BOOT 是广州致远arm 实验箱自带的bootloader. 我用的这款实验箱自带的linux 内核还是2.4 版本的, 有点儿老了, 所以想移植个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.nandfllasha:/boot/ 目录下还有两个重要文件zlg_boot.initparam.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 选项中第三行的内容是同一个东西, 在实际中是praram.bin 中的内容把boot option 中的内容覆盖了, 使得boot option 中的内容不起作用. 所以在移植过程中要么修改param.bin, 要么在内核中把param.bin 屏蔽掉, 使得boot option 内容生效, 并修改其内容.
网上大多数介绍inux2.6s3c2410 的移植过程对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.222.6.20 都有这现象), 这可能是由于ZLG/BOOT 已经对nandflsh 分区并写保护了,linux 按自己的分区方式再次对nandflash 进行擦除和分区时就出现了这种情况. 解决办法是,linux 内核源码中取消对nandflash 设备的启动. 网上说出现Bad eraseblock 是因为没去掉没去掉nandECC 校验, 我试着修改过此处, 并没好使, 所以真正原因应该就是我上面说的那样.


2,linux
启动并输出大量输出信息后会卡在这条信息上;Warning: unable to open an initial console. 这是由于原来2.4 内核及其使用的文件系统都支持devfs, 而现在的2.6 内核不支持. 解决办法有两个, 一是换一个不支持devfs 的根文件系统( 具体制作方法下节会讲), 二是修改内核代码及配置使之支持devfs.

下面我说一下详细步骤: 一些通用步骤援引了网友原文, 关键步骤我会具体说明.
我在移植时用的是linux-2.6.24 内核


平台信息: 目标板           s3c2410
主机操作系统     redhat9.0
交叉编译器      arm-linux-gcc3.4.1
1.  
Linux2.6.24 内核源码放到工作目录下,并解压。
#tar xzvf linux2.6.24.tar.gz
# cd linux2.6.24

    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/plat-s3c24xx/common-smdk.c 文件,(linux2.6.20 或以前的版本中的目录为arch/arm/mach-s3c2410/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 运行之前能自动挂载/devdevfs 文件系统。可以编辑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 开发板的默认配置(我的开发板默认配置文件是arch/arm/ZY2410x )到linux2.6 内核根目录下,以简化配置过程。
# cp arch/arm/ZY2410x .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=ttySAC0,115200N8) Default kernel command

string : 很重要, 具体功能上面有解释.

Userspace binary formats --->
< > Kernel support for a.out and ECOFF binaries
(去除该选项,a.outECOFF 是两种可执行文件的格式,

ARMLinux 下一般都用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
,因为这是给每页大于1024BNAND 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 的工作机制, 问题才迎刃而解.
过程中得到了网上不少资料的帮助, 尤其是下面这个链接, 在此表示感谢!  

移植好linux2.6 之后,在开发板上ping 不通,ifconfig 也没用,应该是网卡驱动的问题,所以接下来移植网卡驱动(我的开发板网卡是DM9000 ),下一篇进行介绍我的DM9000 移植过错。
参考文献 : http://hi.baidu.com/operationsystem/blog/item/b96528c63e6db6d4d0006060.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值