vivi以及内核编译过程以及其中遇到的一些问题

来源:互联网 发布:windows nt setup 编辑:程序博客网 时间:2024/06/04 22:23
转自:
http://hi.baidu.com/lqh474793161/blog/item/3c04e78fa393d8fdf11f36d1.html

vivi编译过程:
参考资料:<<s3c2410完全开发>>  <<vivi讲解与分析>>
开发环境:VMware redhat9.0 虚拟机环境

我的虚拟机已经与windows共享了一个文件夹:
即windows下的“我的文档”文件夹,在我的虚拟机linux下为 /mnt/hgfs/shareforVM 目录
这样就可以在虚拟机和windows系统之间共享文件了,可以在linux下进行交叉编译生成vivi.bin文件,然后利用windows下的工具将bin文件烧写到目标板中
这样就体现了使用虚拟机的好处:可以在不重起的情况下实现两个操作系统的功能
VMware的详细使用可以参见我转的另一篇文章

1.首先安装arm-linux-gcc交叉编译器
编译器arm-linux-gcc-3.4.1
下载地址:
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
执行如下命令安装:
bunzip2 arm-linux-gcc-3.4.1.tar.bz2
tar xvf arm-linux-gcc-3.4.1.tar -C / 
-C选项切换安装目录
生成的编译工具在目录/usr/local/arm/3.4.1/bin下,修改/etc/profile,增加如下一行。这可以让我们直接运行arm-linux-gcc,而不必将其绝对路径都写出来,不过这得重新启动后才生效:
pathmunge /usr/local/arm/3.4.1/bin 
注:/etc/profile 是shell本身的初始化文件,通过修改此文件可以在开机时输出一些环境变量,避免每次都手动去修改
2.将需要用到的源码tar包拷贝到我的共享目录/mnt/hgfs/shareforVM中
vivi-20030929.tar                      (vivi的源码)
linux-2.4.18-rmk7-pxa1-mz5.tar         (linux内核的源码)
linux-2.4.18-rmk7-pxa1-mz5.tar.bz2.edukit2410.patch  (内核补丁)
vivi-20030929.tar.bz2.edukit2410.patch  (vivi补丁)
shareforVM#>ls
vivi-20030929.tar linux-2.4.18-rmk7-pxa1-mz5.tar 
linux-2.4.18-rmk7-pxa1-mz5.tar.bz2.edukit2410.patch
vivi-20030929.tar.bz2.edukit2410.patch
3.安装vivi源码包
shareforVM#>tar xvfj vivi-20030929.tar                             
shareforVM#>ls
vivi vivi-20030929.tar ....
可以看到生成了vivi源文件目录
接下来给vivi打个补丁
shareforVM#>patch -p0 </mnt/hgfs/shareforVM/vivi-20030929.tar.bz2.edukit2410.patch
注意当前目录
4.安装kernel源码包
因为vivi的编译需要内核的头文件,所以在编译vivi之前还要安装好kernel源码
shareforVM#>tar xvfj linux-2.4.18-rmk7-pxa1-mz5.tar    
shareforVM#>ls
kernel linux-2.4.18-rmk7-pxa1-mz5.tar
打补丁: 
shareforVM#>patch -p0 </mnt/hgfs/shareforVM/linux-2.4.18-rmk7-pxa1-mz5.tar.bz2.edukit2410.patch
打补丁的技巧:见附录
5.正式开始设置vivi编译
第一步,根据自己的开发环境修改vivi目录下的Makefile文件
修改/vivi/Makefile里的一些变量设置:
LINUX_INCLUDE_DIR = /kernel/include/
(LINUX_INCLUDE_DIR 为kernel/include的对应目录,我的是/mnt/hgfs/shareforVM/kernel/include/)
因此修改为:
LINUX_INCLUDE_DIR = /mnt/hgfs/shareforVM/kernel/include/
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
(CROSS_COMPILE 为arm-linux安装的相应目录,我的
是/usr/local/arm/3.4.1/bin/arm-linux-)
因此修改为:
CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-
ARM_GCC_LIBS = /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1
(需根据你arm-linux的安装目录修改,我的是/usr/local/arm/3.4.1/lib/gcc/armlinux/3.4.1)
第二步,执行 make clean 清理以前编译产生的文件,避免相互影响
第三步,执行 make menuconfig 配置vivi(注意保存配置结果)
注:在此我不并打算配置,因此采用默认配置,具体配置方式还得参见其他的资料
第四步,执行make进行编译,最终在vivi目录下生成了一个名为vivi的文件以及其他相关文件
#########################################################
要注意的是:以上步骤编译老通不过,主要是编译器的问题,我换了个2.95.3的的版本(当然相应的目录和环境变量也得修改)编译完全没的问题了,使用的源码也不是上述开发板自带的,因为开发板EDUKIT-3带的源码在原始的代码上都经过修改不适合我们自己进行编译,我在此要按照自己的理解来进行vivi和kernel的编译。依因此从网上下载了原始的代码:linux-2.4.18.tar cross-2.95.3.tar
操作的步骤和上述都差不多,就不详述了
思考:为什么3.4.1这个高版本的交叉编译器反而编译不了vivi 呢????
##########################################################
  usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
