博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

Embeded Linux

本博客文章全部摘自网络,所以没有写转载字样,如果侵犯了您的权利,请告知!
fglswh.cublog.cn


将linux-2.6.4内核移植到S3C2410

1. 构建起环境

    要使用内核,首先要编译内核。如果不选择合适的内核和编译器,就会出现错误。典型的就是如下的错误:

EG:

CC arch/arm/kernel/asm-offsets.s

cc1: error : invalid option 'apcs'

cc1: error : invalid option 'no-sched-prolog'

cc1: error : invalid option 'little-endian'

cc1: error : invalid option 'abi=apcs-gnu'

arch/arm/kernel/asm-offsets.c:1: error: bad value (armv4) for -march=switch

arch/arm/kernel/asm-offsets.c:1: error: bad value (armv4) for -mtune=switch

make[1]: *** [arch/arm/kernel/asm-offsets.s] Error 1

make: *** [arch/arm/kernel/asm-offsets.s] Error 2

re:asm-offsets.s 这个文件编译出错一般是编译器问题,不要用2.95.3,用3.4.1

    这里主要是编译器版本的问题,2.6内核不能使用以往的2.95.3版本的gcc,需改用3.4.1版本。关于编译器,最好不要自己做,下载网上现成的就可以了。http://www.gnuarm.com/这里有arm的编译器下载。

    内核的版本对于编译倒关系不大,一般都能编译成功,而关键还在于配置。为了对s3c2410有更好的支持,建议使用2.6.10以后的版本。网上2.6.11版本用的人也挺多的,相关资料也挺多的,但是新版本对硬件的支持更好更稳定。比如在2.6.11中没有DM9000和CS8900的网卡驱动,在2.6.14版本中就已经对其支持。我选用的是2.6.14版本,现使用三星默认的配置文件arch/arm/configs/s3c2410_defconfig,顺利编译通过。

    kernel: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.7.tar.bz2

    compiler: ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2

 

2. 运行内核,显示调试信息

    运行内核肯定没问题,但是搞不好你就出现了一下问题:

Uncompressing Linux................................................................ done, booting the kernel.

就不动了,以前用2.4.18内核是可以启动的。

re:命令行的console参数错了,应该为console=ttySAC0,不是console=ttyS0。

    因为2.6对2410的串口支持已经很好了,使用默认配置的话就不要去怀疑串口驱动了。问题出在命令行上,有人说我将默认的命令行改成了console=ttySAC0也还是不行。这只能说明改动了默认的命令行,只有在bootloader没有传递命令行参数给内核的时候才起作用。如果你的bootloader启动过2.4的内核,命令行参数肯定是不对的,在bootloader中将命令行改了就行了。例如:console=ttySAC0,115200 root=/dev/ram init=/linuxrc rw initrd=0x30008000,0x320000 

    因为烧写bootlader麻烦,时间长,调试阶段不建议修改bootloader。我将内核中的arch/arm/kernel/setup.c文件中的parse_tag_cmdline()函数中的内容注释掉,并且配置正确的CONFIG_CMDLINE参数,即可运行。以后每当改变内核参数只要改变CONFIG_CMDLINE就可以了。(CONFIG_CMDLINE这个值可以在make menuconfig中配置,2.6.11版本和2.6.14版本配置位置有所不同,请注意)。

 

3. 激动的看到shell

    当做完以上工作时看到内核信息哗哗哗的出来已经很兴奋了吧,我也是,但是很快你会看到下面有如下错误:

Please append a correct "root=" boot option

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

re:传递一个合理的root参数,如果已经传递了,请确认内核是否支持

    如果使用console=ttySAC0,115200 root=/dev/ram init=/linuxrc rw initrd=0x30008000,0x320000这个命令行参数,需要使用ramdisk和initrd。所以确保CONFIG_RAMDISK=y和CONFIG_INITRD=y。在device driver=》Block device下面可以配置。

    这里的ramdisk是把内存块当做一个块设备来使用,相当于一个位于内存中的磁盘分区;而initrd就是用于初始化系统的ramdisk,用来mount真正的root。

    这里使用initrd是为了调试方便,不需要使用flash和网络。一般使用是多数会用到mtd,调试时使用nfsroot,在移植完相关硬件后再来讨论。

    当内核支持了以后还需要有initrd。使用网上下载的现成的,如何制作等会介绍。例如:我有一个initrd为ramdisk.image.gz,在bootloader下加载到指定的0x30800000处,然后启动内核即可。一般出现如下信息表示ramdisk加载成功了。

RAMDISK: Compressed image found at block 0

VFS: Mounted root (ext2 filesystem) readonly.

Freeing init memory: 96K

Warning: unable to open an initial console.

re:unable to open an initial console是因为没有支持devfs。

   但是又出现了Warning: unable to open an initial console.这个错误。难道是console的问题?no。有些initrd是用于又devfs支持的内核,所以在/dev/目录下没有设备文件。两种办法解决这个问题:1.copy设备节点;2.让内核支持devfs。两个方法没有什么好与差,只是在2.6.14版本中devfs的配置选项在make menuconfig的时候会看不到。linux除去了devfs的配置,提供了替代品udev,但是对这个不熟悉,而且听说也不稳定,所以还是打算用devfs。可以在.config文件中直接添加CONFIG_DEVFS_FS,但由于每次make menuconfig之后会重新写.config文件,每次编译要添加一次,很麻烦,所以不建议。我是把2.6.11版本中的/fs/Kconfig复制过来替换掉。这样配置的时候就能看到devfs的选项了。配置时注意还要选中Automatical mount at boot选项。

Freeing init memory: 80K

Warning: unable to open an initial console.

Kernel panic - not syncing: No init found. Try passing init= option to kernel.

re:init参数没有传递,或者制作的ramdisk有问题。

XXX:目前这个地方我也没弄好。正疑惑。用别人的initrd可以,自己用busybox做的就不行。而且用别人的也不是很稳定。有可能时busybox在编译完了后没有copy相关库,需要静态编译。

 

    当解决了以上问题之后,多数能兴奋的看到shell了。

 

4. 制作自己的initrd

    这个initrd的制作可以参考网上一些制作floppy disk的文章。

4.1 制作一个ext2的文件系统映象

~# dd if=/dev/zero of=ramdisk.image bs=1M count=2

~# echo y | mke2fs -i 2000 -m 0 ramdisk.image

~# mkdir mnt

~# mount -o loop ramdisk.image mnt

    这样,ramdisk.image这个ext2文件系统映象就做完了,他相当于一个磁盘分区。

 

 

5.显示自定义logo

在配置内核的时候选中了启动Logo的支持。

使用下面的方法可以将企鹅的Logo换成自己喜欢的任意图片。

首先准备一幅自己喜欢的图片,然后将背景涂成黑色。然后将该图片保存成png格式,例如linuxlogo.png。在Linux下使用下面的命令:

 

# pngtopnm linuxlogo.png > linuxlogo.pnm

# pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm

# pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm

 

然后.ppm替换/usr/src/linux-2.6.8.1/drivers/后用生成的linuxlogo224video/logo/logo_linux_clut224.ppm(最好先做好备份),然后删除同一目录下的logo_linux_clut224.c文件,重新编译内核,启动之后就可以在屏幕左上方看到自己的Logo了。

发表于: 2008-12-15 ,修改于: 2008-12-15 07:54,已浏览1193次,有评论0条 推荐 投诉


网友评论

发表评论