基于android内核的Busybox移植过程

    首先,编译busybox源代码,在menuconfig中配置如下:Busybox Settings  ---> Build Options  --->中不要选择静态连接,要动态的,Installation Options  --->中选择安装目录,和选择[*] Don‘t use /usr,这样,在make install是就不会安装在/usr下,而是安装在自己选择的目录下,我这里选择代码目录下的自己创建的rootfs目录;接着make ;make install就OK了。

进入rootfs目录下,创建如下目录:

mkdir dev;

mkdir etc;

mkdir sys;

mkdir proc

进入dev目录下,

mknod console c 5 1;

mknod null c1 3;

回到rootfs目录,cp /usr/local/arm/4.2.2-eabi/lib ./ -rd(d参数表示如果文件是链接的,就拷贝链接);接着

mkdir etc/init.d;

vim etc/init.d/rcS,

加入内容如下:

vim etc/fstab,加入内容如下:


这样就创建完最小的文件系统了,接着要打包成ramdisk,在rootfs目录命令如下:

find . | cpio -c -o > ../initrd_cpio.img   

find . | cpio -H newc -o > ../initrd_cpio.img
cd ../     
gzip initrd_cpio.img -f

mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -n “ramdisk” -d initrd_cpio.img.gz ramdisk_mmc.img

    这样ramdisk就做好了,替换我们update包中的ramdisk_mmc.img即可,还有fuse文件和uboot需要修改,因为这里生成的ramdisk比较大,有6M多,在update和uboot搬运ramdisk时候会检查ramdisk的大小,如果大于4M,会报错,所以我们要把这个4M的限制增大到8M,修改framework/external/fuse/include/normal.h中的大小:

修改external/normal.c中:

在uboot movi.h中也一样:

check.c中:

修改完毕后编译,替换update包中的fuse和uboot,接着还要修改uboot中的bootargs参数,在policy_interface.c中修改init=/linuxrc,还有加上新的参数rdinit=linuxrc,否则会提示找不到文件系统,具体原因是什么呢,看kernel中的init/main.c就知道了:

所以如果不加上rdinit,就会找init作为第一个应用程序来执行,而我们busybox的第一个执行的程序应该是linuxrc才对;这样修改完后编译,烧写进去,可以进入控制到了,可是不断地打印can‘t open /dev/tty2,can’t open /dev/tty3,can‘t open /dev/tty4,解决办法是进入busybox的init.rc中,注释掉如下三行即可:

       以上是用ramdisk作为根文件系统,这里介绍不用ramdisk的情况,就是直接把busybox文件系统放到inand分区或者sdcard分区中,比如先说用sdcard来挂载:首先在linux下划分sdcard分区,我这里划分两个分区,第一个是fat格式(mmcblk1p1),第二个是ext3格式(mmcblk1p2),我们就把busybox复制到ext3分区,然后修改uboot bootargs参数:“setenv bootargs console=ttySAC2,115200 noinitrd root=/dev/mmcblk1p2 rw  rootfstype=ext3 init=/linuxrc “,主要是root的分区和加上noinitrd,最好把bootm.c中传递给kernel的ramdisk参数也去掉,这样编译烧写,就可以启动进入console了,看看我成功的log信息:

      还有是把busybox文件系统烧写到inand中,比如我的是替换掉原来android的system分区(mmcblk0p2),也很简单,与前面的sdcard制作的区别就是在busybox/rootfs下zip –r system_mmc.img system,把它压缩好,替换掉update中的system_mmc.img就可以了,要注意把busybox文件系统放到一个system的文件夹里面再压缩哦,我制作的时候就是大意没有这么做,而且刚好在rootfs 文件夹下有一个空的system文件夹,结果放到update包中烧写是,写的是哪个空的system文件夹里的内容,结果mmcblk0p2分区自然就为空,找了好久才发现;好了,接着就该uboot bootargs参数 root= mmcblk0p2就可以了,看看我制作成功的log:



遇到的问题:过了几天重新烧写启动,发现怎么都挂载不上分区,提示log信息如下,原因居然是要在uboot中用一下run命令。比如run prg_kernel_sd,否则kernel中找不到mmc2这个设备,导致挂载不上的,具体原因还没有找到,真是坑爹呀!



        接着介绍cramfs文件系统作为根文件系统的制作和挂载,基本思想就是把cramfs的压缩文件包烧写到inand中某一地址,然后在kernel起来时自动挂载到/dev/ram0中,这有点像ramdisk的挂载了,先下载cramfs制作工具,在http://sourceforge.net/projects/cramfs/中可以下,下完后解压直接make就可生成mkcramfs可执行文件,接着在busybox目录中执行mkcramfs rootfs/ cramfs.img即可,记住是rootfs/,而不是rootfs/*哦,否则提示错误。我们这里为了烧写方便,还要和ramdisk一样,gzip压缩和加上uboot头文件信息,最后生成的就是ramdisk-uboot.img(为了烧写方便,名字相同而已,里面的内容格式和ramdisk完全不一样了),然后在uboot中运行run prg_ramdisk_sd即可把它烧写进去,uboot也有地方需要修改如下:setenv bootargs console=ttySAC2,115200 root=/dev/ram0 rw ramdisk=46080  rootfstype=cramfs init=/linuxrc

由于文件有8M多,还要在kernel中增大ramdisk大小,否则挂载时候提示“image too big”,make menuconfig ->  Device Drivers  ---> [*] Block devices  ---> Default RAM disk size (kbytes)把这里的数值改的比ramdisk打就好,然后启动即可进入console,看看我成功的log:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值