文件系統是根據busybox來制作的. 所以網上下載: https://busybox.net/downloads/ 我下的是最新的1.31版本, 用tar vxJf 解壓后.
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]
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 文件夾.
將_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
還是用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 通過撒花.