zoukankan      html  css  js  c++  java
  • Linux内核,文件系统移植过程中出现的一些问题与解决办法

     

     1.bootm地址和load address一样

      此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行。因此此时的entry point必须设置为load address + 0x40。如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对。

    boom address == load address == entry point - 0x40


    2. bootm地址和load address不一样(但需要避免出现memory move时出现覆盖导致zImage被破坏的情况)

      此种情况下,bootm会把uImage header后的zImage move到load address(见上方代码),然后go到entry point开始执行。 由此知道此时的load address必须等于entry point。

    boom address != load address == entry point

     这里是第一种情况,

     我重启后Load Address:30008000 Entry Point:30008000

     

    很有可能是Load Address: 30008000和Entry Point: 30008000一样导致的。
    解决办法:重新编译内核
    make zImage;
    mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "linux-2.6.36" -d ./arch/arm/boot/zImage uImage

    mkimage给zImage添加一个信息头header,生成uImage 

     编译内核时候出现如下错误:

     make: *** [.tmp_vmlinux1] Error 1
    解决方法:修改arch/arm/kernel/vmlinux.lds
    [root@localhost linux-2.6.14]$ vi arch/arm/kernel/vmlinux.lds
    将文件尾2条的ASSERT注释掉
    /* ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") */
    /* ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") */
    然后重新make即可

     

     发现还是不行,哎,该怎么办呢,又要折腾了!!!

     无奈,只好自己动手制作内核和根文件系统了.

    于是查找了相关资料

    内核-编译器-busybox个版本之间的关系

    前言:本文主要记录用各个版本的编译器编译出来代码运行结果。

    1. (zImage)

    Busybox-1.3.2 arm-linux-gcc-3.3.2

    Linux-2.6.26.3arm-linux-gcc-3.4.1

    编译结果:正常通过。

    运行结果:看到控制台

    2. (zImage2)

    Busybox-1.3.2 arm-linux-gcc-3.3.2

    Linux-2.6.30      arm-linux-gcc-3.4.1

    编译结果:正常通过。

    运行结果:看到控制台

    3.

    Busybox-1.3.2 arm-linux-gcc-3.4.1

    Linux-2.6.30      arm-linux-gcc-3.4.1

    编译结果:Busybox-1.3.2编译不通过

    运行结果:XXX

    4. (zImage3)

    Busybox-1.3.2 arm-linux-gcc-3.3.2

    Linux-2.6.30      arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

    编译结果:linux编译不通过,要把Linux-2.6.30目录下的Makefile194行改为

                         194 CROSS_COMPILE   ?=arm-none-linux-gnueabi-

                   编译才通过

    运行结果:看到控制台

    5. (zImage4)

    Busybox-1.3.2 arm-linux-gcc-3.3.2

    Linux-2.6.30      arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

    编译结果:linux编译不通过,要把Linux-2.6.30目录下的Makefile194行改为

                         194 CROSS_COMPILE   ?=arm-none-linux-gnueabi-

                   编译才通过

    运行结果:看到控制台

    6. (***)

    Busybox-1.3.2 arm-linux-gcc-4.3.2

    Linux-2.6.30      arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

    编译结果:Busybox-1.3.2编译不通过

    运行结果:XXX

    7. (zImage4)

    Busybox-1.15.2(这个版本的文件系统是支持eabi) arm-linux-gcc-4.3.2

    Linux-2.6.30      arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

    编译结果:正常通过

    运行结果:运行正常 难能可贵的是在secureCRT终端下TAB键、四个箭头键、delete键、退格键都能够正常使用

    8. (zImage3)

    Busybox-1.15.2(这个版本的文件系统是支持eabi) arm-linux-gcc-4.3.2

    Linux-2.6.30      arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

    编译结果:正常通过

    运行结果:一大堆错误

    9.( zImage2)

    Busybox-1.15.2(这个版本的文件系统是支持eabi) arm-linux-gcc-4.3.2

    Linux-2.6.30      arm-linux-gcc-3.4.1 (linux编译的时候选上eabi)

    编译结果:正常通过

    运行结果:一大堆错误( 8. 中的错误)

    10.( zImage)

    Busybox-1.15.2(这个版本的文件系统是支持eabi) arm-linux-gcc-4.3.2

    Linux-2.6.26.3    arm-linux-gcc-3.4.1 (linux编译的时候选上eabi)

    编译结果:正常通过

    运行结果:有几行错误

    11.下面情况编译都是不通过的

    Busybox-1.15.2 arm-linux-gcc-3.4.1arm-linux-3.3.2

    Linux-2.6.30(选上支持eabi)     arm-linux-gcc-3.4.1arm-linux-3.3.2

    12.通过以上11种情况的分析对内核和文件系统是否支持eabi的搭配做如下总结:

    内核 (1:支持eabi,0:不支持eabi)

    文件系统 (1:支持eabi,0:不支持eabi)

    结果(1:可以运行,0:不可运行)

    0

    0

    1

    0

    1

    0

    1

    0

    1

    1

    1

    1

     我用的工具是这些:arm-none-gnueabi-linux-gcc4.3.2

                     busybox-1.15.2

                     mkyaffs2image

    在busybox-1.15.2下make的时候出现这个错误:

     

     这是少了静态链接库文件crypt.a和libm.a这两个文件,这两个文件存在于你用来编译这个busybox的编译器中。

     但是困扰我的是这个问题究竟怎么解决呢,这两个文件加到哪里去呢,既然是编译的时候出错,说缺少了静态链接库文件,可是这两个文件不是存在于编译器中的吗?怎么会出现这个错误呢?

     于是又开始了思考。

    编译busybox,动态链接与静态链接的选择

    进入解压后的Busybox-1.10.1目录,运行make menuconfigmake gconfig进行配置。

    在进行配置时有几项需要注意:

    Build Options>

    Build BusyBox as a static binary (no shared libs)

    Force NOMMU build

    Build shared libbusybox

    Build with Large File Support (for accessing file>2GB)

    如果选择Build BusyBox as a static binary (no shared libs)方式进行编译时,所需的库已经与程序静态地链接在一起,这些程序不需要额外的库就可以单独运行,但是自己编写的程序在文件系统上运行必须采用静态编译,否则会报诸如:bin/sh: hello :not found的错误。

    静态编译如:

    arm-linux-gcc –static hello.c –o hello

     如果选择Build shared libbusybox方式进行编译时,要将交叉编译的动态库或符号链接复制到对应的目录中,否则程序不能运行。同时在配置时应去掉Build shared libbusybox目录下的两项:如下 

    Build shared libbusybox>

    Producebinary for each applet,linked against libbusybox

    Produceadditional busybox binary linked against libbusybox

    同时去掉

    Build with Large File Support (for accessing file>2GB)

    否则编译会报错。

    一定要勾选上如下配置:

    Init Utilities>

    (*) init

    (*) Supporting reading an inittab file//支技init进程读取/etc/inittab配置文件。

    (*) Supporting running commands with controlling-tty//使busybox在真实的串口设备中运行命令行,不使用可能会报类似与:shcan’t access ttyjob control turned off的错误。

    其它基本可按默认配置。

    5. 执行

    make

    编译完成后执行

    make install

    则在Busybox-1.10.1目录下有_install这个目录,这正是我们想要的。如果正确的话,会生成usr,bin,sbin,linrc这几个文件。

     注意:如果你选择的是动态链接,那么在你的nfs下的文件系统目录下的lib目录下应当要有glibc中的动态链接库文件,没有的话,需要复制过去。

     最好选择静态链接,其他方式的话有时候会出现意想不到的错误呢   

    把_install这个目录下的内容拷贝到你的nfs下的文件系统目录下,此外还需

    cd  ../nfs/文件系统目录/

    mkdir dev etc  mnt proc root sys tmp

    cd  dev/

    mknod console mtdblock0 mtdblock1 mtdblock2 null ttySAC0 //其实这一步你也可以没有,因为mdev会自动创建设备节点

    cd etc/

    mkdir init.d

    touch fstab inittab

    sudo gedit fstab

    加上如下内容后保存

     # device     mount-point    type   options        dump  fsck order
    proc           /proc        proc   defaults        0     0
    tmpfs          /tmp         tmpfs  defaults        0     0
    sysfs          /sys         sysfs  defaults        0     0
    tmpfs          /dev         tmpfs  defaults        0     0

    sudo gedit inittab

    加上如下内容后保存

     # /etc/inittab
    ::sysinit:/etc/init.d/rcS
    s3c2410_serial0::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r

    cd init.d/

    touch rcS

    sudo gedit rcS

    加上如下内容后保存

    #!/bin/sh
    ifconfig eth0 192.168.1.110
    mount -a
    mkdir /dev/pts    #使用内存文件系统,减少对flash的读写
    mount -t devpts devpts /devpts    #/dev/pts用来支持外部网络链接(telnet:远程访问摄像头)的虚拟终端
    echo /sbin/mdev > /proc/sys/kernel/hotplug    #设置内核,当有设备插拔时调用/bin/mdev程序
    mdev -s #在/dev目录下生成内核支持的所有设备的节点
     到此文件系统制作好了。
  • 相关阅读:
    GUID
    Castle学习笔记二:框架结构及配置
    Linux编程基础
    Linux文件编程
    单臂路由配置实例
    CCNA学习笔记#02第7章操作与配置Cisco IOS
    Linux基本命令
    Linux系统中rar、unrar命令安装和使用详解
    批处理设置IP与DNS服务器
    Linux下载安装5笔输入法
  • 原文地址:https://www.cnblogs.com/God-boy1/p/3687416.html
Copyright © 2011-2022 走看看