现在的位置: 首页 > 综合 > 正文

内核移植

2017年01月13日 ⁄ 综合 ⁄ 共 3934字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.