zoukankan      html  css  js  c++  java
  • ARM 内核移植中常见的错误

    1.下载linux-2.6.36.1.tar.bz2
          问题:tar -zxvf 解压压缩文件出现问题,无法识别.
          解决:1.通过file linux-2.6.36.1.tar.bz2 查看压缩格式
              2.通过命令 bzip2 -d linux-2.6.36.1.tar.bz2解压
              3.再通过tar xvf linux-2.6.36.1.tar解压,不能使用
                tar zxvf linux-2.6.22.6.tar解压
              4.上面也可以通过一条指令bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -
                其中XX为内核压缩包文件名

        2.下载patch-2.6.36.1.bz2补丁文件
          1.解压 bzip2 -d patch-2.6.36.1.bz2
          2.cd linux-2.6.36.1/
          3.patch -p1 < ../patch-2.6.36.1

        3.先编译看下内核有没有问题,运行make命令出现下面的错误:
          问题:drivers/input/touchscreen/eeti_ts.c:65: 错误: 隐式声明函数‘irq_to_gpio’
          解决:重新make menuconfig,将driver中的输入设备->触摸设备中,将EETI选项不选,保存退出后,重新make.

        4.将编译成功的内核zImage下载到板子中,出现如下问题:
          问题:NOW, Booting Linux......
              Uncompressing Linux... done, booting the kernel.
              然后没有反应....
          解决:1.Device Drivers--->Character devices--->Serial drivers
                下,选择:Samsung SoC serial support
                        Support for console on Samsung SoC serial port
                        Samsung S3C2440/S3C2442 Serial port support
              2.发现对应选项在Device Drivers->Character devices->Serial drivers中
                一看,原来根本就没有加载Samsung SoC serial support , 选成静态编译之后又出现了
                Support for console on Samsung SoC serial port ,就是它了,选上, 退出的时候顺便把
                Kernel low-level debugging functions给取消了否则我们设置的printk会自行输出,就不知道ttySAC有没有加载成功了
              3.最后发现原来时内核编译时需要传入一个启动命令:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,
                make menuconfig -> Boot options -> 第三行添加上面的启动命令,保存退出,启动成功~

        5.启动过程中,出现问题:
          问题:Unable to handle kernel NULL pointer dereference at virtual address 00000000
              pgd = c0004000
              [00000000] *pgd=00000000
              Internal error: Oops: 80000005 [#1]
              last sysfs file:
              Modules linked in:
              CPU: 0    Not tainted  (2.6.36.1 #20)
              PC is at 0x0
              LR is at s3c_gpio_setpull+0x80/0x8c
          解决:参考网址:http://blog.csdn.net/ExclusivePig/archive/2010/10/24/5961869.aspx
              将static inline int s3c_gpio_do_setpull函数修改为以下内容:
              static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip,
                          unsigned int off, s3c_gpio_pull_t pull)
              {
                  if(NULL != chip->config->set_pull)
                      return (chip->config->set_pull)(chip, off, pull);
                  else
                      return EINVAL;
              }

         6.内核终于启动起来了,但是接着又出现了下面的问题:
           问题:List of all partitions:
               1f00             256 mtdblock0 (driver?)
               1f01              64 mtdblock1 (driver?)
               1f02            2048 mtdblock2 (driver?)
               1f03           63152 mtdblock3 (driver?)
               1f04           65536 mtdblock4 (driver?)
               No filesystem could mount root, tried:  cramfs
               Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
           解决:原来是没有添加YAFFS2文件系统,从网上下载,给内核打上补丁,重新make menuconfig,在file system中选择YAFFS2,重新make.
               打补丁如下:./patch-ker.sh c /work/system/linux-2.6.36.1

          7.编译出现问题,最新内核去掉了一些函数,和改变了一些函数的名字,致使YAFFS2在编译过程中出现错误。
            解决:请参考:http://www.linuxhq.com/kernel/v2.6/36-rc1/fs/attr.c

          8.再次下载编译好的内核,运行出现下面问题:
            问题:yaffs: dev is 32505858 name is "mtdblock2"
                yaffs: passed flags ""
                yaffs: Attempting MTD mount on 31.2, "mtdblock2"
                yaffs_read_super: isCheckpointed 0
                VFS: Mounted root (yaffs filesystem) readonly on device 31:2.
                devtmpfs: error mounting -2
                Freeing init memory: 120K
                Failed to execute /linuxrc.  Attempting defaults...
                Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
            解决:1.启动命令有问题,根据查看分区信息(supervivi:part show)得知root分区在mtdblock3上,不是在2上
                  修改为:noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
                2.问题依旧,重新make menuconfig,并对比友善之臂提供的mini2440源代码配置,重新选择,
                  Device Driver ->Generic Driver Options ->(取消)devtmpfs: error mounting -2被解决了,
                  但是依然无法启动继续查看。
                3.系统在启动过程中出现了很多yaffs: block 456 is marked bad,block 457 is bad这样的错误,越来越多,通过网上搜寻找到解决办法:
                  我用的是板子自带的supervivi,使用命令bon part 0,就起到格式化整个Nand Flash芯片的作用,假坏块自然就化为乌有了。随后问题就柳暗花明。
                4.将mini2440自带的文件系统重新烧如板子,用mini2440自带的内核文件启动,正常,说明文件系统没有问题,将自己编译的内核下载进去,依然无法启动,
                5.添加一些内核输出信息,终于发现内核在:search_binary_handler()函数中的fn(bprm, regs)函数后,执行失败了。非常郁闷...
                6.文件系统没有问题,显然还是内核编译有问题,然后通过网上查找说是load_elf_binary执行有问题,可能是加载文件系统的文件时不识别文件格式,于是
                  重新make menuconfig最后发现原来是要将General setup  --->Choose SLAB allocator --->选上SLAB,不要选择SLUB。重新make
  • 相关阅读:
    你人生中的那口井挖了没有?
    Stream接口
    console (控制台)
    assert.fail()
    assert.strictEqual()
    assert.equal()
    assert.ifError()
    assert.ok()
    nodejs assert 模块
    闭包
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2076138.html
Copyright © 2011-2022 走看看