S3C2440 制作最新busybox文件系统

摘要:
2.制作基本文件系统2.1下载源码文件系统是根据busybox来制作的.所以网上下载:https://busybox.net/downloads/我下的是最新的1.31版本,用tarvxJf解压后.2.2配置交叉编译环境makedefconfigmakemenuconfigsetting-˃Crosscompileprefix和Pathtosysroot要配置[/opt/gcc-4.6.4/bin

2. 制作基本文件系统

2.1 下载源码

文件系统是根据busybox来制作的.
所以网上下载: https://busybox.net/downloads/
我下的是最新的1.31版本, 用tar vxJf 解压后.

S3C2440 制作最新busybox文件系统第1张

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]

S3C2440 制作最新busybox文件系统第2张

2.3 裁剪同百度

不裁也行

2.4 编译

make V=s ...
最后成功后: 
  LINK    busybox_unstripped
Trying libraries: crypt m resolv
 Library crypt isnot 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.1DOC     BusyBox.html


ls 出现了busybox

执行make install busybox, 生成_install 文件夹.

2.5 制作文件系统

将_install 拷贝到外头
cp -rf _install ../rootfs/
1. 补全文件夹
mkdir proc etc varlib dev sys ...

2. 寻找依赖库,cp到lib中

3.创建dev/console
    sudo mknod console c 5 1
4. 创建dev/tty123
    sudo mknod tty1 c 4 1sudo mknod tty2 c 4 3sudo 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.6c库    
libm.so.6math库
还有
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

S3C2440 制作最新busybox文件系统第3张

生成 rootfs.jffs2

2.6 烧录测试

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

tftp 0x30000000rootfs.jffs2
nand erase root
nand write.jffs2 0x30000000root $(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 asinit 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 文件系统的完善

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

免责声明:文章转载自《S3C2440 制作最新busybox文件系统》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在VSCode中配置Eslint格式化【Python3爬虫】一次应对JS反调试的记录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ext2文件系统

Linux 系统编程(File System) 关于ext2文件系统 什么是文件格式化 就是在执行一个文件读取与访问的规则 ext2文件系统的结构 关于文件的函数 getcwd chdir chmod readlink stat -> struct stat filestat -> filestat.st_... -> mode, s...

mount 命令总结

配置CnetOS 7.4 本地yum源,记录下遇到的ISO镜像挂载问题,使用 blkid 命令可以查看设备的UUID、Label、文件系统类型(iso镜像文件系统类型iso9660) [root@localhost ~]# blkid   /dev/sr0        #/dev/sr0为光驱设备名/dev/sr0: UUID="2017-09-06-1...

(转)CentOS系统启动流程图文详解

CentOS系统启动流程图文详解. 原文:http://www.linuxidc.com/Linux/2017-03/141966.htm 熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽然基础,但能帮助我们更加理解Linux系统的工作机制。以下将以CentOS发行版为例来介绍Linux系统的启动流程,因为在CentOS 5、CentOS 6以...

磁盘检验

由于系统在运行时谁也说不准啥时候硬盘或者是电源会有问题、所以死机可能是难免的情况(不管是硬件还是软件)。现在我们知道文件系统运行时会有硬盘与内存数据异步的状况发生,因此莫名其妙的死机非常可能导致文件系统的错乱。如果文件系统真的发生错乱的话,那该如何是好?此时那个好用的fsck就能拿来仔细分析一下了。 1 fsck [-t 文件系统类型] [-ACay] 设...

u-boot中分区和内核MTD分区关系【转】

转自:https://www.cnblogs.com/lidabo/p/4774327.html 一、u-boot中环境变量与uImage中MTD的分区关系 分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。 一般我们只需要分3-4个区,第一个为boot区,一个为boot参数区(传递给内核的...

linux 文件系统之superblock

为了实际测试这个pagecache和对裸盘操作的区别,我一不小心敲错命令,将一个磁盘的super_block给抹掉了,全是0, dd if =/dev/zero of=/dev/sda2 bs=4096 count=1 seek=2234789 2234789是我的某个测试文件的起始块,debugfs看到的。 然后我手贱敲成:dd if =/dev/zer...