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 文件系统的完善

那些个启动脚本啊, 文件系统挂载,再说吧,太琐碎了,百度相关就好.

原文地址:https://www.cnblogs.com/kmist/p/11362907.html