菜鸟心得,高手路过。。。。。
在方案公司开发环境一般极其复杂, 有一种情况如果在板子inand没有驱动起来的时候,没有分区,没有根文件系统。快被淘汰掉的nandflash板子上压根没焊,而且手机的板子中根本没有rj45接口,所以想要做nfs那是天方夜谈的事情。想要安安心心的进入shell界面谈何容易。除非有别的方法启动板子,但是会让本就复杂的情况变得更复杂。至于其他理由及需求我这里不在赘述。
因为当网络中这方面资料讲的虽然比较全面,而且提纲挈领,但是方法繁多,结构松散,不知从何入手。几经折腾后写下这篇心得,不管你多菜,跟随五个步骤一步一步做,问题应该能够得到解决。(initramfs.cpio我认为是很好的一种方法,使用简单,内核自带,不需要打任何补丁,在逻辑中内核跟文件系统看起来浑然一体,移植性更高,不需要各种复杂的uboot操作,使用这种方法足以对应各种发杂的开发环境)
注:我这里用到的环境是s3c6410 linux2.6.32.2
1)找个简单一下的跟文件系统,需要一个busybox用来做一些最简单的操作
注:这里我放在了内核根目录下面,在逻辑上来看内核跟文件系统形成了一部分东西
2)make menuconfig中勾选
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
然后这里填入具体根目录的路径(内核目录下的minirootfs)
3)make重新编译内核,一般情况不需要clean
编译过程中会发现usr/initramfs_data.cpio被更新了
来到usr目下发现确实是有这么一个7.8M的东东,不管,继续去arch/arm/boot/下查看
发现zImage变成了7M的大家伙,做到这步,说明你已经成功一半了
5)OK让我们放到板子上跑一下
想办法把把zImage拷贝到内寸中,不管用什么办法,拷贝到启动地址即可,我这里使用的是TFTP(s3c6410的启动地址是0x50008000这里就不在赘述了)
设置bootargs为"console=ttySAC0,115200 init=/linuxrc ==>ttySAC0"即不指定根"root=xxx"
bootm启动
如果你进shell了,说明你已经成功了,在我博客blog.csdn.net/dragon101788上顶一下帖子说明对你有所帮助。如果没有成功,那么加我QQ:45797408,一起讨论
如果你想更深入的了解请点击精通initramfs构建step by step
可能会出现问题:
找不到控制台,串口连不上
解决方案:来到initramfs根目录中的dev下创建console与null
重新make以下步骤,问题得以解决
编辑RAMDISK
解压initramfs
载split_bootimg.zip文件点击下载,在此zip文件中包含一个perl文件,split_bootimg.pl脚本,该脚本可以读取boot.img头(根据Android源码中的bootimg.h读取)将kernel和ramdisk读取出来,此脚本也会输出内核命令行和板子名字。
(注意,不要使用从/dev/mtd/mtd2直接拷贝出来的boot.img,此映像可能在读取过程遭到损坏。)
下面是一个从TC4-RC28更新中提取出来的boot.img进行解包操作:
% ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141518 (0x000228ce)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
解包ramdisk的命令如下:
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..
解码完毕后,就可以修改了(例如,在default.prop设置ro.secure=0等等)
使用mkbootfs工具(mkbootfs工具是编译完毕Android源代码以后,就会在~/android-src/out/host/linux-x86/bin自动生成)来重新创建ramdisk,可以使用如下命令来操作:
方法一:
% mkbootfs ./ramdisk | gzip > ramdisk-new.gz
注:以上方法如果有发现权限丢失现象可以使用下面命令打包
方法二:
cd ramdisk
find . |cpio -o -H newc |gzip >../download.img-ramdisk.gz
cd ..
使用mkbootimg来重新创建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目录中可以找到:
% mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img