文章目录:
- 1、如何编辑boot.img里面的ramdisk
- 2、android 怎么样修改源码文件
- 3、编译Android源码和内核源码的区别
- 4、linux 根文件系统 什么时候使用ramdisk
- 5、求一份gavotte写的ramdisk源码! 可以给双倍分。
- 6、如何从boot.img提取ramdisk文件
如何编辑boot.img里面的ramdisk
首先你要有一个用户解锁fastboot的手机,这样才能允许你刷入第三方ROM
其次你要能找到当前版本所对应的boot.img或sec_boot.img(带签名),通常能拿到的也就是刷机包里面解出来的sec_boot.img,通过cat mtd出来的不知道行不行=。=
工具:
split_bootimg.pl google一下,很好找
mkbootfs和mkbootimg 可以从网上下,最好是自己直接编译
1)sec_boot.img是经过签名的,需要把文件前0x1000个字节删除,也就是ANDROID! 8个字符前面所有字节删除,保存为boot.img
2) 运行perl split_bootimg.pl boot.img解出kernel和ramdisk文件,同时记下运行结果中的“Command line: vmalloc=384M mem=2044m@0x200000。。。。”一长串字符备用
3)运行指令把ramdisk的文件解出来
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
cd ..
4)修改其中的文件,例如我觉得default.prop里面的persist.sys.usb.config=manufacture,adb不太爽,想改成=adb,修改保存。如果你想adb有root权限的话,就去改ro.secure和ro.debuggable
5)重新打包
mkbootfs ./ramdisk | gzip ramdisk-new.gz
当然如果你自己编译的mkbootfs也没有加到path里,就把编译完的程序考到当前目录,运行./mkbootfs...
生成boot-new.img
mkbootimg --cmdline '单引号里面这一段拷贝刚才记下的Command line冒号后面的一长串' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
6) 现在如果把生成的boot-new.img直接刷进去,手机就起不来了,问题在于kernel,ramdisk,second stage,tags的地址,
自己编译的mkbootimg查看一下.c文件就知道base=0x10000000,生成的boot-new.img是按照这个规则来的:
kernel地址=base + 0x00008000,ramdisk地址=base + 0x01000000,
second stage地址=base + 0x00f00000,tags地址=base + 0x00000100。
这跟原始sec_boot.img里面的地址是不一样的,本想找到正确的base值,但原始img的几个地址并非此规律,拿不到源码只能干瞪眼喽,
最简单的办法就是用16进制编辑器将boot-new.img对应的4个地址修改为原始值,如图:
android 怎么样修改源码文件
1、Android的文件系统结构是怎样的,我们安装 1、Android的文件系统结构是怎样的,我们安装的程序放在那里? 编译Android源码之后,在out/target/product/generic一些文件: ramdisk.img、system.img、userdata.img、 system、 data、root 其中, system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。 ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件跟root文件夹的文件基本一样。模拟器装载ramdisk.img并解压到内存,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。 2、Android SDK和android源码能为我们提供什么工具? 的程序放在那里? 编译Android源码之后,在out/target/product/generic一些文件: ramdisk.img、system.img、userdata.img、 system、 data、root 其中, system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。 ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件跟root文件夹的文件基本一样。模拟器装载ramdisk.img并解压到内存,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。 2、Android SDK和android源码能为我们提供什么工具?
编译Android源码和内核源码的区别
Android源码编译之后生成的是ramdisk.img、system.img和userdata.img。而内核源码编译完成之后生成的是ZImage。在一般情况下Android源码是不带有内核源码的,但是带有一个镜像,这样在编译完Android源码之后就可以模拟器启动了,如果要更换系统的内核,此时将高版本的内核源码进行编译生成ZImage然后替换Android系统的的镜像。这样使用模拟器启动之后就可以查看内核是否已经被刷新。
请注意,android源码和kernel源码是分开下载的
编译android源码
进入source目录下,执行make 即可。
编译完成后,可以在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。
编译内核源码
新建Kernel/goldfish,在这个目录下进行编译
linux 根文件系统 什么时候使用ramdisk
开发环境:Fedora 9
交叉编译工具链:arm-linux-gcc 4.3.2 with EABI
嵌入式Linux内核版本:2.6.29.4-FriendlyARM。昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r查一下,就是叫做2.6.29.4-FriendlyARM,帖子已经改好了。本文就是友善之臂的2.6.29.4-FriendlyARM的那个版本的内核的基础上改的。其它版本的应该也类似,仅供参考。
开发板:mini2440-128M Nand Flash
Bootloader:u-boot-2009.11
具体步骤如下:
1.解压内核源码树
解压linux-2.6.29-mini2440-20090708.tgz到自己的工作目录,会生成一个友善之臂修改过的并且有几个mini2440默认配置文件的内核源码目录linux-2.6.29。具体步骤参照友善之臂mini2440开发板用户手册,具体不详述了。
2.修改内核配置选项
进入内核源码目录linux-2.6.29目录
#cp config_mini2440_t35 .config
#make menuconfig ARCH=arm
打开配置菜单,修改两个配置项,分别是:
a):General setup--选择 Initial RAM filesystem and RAM disk...... 项
b):Device Drivers--Block devices--选择 RAM block device support 项
并检查Optimize for size是否被选中,如果没有则选中,此项优化内核大小,根据需要进行配置。
修改(8192)Default RAM disk size kbytes选项为(4096)Default RAM disk size kbytes,之所以修改是因为我之后制作的ramdisk是4096KB大小的。当然如果你想制作8192KB大小的ramdisk,这里就要对应为8192了,以此类推。但是最小系统嘛,是不用那么大的ramdisk的。此项的默认配置就是(4096),以前我改过这个配置,所以是(8192)了。如果这个大小和你做的ramdisk不匹配,则启动时仍然会出现kernel panic内核恐慌,提示ramdisk格式不正确,挂载不上ramdisk。
然后特别要注意的一点是,ramdisk是一种内存虚拟磁盘技术,实质上并不是一种文件系统,它使用的文件系统时ext2文件系统。所以一定要在make menuconfig ARCH=arm的时候进入File systems菜单,选上* Second extended fs support。以提供内核对ext2文件系统的支持。我以前添加过了ext2文件系统了,所以开始的时候在此没有说明,在此为了说明为什么有的人照着我的方法做了,但是仍然kernel panic,特别把这一步也加上。
然后保存配置退出。
这样就为内核添加好了ramdisk启动功能和ramdisk的驱动支持了。
3.修改内核启动参数
方法有二:
a):修改.config的第310行,修改CONFIG_CMDLINE=""的定义
修改为CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"
保存。
意思为从ramdisk启动,ramdisk压缩文件起始地址在内存地址0x31000000处,文件大小为0x200000。
此参数也可以在make menuconfig ARCH=arm时进入Boot options菜单,然后在Default kernel command string里修改。效果是一样的。
b):或者不修改.config的的第310行CMDLINE定义,而是用u-boot的bootargs环境变量来传递启动参数。
同样也是修改该环境变量为bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
并saveenv保存u-boot环境变量
以上a),b)的效果是一样的。
4.编译内核
#make zImage ARCH=arm CROSS_COMPILE=arm-linux-
然后是二十分钟左右的等待。
编译完成后在当前目录下就出现了zImage内核映像了。
好像友善之臂把内核源码目录里的uImage目标给注释了,以前在论坛里看到过有人说,直接make uImage好像提示没有uImage的目标。所以我就先制作zImage,然后再用u-boot的mkimage工具转化为uImage。其实uImage就是在zImage的开头部分增加了一个64字节的内核映像说明。
5.制作uImage内核映像
由于我使用的Bootloader是u-boot,所以要将zImage转化为uImage,方法如下:
#mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n "Linux kernel Image" -d zImage uImage-ramdisk
说明:mkimage工具是u-boot格式uImage内核映像制作工具。如果成功编译u-boot之后,它会在u-boot源码树下的tools目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便使用。mkimage使用时的具体参数不再详述,不清楚的请自己查阅。
6.制作ramdisk根文件系统
该过程是制作ramdisk根文件系统的核心步骤,方法如下:
a)创建根文件系统目录:
#cd转入到你的工作目录。
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules
b)创建最基本的设备文件:
#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
#cd ..
c)安装/etc配置文件:
这里可以直接把友善之臂的root_qtopia里的几个基本的配置文件拷贝过来,只拷贝必要的即可,并对其内容进行删减,因为我做的ramdisk并不包含Qtopia等,全拷贝过来也没有用。
我是从网上找的最小系统的etc配置文件直接解压到我制作的根文件系统里了,并做参照友善之臂的root_qtopia添加了一些内容,见最后的说明。
操作如下:
#tar etc.tar.gz -C /xxx/rootfs
xxx表示你要制作的rootfs所在的目录。
d)编译内核模块:
方法是如下:
进入Linux内核源码目录(linux-2.6.29)
#make modules ARCH=arm CROSS_COMPILE=arm-linux-
e)安装内核模块:
#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
xxx表示你要制作的rootfs所在的目录。
f)配置busybox
进入busybox目录执行#make menuconfig
进入Busybox Settings - build Options -选中"Build busybox as a static binary“,即静态链接,免去拷贝大量的库文件。
Installation Options - 选中"Don't use /usr",以免busybox不慎被安装到宿主机系统的相应目录下,破坏宿主机系统。
Busybox Installation Prefix (/xxx/rootfs),修改该选项表明编译后的busybox将安装到该位置。
g)编译、安装busybox
#make ARCH=arm CROSS_COMPILE=arm-linux-
几分钟编译完成后
#make install
安装到Busybox Installation Prefix (/xxx/rootfs)设定的目录里。当前为我要制作的根文件系统目录(/xxx/rootfs)。
求一份gavotte写的ramdisk源码! 可以给双倍分。
我这里有一份,不过貌似不是gavotte的;驱动代码都差不多的,要的话留下邮箱吧
下面是代码里的一些信息,自己看下是否需要
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060 USA
//
// Copyright (c) 1998 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
// RAMDISK.C - main module for VxD RAMDISK
// Copyright (c) 1996, Compuware Corporation
如何从boot.img提取ramdisk文件
首先你要有一个用户解锁fastboot的手机,这样才能允许你刷入第三方ROM
其次你要能找到当前版本所对应的boot.img或sec_boot.img(带签名),通常能拿到的也就是刷机包里面解出来的sec_boot.img,通过cat mtd出来的不知道行不行=。=
工具:
split_bootimg.pl
mkbootfs和mkbootimg
1)sec_boot.img是经过签名的,需要把文件前0x1000个字节删除,也就是ANDROID! 8个字符前面所有字节删除,保存为boot.img
2) 运行perl split_bootimg.pl boot.img解出kernel和ramdisk文件,同时记下运行结果中的“Command line: vmalloc=384M mem=2044m@0x200000。。。。”一长串字符备用
3)运行指令把ramdisk的文件解出来
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
cd ..
4)修改其中的文件,例如我觉得default.prop里面的persist.sys.usb.config=manufacture,adb不太爽,想改成=adb,修改保存。如果你想adb有root权限的话,就去改ro.secure和ro.debuggable
5)重新打包
mkbootfs ./ramdisk | gzip ramdisk-new.gz
当然如果你自己编译的mkbootfs也没有加到path里,就把编译完的程序考到当前目录,运行./mkbootfs...
生成boot-new.img
mkbootimg --cmdline '单引号里面这一段拷贝刚才记下的Command line冒号后面的一长串' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
6) 现在如果把生成的boot-new.img直接刷进去,手机就起不来了,问题在于kernel,ramdisk,second stage,tags的地址,
自己编译的mkbootimg查看一下.c文件就知道base=0x10000000,生成的boot-new.img是按照这个规则来的:
kernel地址=base + 0x00008000,ramdisk地址=base + 0x01000000,
second stage地址=base + 0x00f00000,tags地址=base + 0x00000100。
这跟原始sec_boot.img里面的地址是不一样的,本想找到正确的base值,但原始img的几个地址并非此规律,拿不到源码只能干瞪眼喽,
最简单的办法就是用16进制编辑器将boot-new.img对应的4个地址修改为原始值,如图:
7)保存后就可以fastboot刷入这个boot了,然后就是验证一下能否启动啦^_^,启动不了也不至于变砖,因为咱recovery和fastboot没刷,可以利用这两种方法恢复
les ARCH=arm CROSS_COMPILE=arm-linux-e)安装内核模块:#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfsxxx表示你要制作的rootfs所在的目录。f)配置bus