<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM 內核移植中常見的錯誤

          ARM 內核移植中常見的錯誤

          作者: 時間:2016-11-11 來源:網絡 收藏
          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.發(fā)現對應選項在Device Drivers->Character devices->Serial drivers中
          一看,原來根本就沒有加載Samsung SoC serial support , 選成靜態(tài)編譯之后又出現了
          Support for console on Samsung SoC serial port ,就是它了,選上, 退出的時候順便把
          Kernel low-level debugging functions給取消了否則我們設置的printk會自行輸出,就不知道ttySAC有沒有加載成功了
          3.最后發(fā)現原來時內核編譯時需要傳入一個啟動命令: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: 0Not 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?)
          1f0164 mtdblock1 (driver?)
          1f022048 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文件系統(tǒng),從網上下載,給內核打上補丁,重新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.啟動命令有問題,根據查看分區(qū)信息(supervivi:part show)得知root分區(qū)在mtdblock3上,不是在2上
          修改為:noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
          2.問題依舊,重新make menuconfig,并對比友善之臂提供的mini2440源代碼配置,重新選擇,
          Device Driver ->Generic Driver Options ->(取消)devtmpfs: error mounting -2被解決了,
          但是依然無法啟動繼續(xù)查看。
          3.系統(tǒng)在啟動過程中出現了很多yaffs: block 456 is marked bad,block 457 is bad這樣的錯誤,越來越多,通過網上搜尋找到解決辦法:
          我用的是板子自帶的supervivi,使用命令bon part 0,就起到格式化整個Nand Flash芯片的作用,假壞塊自然就化為烏有了。隨后問題就柳暗花明。
          4.將mini2440自帶的文件系統(tǒng)重新燒如板子,用mini2440自帶的內核文件啟動,正常,說明文件系統(tǒng)沒有問題,將自己編譯的內核下載進去,依然無法啟動,
          5.添加一些內核輸出信息,終于發(fā)現內核在:search_binary_handler()函數中的fn(bprm, regs)函數后,執(zhí)行失敗了。非常郁悶...
          6.文件系統(tǒng)沒有問題,顯然還是內核編譯有問題,然后通過網上查找說是load_elf_binary執(zhí)行有問題,可能是加載文件系統(tǒng)的文件時不識別文件格式,于是
          重新make menuconfig最后發(fā)現原來是要將General setup--->Choose SLAB allocator --->選上SLAB,不要選擇SLUB。重新make


          關鍵詞: ARM內核移

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();