Profil de Libin绿色家园PhotosBlogListes Outils Aide

Blog


17 juillet

将linux-2.6.4内核移植到S3C2410

摘自:http://www.cublog.cn/u2/70445/showart_1721091.html

 

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了。

Commentaires

Veuillez patienter...
Le commentaire entré est trop long. Raccourcissez-le.
Vous n'avez rien entré. Réessayez.
Il est actuellement impossible d'ajouter votre commentaire. Réessayez plus tard.
Pour ajouter un commentaire, tu dois avoir l'autorisation de tes parents. Demander l'autorisation
Tes parents ont désactivé les commentaires.
Il est actuellement impossible de supprimer votre commentaire. Réessayez plus tard.
Vous avez dépassé le nombre maximal de commentaires qu'il est possible d'envoyer le même jour. Réessayez dans 24 heures.
Votre compte a pu laisser les commentaires désactivés parce que nos systèmes indiquent que vous risquez d'arroser d'autres utilisateurs de messages. Si vous pensez que votre compte a été désactivé par erreur, contactez l'assistance en ligne de Windows Live.
Effectuez la vérification de sécurité ci-dessous pour finaliser l'envoi de votre commentaire.
Les caractères entrés pour la vérification de sécurité doivent correspondre à ceux de l'image ou du fichier audio.
Libin a désactivé les commentaires dans cette page.

Rétroliens

L'URL de rétrolien de ce billet est :
http://greensui.spaces.live.com/blog/cns!57ACA2C80B34A3DA!475.trak
Blogs Web qui font référence à ce billet
  • Aucune