S3C2440 制作最新busybox文件系統


2. 制作基本文件系統

2.1 下載源碼

文件系統是根據busybox來制作的.
所以網上下載: https://busybox.net/downloads/
我下的是最新的1.31版本, 用tar vxJf 解壓后.

2.2 配置交叉編譯環境

make defconfig
make menuconfig
setting->
Cross compile prefix和Path to sysroot要配置
[/opt/gcc-4.6.4/bin/arm-linux-]
[/opt/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot]

 

2.3 裁剪同百度

不裁也行

2.4 編譯

make V=s ...
最后成功后: 
  LINK    busybox_unstripped
Trying libraries: crypt m resolv
 Library crypt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
Final link with: m resolv
  DOC     busybox.pod
  DOC     BusyBox.txt
  DOC     busybox.1
  DOC     BusyBox.html


ls 出現了busybox

執行make install busybox, 生成_install 文件夾.

2.5 制作文件系統

將_install 拷貝到外頭
cp -rf _install ../rootfs/
1. 補全文件夾
mkdir proc etc var lib dev sys ...

2. 尋找依賴庫,cp到lib中

3.創建dev/console
    sudo mknod console c 5 1
4. 創建dev/tty123
    sudo mknod tty1 c 4 1
    sudo mknod tty2 c 4 3
    sudo mknod tty3 c 4 3
    
5. 配置/etc腳本
5.1 將案例的etc全部拷貝過來
    cp ../examples/bootfloppy/etc/* etc/ -arf
    [fstab  init.d  inittab  profile]
6. nfs啟動或者制作文件系統
[ 2. 尋找依賴庫,cp到lib中 ]

busybox動態依賴庫:
readelf -d busybox | grep NEEDED

ld-linux.so.3     動態鏈接庫
libc.so.6        c庫    
libm.so.6        math庫
還有
libpthread.so.0/opt/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib 里面找到需要的庫,然后cp到_install/lib下.
[ 6. nfs啟動或者制作文件系統 ]
因為 這個版本的linux內核的FSsetting中,沒有看見Yaffs2的支持,所以暫時先做jffs2的文件系統.

ubuntu: sudo apt-get install mtd-utils    //下載制作工具
mkfs.jffs2 -n -d rootfs/ --pad=0x800000 -s 2048 -e 0x20000 -l -o rootfs.jffs2

--pad=0x800000 填充到8M
-s 2048 根據nand flash決定, 我的頁大小是2k,
-e 每次擦除128K, 塊大小是128k

生成 rootfs.jffs2 

 

2.6 燒錄測試

還是用tftp
mtdparts=nandflash0:256k@0(bootloader),128k(params),4m(kernel),-(root)

tftp 0x30000000 rootfs.jffs2
nand erase root
nand write.jffs2 0x30000000 root $(filesize)

因為是jffs2文件系統,所以啟動的時候要修改bootmargs
bootargs=root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 rootfstype=jffs2 

要制定roottype=jffs2 才能識別到.
如果遇到錯誤:檢查2個問題:

1, 是未能識別到文件系統,還是文件系統linuxrc執行錯誤.

第一種的話,未能識別到文件系統,嘗試掛載其他文件系統,均錯誤,所以painc.
這種錯誤回來添加roottype=jffs2

第二種,
VFS: Mounted root (jffs2 filesystem) on device 31:3.
Freeing unused kernel memory: 196K
This architecture does not have kernel memory protection.

linuxrc(1): undefind instruct :pc=(ptrval)
...
Kernel panic -not syncing: Attempted to kill init! exitcode=0x00000004

可以看到,文件系統已經識別到,但是在執行init程序的時候,發現未定義指令,報錯了.

這個問題困擾了很久,最后百度了很久,找到了原因. 
在對busybox 執行了objdump后, 確實發現了clz這條指令,帖子上說,這條指令是armv5以后的cpu才支持的,而我的s3c2440是armv4t,當然會報錯了,在找到原因后,就想着怎么解決. 在CFLAGS中加入-mach=armv4t 編譯也沒有用.


既然如此,我就索性把gcc編譯器版本降到3.+的版本, 
make menuconfig
把之前的

[/opt/gcc-4.6.4/bin/arm-linux-]
[/opt/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot]

改成
[/opt/gcc-3.../arm-linux-]        //路徑根據個人
[]                                //3.+的gcc中,好像沒有rootfs這個文件夾,索性置空

編譯,通過,然后objdump,發現clz已經沒了,勝利在望,
make install,將/bin/下的busybox 替換成之前已經做好的文件系統中的bin/busybox

然后重新打包成 jffs2文件. 
tftp燒錄,
啟動,
通過.

ALSA device list:
  No soundcards found.
 VFS: Mounted root (jffs2 filesystem) on device 31:3.
Freeing unused kernel memory: 196K
This architecture does not have kernel memory protection.
Run /linuxrc as init process
tmpfs: No value for mount option 'default'
mount: mounting tmpfs on /tmp failed: Invalid argument
sysfs: Unknown parameter 'default'
mount: mounting sysfs on /sys failed: Invalid argument

-n Processing /etc/profile... 
Done

通過撒花.

 

2.7 文件系統的完善

那些個啟動腳本啊, 文件系統掛載,再說吧,太瑣碎了,百度相關就好.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM