文件系统是根据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 通过撒花.