ARM 内核移植中常见的错误
生活随笔
收集整理的這篇文章主要介紹了
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
??????問題: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
轉載于:https://www.cnblogs.com/hnrainll/archive/2011/06/09/2076138.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ARM 内核移植中常见的错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关Visual Studio 2008
- 下一篇: Android中AES256加密的实现