分类: LINUX
2011-08-11 14:12:01
linux系统一开始就面临着选择。实验开发板自带着稳定、可读可写的linux 2.4内核的系统,但是具体的应用又迫使我放弃原带的系统。 首先是根文件系统根据需要应该编译进去关于SDL的库,所以改变了根文件系统。而根文件系统的大小也增加了一些,使得原分区大小有些小。从而要对flash重新分区,这就要求对vivi修改源代码,然后重新编译生成vivi,再重新bon part分区。不光是vivi和根文件系统改了,在应用过程中还用到了无线网卡和摄像头,就涉及到了它们的驱动问题。主要是无线网卡,由于无线网卡对linux 2.4内核下的arm上支持性应该不是很好(我编译通过但好像2.4内核不支持zd1211b),所以只能重新编译内核,使用linux 2.6内核(我使用的是2.6.14)。 所以,vivi、内核和根文件系统都必须重新编译生成了。 目前为止,vivi确定了(分区定了,修改具体分区后很容易编译通过)。linux 2.6.14内核编译通过,但是启动开发板后没有iwconfig无线网卡环境,所以自己在网上重新下的iwconfig的源代码,arm-linux-gcc生成后移植到开发板上好使。根文件系统库已经成功编译进去也可以运行。但又有一些问题,只要yaffs下读写flash就会提示“无校验is not recommended”,很不好看。根文件系统中insmod驱动却不好使,提示insmod:Not configured to support old kernels ,正在解决中。 【后续:去掉ECC校验信息方法: 禁止了nand的ecc,而用yaffs自带的ecc,所以nand层的代码会认为没有用ecc,而如果用nand层的ecc,不管是硬件还是软件ecc,都会有ecc错误出现。 针对arm2410 linux2.6内核的移植,有详细的文档网上可以找到,这里不在说明具体步骤了。总之,就是修改相关文件,增加所要的驱动等等,需注意的是如果要想在根文件系统中使用yaffs,需要打上它的补丁。而根文件系统的编译就更简单了,根据功能找到相应源代码,进行修改编译,注意/etc/fstab下是对系统的挂载,如果要使用yaffs,添加或修改成/dev/mtdblock/4 /mnt/yaffs yaffs defaults 1 1(我这里用的yffs设的分区是mtdblock4)。注意,移植完之后,是不能正常启动的,需要修改下vivi的启动参数,是来针对启动2.6内核的,vivi>param set linux_cmd_line “noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200” vivi>param save,之后重启就可以进入系统了。如果想变回2.4内核,而vivi不想重新烧写的话,注意将修改过的参数修改回来,只需 vivi>param reset vivi>param save重启即可。这里只说一下移植过程中出现的问题。 编译内核出现的问题: 1. cc1: error: invalid option `short-load-bytes' 原因与解决办法: 原因是高版本的编译器不支持-mshort-load-bytes选项,改为-malignment-traps即可。修改U-boot下:cpu/arm920t/config.mk文件(选择该目录下配置文件是因为我使用的是arm920t这个硬件平台,如果你是别的平台就需要选择别的目录下配置文件)中-mshort-load-bytes改为-malignment-traps即可。 2. 出现上述问题,修改后依然有问题。 blkpg.c: In function `blk_ioctl': 后发现问题可能是因为编译器的缘故。 2.4内核----2.95.3的工具链 建议编译2.4内核使用3.3一下的arm-linux,编译2.6内核使用3.4之上的编译器。 3.end_request: I/O error, dev mtdblock3, sector 16 移植内核时出现了这种错误,这种错误通常是由校验造成的.这种情况的解决办法为: 禁止Flash ECC校验。我们的内核都是通过UBOOT写到Nand Flash的, UBOOT通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的. 所以, 我们在这里选择禁止内核ECC校验.修改drivers/mtd/nand/s3c2410.c 文件,找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:chip->eccmode = NAND_ECC_NONE; 并且把 编译根文件系统出现的问题: 1. 使用linux2.6,在做模块装载(insmod)的时候总失败,如下示出错信息: ============================================== [@lyt /mnt]# insmod hello.ko ============================================== 网上说,出现这个问题是由于目前采用的根文件系统,其中insmod(busybox)及其运行共享库仍旧是采用cross-2.95.3编译产生的;而zd1211b模块是采用更新的3.4.1版本的编译器编译。解决的方法是用户可以自行用高版本编译器制作自己的根文件系统。 但是,我重新用新版本的busybox和交叉编译器,烧写后依然不好使。 而经过测试,烧写linux 2.4内核的系统就好使,说明不是编译器版本的问题,应该是对内核的支持的问题,看来只能试着用新版本的insmod来支持linux 2.6内核。正在做。。。。。 2.转载。我遇到过问题1和3,也是从网上搜到的这些解答。 问题1, 使用jffs2文件系统: JFFS2 error: (1) jffs2_build_inode_pass1: child dir "fon ts" (ino #13) of dir ino #4 appears to be a hard link VFS: Mounted root (jffs2 filesystem). Freeing unused kernel memory: 304k freed Warning: unable to open an initial console. Failed to execute /linuxrc. Attempting defaults... Kernel panic - not syncing: No init found. Try passing init= option to kernel. 原因: flash没有erase彻底. 问题2, 使用cramfs时出错: VFS: Mounted root (cramfs filesystem) readonly. Freeing unused kernel memory: 304k freed Error -3 while decompressing! 804878c4(1884)->81200000(16384) Failed to execute /linuxrc. Attempting defaults... Kernel panic - not syncing: No init found. Try passing init= option to kernel. 原因: 没有仔细看 mkfs.cramfs 的手册, 需要指定-b参数, 大小与PAGE_SIZE一样 (查看.config文件 CONFIG_PAGE_SIZE_16KB=y). 问题3 : Kernel panic - not syncing: Attempted to kill init! 原因: 应该是/etc/fstab 之类的文件没有或者是修改但是有错误,查看修改后重新编译再试试吧。 |