内核编译:
源码包:linux-2.4.18.tar cross-2.95.3.tar
编译器:cross-2.95.3
我已经修改 /etc/profile 在其中增加了下面两行:
pathmunge /usr/local/arm/2.95.3/bin    #增加/usr/local/arm/2.95.3/bin为命令的搜索目录
export WORKDIR=/mnt/hgfs/shareforVM    #输出环境变量WORKDIR,方便操作
这时调用 arm-linux-gcc arm-linux-as.......等命令时候,使用的就是2.95.3的交叉编译器
由于我还安装了cross-3.4.1编译器,要使用这个交叉编译器时,就只能通过绝对路径了,比如:/usr/local/arm/3.4.1/bin/arm-linux-gcc
接着上面vivi的编译环境继续
第一步,安装linux源码
shareforVM#>tar xvfz linux-2.4.18.tar.gz
shareforVM#>ls
linux-2.4.18.tar.gz linux  ........
第二步,进入在vivi编译过程中安装好的内核的内核目录---/mnt/hgfs/shareforVM/linux,
编辑Makefile
  设置 cross_compile:=[编译器的绝对路径]    ;这个绝对路径既上面2.95.3包可执行文件放到的路径 安照我的安装目录即  
  修改为:/usr/local/arm/2.95.3/bin
  进入内核文件夹,执行下面命令
  [root@hostname]# make clean
  [root@hostname]# make dep
  [root@hostname]# make
  [root@hostname]# [编译器的绝对路径]/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin   ;编译器的绝对路径也是上面说到的路径
   [root@hostname]# gzip linux.bin

=====================================================================================
=====================================================================================
转自:http://hi.baidu.com/weili8607/blog/item/0f5001efbc5501212df5343c.html

arm2410的Linux系统移植——vivi、内核、根文件系统的编译
2009-03-24 20:58

    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错误出现。
所以简单的解决方法就是去掉以上的警告信息。
在drivers/mtd/nand/nand_base.c中找recommended这个单词
找到三句打印语句,注释掉就ok了】

    针对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':
blkpg.c:250: error: asm-specifier for variable `__r1' conflicts with asm clobber list
blkpg.c:250: confused by earlier errors, bailing out

后发现问题可能是因为编译器的缘故。

2.4内核----2.95.3的工具链 
2.6内核-----3.3./3.4.的工具链,其中binutils的版本要高于2.13

建议编译2.4内核使用3.3一下的arm-linux,编译2.6内核使用3.4之上的编译器。

3.end_request: I/O error, dev mtdblock3, sector 16
Buffer I/O error on device mtdblock3, logical block 2
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 0
FAT: unable to read boot sector
VFS: Cannot open root device "mtdblock3" or unknown-block(31,3)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)

    移植内核时出现了这种错误,这种错误通常是由校验造成的.这种情况的解决办法为:

禁止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;

     并且把
    Device Drivers --->
    Memory Technology Devices (MTD) --->
        NAND Flash Device Drivers --->
            [*]   S3C2410 NAND Hardware ECC
    去掉。(默认是不加的,可查看一下若选上了进行去掉)

编译根文件系统出现的问题:

1. 使用linux2.6,在做模块装载(insmod)的时候总失败,如下示出错信息:

==============================================

[@lyt /mnt]# insmod hello.ko
Using zd1211b.ko
insmod:Not configured to support old kernels

==============================================

网上说,出现这个问题是由于目前采用的根文件系统,其中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 之类的文件没有或者是修改但是有错误,查看修改后重新编译再试试吧。

0 0
原创粉丝点击