boot.img文件结构实例解析
linux的几个内核镜像格式Image和u-boot启动内核和文件系统时的一些环境变量的设置
linux的几个内核镜像格式Image和u-boot启动内核和文件系统时的一些环境变量的设置关于编译powerpc linux的几个Image参考原文 /s/blog_86a30b0c0100wfzt.html转载▼PowerPC架构 Linux和ARM,X86等平台有些差异,PowerPC平台HW参数不是通过命令行方式传递到Linux,而是通过传递Device tree文件的方式传递参数,所以PowerPC平台Linux需要编译dtb和uImage才能正常加载,另外PowerPC架构linux还提供simpleImage的方式加载,也就是将dtb与uImage或将dtb,uImage 与ramdisk.image.gz多个文件整合生产单个simpleImage文件,这种simpleImage文件加载方式适合于没有bootloader支持的情况下,通过JTAG将simpleImage直接加载到target board内存中运行,对于调试非常方便,下面说说这几种Image文件的编译:1,dtb:dtb文件由dts生成,对于任何一个PowerPC处理器板,都要有对应的dts文件,dts文件主要是对目标板的HW参数进行描述,比如我的目标板是evm440(Powerpc440),我编写了一个evm440.dts文件放到内核arch/powerpc/boot/dts/目录下.编译evm440.dtb文件命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- evm440.dtb编译成功后会在arch/powerpc/boot/下生成evm440.dtb文件,这就是我们需要的dtb文件.2. uImage:这个Image应该是地球都知道的,这里就不多说了,编译命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- uImage编译成功后会在arch/powerpc/boot/下生成uImage文件,这就是我们需要的内核Image文件.3. simpleImage.xxxx和simpleImage.initrd.xxxx:这里的xxxx是特定目标板名字,我的目标板是evm440,也就是simpleImage.evm440和simpleImage.initrd.evm440。
如何解包/编辑/打包boot.img文件
目录1、背景知识2、boot和recovery映像的文件结构3、对映像文件进行解包、编辑、打包的常规方法3.1、另一种解包、编辑、打包的方法4、将新的映像刷回到手机5、解包、编辑、打包为我们带来了什么6、本文讲的内容与使用update.zip刷机包不是一码事正文1、背景知识Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:#cat /proc/mtddev: size erasesize namemtd0: 00040000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 04380000 00020000 "system"mtd4: 04380000 00020000 "cache"mtd5: 04ac0000 00020000 "userdata"注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。
在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。
从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
android主要镜像(image)解析
android主要镜像(image)解析img解析:ramdisk.img:android根文件系统,在android编译系统生成的out/target/product/root目录中结构:./init.trout.rc./default.prop 保存一些调试参数,对于开发者相当重要./proc./dev./init.rc 一些启动参数./init./sys./init.goldfish.rc./sbin./sbin/adbd./system system.img挂载点./data userdata.img挂载点userdata.img 保存用户、应用信息。
结构:/data/app 所有安装后的app会移至此处,apk被拆成dex和apk,dex为目标文件,apk为资源包/data/data 应用程序内部存储信息,sharepreference、database,etcsystem.img 包含整个android系统结构:system/app android出厂内置应用在此,同时,在这里的app可以获得一些特别的权限。
system/framework android框架在此,不宜乱动,开发者可以使用adb push + 拔电池开关机可以快速验证问题。
(前提是eng 版本)Special App:SystemUI.apk 状态栏藏在里面。
framework-res.apk包含整个系统res文件夹 including 系统UI、一些配置参数、theme、style、animationrecovery.img 按power键+音量上键(android默认)可以进去,可以执行T卡升级,format,backup userdata,restore userdata 结构:不知道boot.img 包含一个linux kernel (maybe named as zImage)和一个ramdisk。
img文件结构在源码system/core/mkbootimg/bootimg.h中声明uboot.img android启动时第一个加载的镜像,初始化硬件和基本输入出系统。
bootimg的详细介绍&使用实例
文件系 /挂载点/
统
大小
描述
BOOT: /dev/mtdblock[?]
/
(RAM)
Raw
内核、内存盘和引导配置。
DATA:
/dev/mtdblock5
/data/ yaffs2
91904kb
用户、系统配置,软件配 置以及软件(没有 a2sd 的
话)
CACHE:
/dev/mtdblock4
/cache/ yaffs2
*/
boot 的 ramdisk 映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文
件,例如:初始化 init 进程以及 init.rc(可以用于设置很多系统的参数)等文件。
以下是一个典型的 ramdisk 中包含的文件目录列表:
│ default.prop
│ init
│ init.goldfish.rc
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
│ default.prop
│ init
│ init.rc
│ initlogo.rle
//开机第二屏图片
│ ueventd.goldfish.rc
│ ueventd.rc
│ ueventd.swift.rc
│
├─data
├─dev
├─etc
│ recovery.fstab
华为荣耀B876版ROOT成功 附BOOT文件及原始BOOT文件
华为荣耀B876版ROOT成功附BOOT文件及原始BOOT文件温馨提醒:刷机有风险root需谨慎今天在论坛上按照上面的方法成功root了,下面是原帖的地址---/thread-14272558-1-497-1.html第一次用安卓手机.今天root成功后把里面自带的程序用RE管理器给删了一部分,qq没有删(有人反映说删掉qq后系统不稳定所以不敢删),现在一切正常.下面是我重新上传的BOOT 文件,已经制作成了2个压缩包了,方便下载boot.part1.rar (2.86 MB)boot.part2.rar (1.57 MB)(2个压缩包要一起下载,放在同一个文件夹里面解压其中的一个就可以了)下面附上原作者的方法;1.下载并解压root文件。
2.音量加+音量减+开机键进入粉屏。
在这之前请不要勾选快去“快速启动”,否则无法进入粉屏,设置--应用程序--快速启动,把√去掉即可。
如果刚刷过机,请删除SD卡中的“dload”文件夹。
3.用数据线连接电脑。
电脑中会出现一个可移动磁盘。
把解压出来的文件“boot.img”复制到可移动磁盘中image 文件夹,替换原有的boot.img文件。
4.拔电池,重启。
5.OK了。
启动手机后手机里面多了一个授权管理就说明ROOT成功了,可以使用RE管理器删除自带的程序了,打开RE,找到system文件夹然后再找到app文件夹,左上角挂载为读写就可以删除程序了手机上那些烦人的下拉菜单中的软件广告再也没有了,呵呵另外再送上我备份的手机系统自带的原始BOOTB876版的boot.part1.rar (2.86 MB)boot.part2.rar (1.15 MB)。
刷机失败问题解析
======== (command write failed (Invalid argument)) / 8672 ======== 翻译:命令写入失败(无效参数)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)(手机助手冲突)======== (command write failed (No such device or address)) / 26709 ========翻译:命令写入失败(没有这样的设备或地址)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (No such file or directory)) / 893 ========翻译:命令写入失败(没有这样的文件或目录)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Too many links)) / 1771 ========翻译:(命令写入失败(太多的链接)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Too many open files in system)) / 4 ========翻译:命令写入失败(系统中打开文件过多)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Unknown error)) / 1407 ========翻译:(命令写入失败(未知错误)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (No such device or address)) / 302 ========翻译:数据传输失败(没有这样的设备或地址)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (No such file or directory)) / 17 ========翻译:数据传输失败(没有这样的文件或目录)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (Too many links)) / 5141 ========翻译:数据传输失败(太多的链接)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (Unknown error)) / 1927 ========翻译:数据传输失败(未知错误)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (remote failure) / 14 ========翻译:(远程故障)PS:在刷机途中插入了另外一部手机。
android img 的编译过程
android img 的编译过程
Android img的编译过程通常包括以下步骤:
在Android源码根目录下执行初始化环境命令:source build/envsetup.sh。
使用lunch命令选择需要编译的版本,如:lunch full-eng。
执行make命令进行编译,如:make bootimage,这个命令会编译生成boot.img。
boot.img的生成过程主要是将kernel、ramdisk、dtb打包到一起。
在这个过程中,需要用到dtb.img,如果dtb.img过大导致编译不过,那么需要分析dtb.img的生成过程。
dtb.img实际上是将kernel下的dts文件重新命名后拷贝到out目录下生成的。
此外,编译Android系统时,make命令实际上是在执行Makefile文件。
Android系统的Makefile文件在源码根目录下,并且这个Makefile文件会包含另一个主要的Makefile文件,即main.mk。
在main.mk中,定义了一个默认目标droid,这个目标依赖于droid_targets。
droid_targets又依赖于droidcode和dist_files两大伪目标。
当执行make命令时,make工具会检查并解析这些依赖关系,然后按照依赖顺序生成目标文件。
BOOT的简单移植教程
基于论坛蛙友的要求,所以今天跟大家探讨一下BOOT的简单移植。
今天咱只说说简单的移植,不说美化!!~好了,具体操作如下:移植准备:1:官方BOOT.IMG2:乐蛙包里的BOOT或者其他机型里面的BOOT。
(尽量找跟自己的手机按键位置相同的)3:移植软件:BOOTIMG.EXE移植方向:用官方kernel??内核文件,用乐蛙包里的RAMDISK文件,然后打包。
就OK了,移植步骤:本帖隐藏的内容1:首先将官方BOOT放到BOOTIMG的工作文件夹一面。
然后运行CMD,然后用CD命令进入到你的BOOTIMG的工作文件夹下面,然后输入BOOTIMG.EXE如果出现帮助了就OK了。
2:在CMD里面运行命令:bootimg --unpack-bootimg,在BOOTIMG文件夹下面就产生了??kernel??内核文件??和??ramdisk??磁盘镜像文件??这两个文件是解压BOOT.IMG产生的。
此时不要关闭CMD窗口,在CMD右键选择标记,将你键入bootimg --unpack-bootimg这个命令,产生的信息复制下来,最好是粘贴到文本里面。
因为等一下打包要用这些信息。
然后复制刚刚生成出来的??kernel??内核文件? ? 复制到别出,等一下还要用。
然后删除BOOTIMG工作文件夹下的kernel 和ramdisk??和官方的BOOT.IMG文件3:将乐蛙的BOOT.ING复制到BOOTIMG的工作文夹件执行第二步的解压命令,也会产生kernel??内核文件??和??ramdisk??磁盘镜像文件,这时候我们删除kernel??内核文件,然后把刚刚复制到别处的官方的??kernel??再复制到这里来。
并删除乐蛙的BOOT.IMG4:把ramdisk重命名为ramdisk.gz? ?在CMD里面运行打包命令。
bootimg --repack-bootimg?0x200000?console="ttyMSM1 androidboot.hardware=qcom"4096 4096把红色部分改成刚刚你解压官方的BOOT.IMG的时候叫人复制到文本里面的信息。
使用fastboot工具刷入recovery.img、boot.img、system.im...
使用fastboot工具刷入recovery.img、boot.img、system.im...使用fastboot工具刷入recovery.img、boot.img、system.img 等下载解压:fastboot工具解压FastBoot工具.zip ,将解压得到的FastBoot文件夹复制到任意盘如:D盘,,将要刷入手机的recovery.img、recovery.img等放到FastBoot文件夹安装好手机型号对应的USB驱动,手机进入fastboot模式打开cmd,进入fastboot文件所在目录cd /d d:\fastboot刷recovery.img:fastboot flash recovery recovery.img或fastboot.exe flash recovery recovery.img如果img文件名为:recovery5.0.img,命令则是:fastboot.exe flash recovery recovery5.0.img或更名recovery.img用对应命令刷入即可。
刷system.img:fastboot flash system system.img重启手机命令:fastboot.exe rebootfastboot刷入命令格式:fastboot flash 系统分区对应的name.img用批处理更方便,如果名字不是recovery.img重命名为recovery.img或修改批处理,下面的批处理都是刷命名为:recovery.img system.img boot.img的批处理:将下载的recovery5.0.img等文件命名为recovery.img、system.img双击对应批处理可直接刷入recovery.img boot.img等.bat 批处理可用TXT记事本打开修改!Android系统的分区为:system分区对应的目录/system ,userdata分区对应 /data ,cache分区对应 /cache ,可用ADB 或超级终端通过命令查看系统分区,命令如下:sucat /proc/mtd假设mtd1对应boot分区,mtd2对应system分区,备份导出boot.img与system.img命令如下:cat /dev/mtd/mtd1 > /sdcard/boot.imgcat /dev/mtd/mtd2 > /sdcard/system.img/data刷入命令是,文件名为userdata.img :fastboot flash userdata userdata.img或文件名为data.imgfastboot flash userdata data.img。
mkbootimg用法
mkbootimg用法首先需要明确的是,mkbootimg是一个可执行程序,用于生成Android设备的引导映像文件。
这个映像文件包括启动器、内核和根文件系统等必要的元素,是自启动Android设备所必需的重要文件。
本文将详细介绍如何使用mkbootimg生成自定义的引导映像文件。
第一步:准备工作在使用mkbootimg之前,需要准备以下文件:1. Android内核文件(vmlinuz)2. 根文件系统文件(ramdisk.img)3. 适配的硬件设备机型(例如Nexus 6P、Pixel、OnePlus 6T 等)将这些文件准备好以后,就可以开始使用mkbootimg来生成引导映像文件。
第二步:生成引导映像文件使用mkbootimg需要指定一些参数,具体如下:--kernel:表示内核文件路径。
--ramdisk:表示根文件系统文件路径。
--cmdline:表示传递给内核的命令行参数。
--base:表示内核加载的地址,默认为0x100000。
--pagesize:表示页面大小,Android中页面大小默认为2048字节。
--output:表示生成的引导映像文件的输出路径。
举例来说,可以使用以下命令生成引导映像文件:mkbootimg --kernel ./vmlinuz --ramdisk ./ramdisk.img --cmdline "console=ttyS0,115200n8 androidboot.console=ttyS0 androidboot.hardware=ranchu user_debug=31" --base 0x100000 --pagesize 2048 --output ./boot.img其中,路径参数需要根据实际情况替换成相应的文件路径。
第三步:刷写引导映像文件生成引导映像文件后,需要将其刷写到设备的引导分区才能让设备启动。
具体刷写方法因设备而异,一般可以通过刷机工具或者adb 命令行进行操作。
boot.img文件结构实例解析
接下来就是我们自己加在后面的 Magic formware 签名格式了。开始于 0x3E1000,Magic offset 为 4
kernel+ramdisk img 结构
cust_part.h
typedef union { struct { unsigned int magic; /* partition magic */ unsigned int dsize; /* partition data size */ char name[32]; /* partition name */ unsigned int maddr; /* partition memory address */ } info; unsigned char data[512]; } part_hdr_t;
PLATFORM := msm7k MEMBASE := 0x00000000 # SMI MEMSIZE := 0x00800000 # 8MB BASE_ADDR := 0x10000000
TAGS_ADDR := BASE_ADDR+0x00000100 KERNEL_ADDR := BASE_ADDR+0x00800000 RAMDISK_ADDR := BASE_ADDR+0x01000000 SCRATCH_ADDR := BASE_ADDR+0x02000000
根据上面的命令我们可以首先看看 mkbootimg 这个工具的源文件:system/core/mkbootimg /mkbootimg.c。看完之后我们就能很清晰地看到 boot.img 的内部构造,它是由 boot header /kernel /ramdisk /second stage 构成的,其中前 3 项是必须的,最后一项是可选的。mkbootimg 分析参数后,依 次写入 header, kernel ,ramdisk . header + padding + kernel + padding + ramdisk ƲANDROID!" 4 * 1, kernel 长度,小端 unsigned
magiskboot用法
magiskboot用法
Magiskboot是Magisk工具箱的一部分,用于处理Android设备的引导镜像文件。
它提供了一些功能,例如解包引导镜像、重新打包引导镜像、签名引导镜像等。
下面我会从多个角度介绍Magiskboot的用法。
1. 解包引导镜像:
要解包引导镜像,你可以使用以下命令:
magiskboot unpack boot.img.
这将解包boot.img文件,生成一个名为ramdisk的文件夹,里面包含了引导镜像的内容。
2. 修改引导镜像:
在解包后,你可以对ramdisk文件夹中的内容进行修改,例如添加或删除文件、修改属性等。
3. 重新打包引导镜像:
修改完成后,你可以使用以下命令重新打包引导镜像:
magiskboot repack.
这将生成一个新的boot.img文件,其中包含了你所做的修改。
4. 签名引导镜像:
在重新打包后,你可以使用以下命令对引导镜像进行签名:
magiskboot sign boot.img.
这将在boot.img文件中添加Magisk的签名,以确保在设备启动时能够正确加载修改后的引导镜像。
总的来说,Magiskboot提供了一种便捷的方式来处理Android 设备的引导镜像文件,使得用户可以进行各种定制化的修改,而不需要深入了解底层的技术细节。
当然,在使用Magiskboot时,务必谨慎操作,以免对设备造成不可逆的损坏。
androidboot.img拆包,修改adb具有root权限,以i9250为例
androidboot.img拆包,修改adb具有root权限,以i9250为例Android 系统的rom最主要的就是3个文件:boot.img、system.img、userdata.img。
其中boot.img 存放着内核以及Android系统的配置信息,比如android系统各文件夹的读写权限,adb 的权限。
所以如果你要修改文件夹的写权限,adb的root权限,修改boot.img对应的地方就ok了。
system.img中存放的是系统的各种库,系统预装的app等,userdata.img是一下用户的配置信息。
今天这里介绍怎么解开boot.img文件,修改对应的文件,使system 文件夹有写权限,adb 登录后为root用户。
下面所使用的方法需要一定的linux系统基础,如果你对linux系统一点都不了解,请慎重进行下面的操作。
1.拆包boot.img,这一步需要一个perl脚本,在我的资源里面有,叫split_bootimg.pl,这个脚本网上也有。
准备好了split_bootimg.pl 以后,在linux系统下,终端里输入:perl split_bootimg.pl boot.img执行上述操作后,i9250的boot.img拆开成两部分了:boot.img-kernel和boot.img-ramdisk.gz,boot.img-ramdisk.gz使用命令gunzip boot.img-ramdisk.gz解压为boot.img-ramdisk。
boot.img-kernel 是内核部分,这部分我们不能修改。
boot.img-ramdisk是我们要修改的部分。
下面进行拆分boot.img-ramdisk.2.可以用file boot.img-ramdisk 查看它格式,它是ASCII cpio archive格式的,要用特殊的命令揭开,命令如下:a.新建一个文件夹:mkdir ./tmpb. cd tmp/c. cpio -i -F ../boot.img-ramdisk这样boot.img-ramdisk中的内容全部解压到了tmp目录下。
boot文件详解
Windows NT类的操作系统,也就是Windows NT/2000/XP中,有一个特殊文件,也就是“BOOT.INI”文件,这个文件会很轻松地按照我们的需求设置好多重启动系统。
“BOOT.INI”文件会在已经安装了Windows NT/2000/XP的操作系统的所在分区,一般默认为C:\下面存在。
但是它默认具有隐藏和系统属性,所以你要设置你的文件夹选项,以便把“BOOT.INI”文件显示出来。
我们可以用任何一种文本编辑器来打开他它。
一般情况下,它的内容如下:[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\Windows[operating systems]multi(0)disk(0)rdisk(0)partition(1)\Windows="Microsoft Windows XP Professional" /fastdetect在Windows 2000或者是XP系统中,我们可以很容易的设置“BOOT.INI”文件。
那就是在“我的电脑”上面点击右键,选择“属性”打开“系统属性”对话框,再点击“高级”选项卡,在“启动和故障修复”里面点击“设置”按钮,就可以打开“启动和故障修复”对话框了,在这里面我们就可以对它进行详细设置。
如果你拥有Windows XP操作系统,那么你可以用“系统配置实用程序”来更方便的编辑“BOOT.INI”文件。
具体做法是:打开“开始”菜单,点击“运行”命令,再在弹出的文本框中输入“Msconfig”点击“确定”后就会弹出“系统配置实用程序”,再点击“BOOT.INI”选项卡,就会出现如图所示的界面。
在这里,我们可以很方便地设置文件。
言归正传,现在,来说明一下这个文件内容的含义。
1.系统加载部分([boot loader])这一部分很简单,只有两个设定。
那就是“timeout=”和“default=”。
修改boot指令大全骚们先收藏慢慢看吧
修改boot指令⼤全骚们先收藏慢慢看吧修改boot.img1、备份boot.img(前提是必须有root权限的⼿机)adb shellsucat /proc/mtd备份boot.img命令举例如下(切记⼿机不同,命令不⼀定相同,请核对⾃⼰⼿机上⼀步的显⽰):cat /dev/mtd/mtd1 >/sdcard/boot.img2、挂载主机的⼀个⽂件夹到VMware虚拟机(我⽐较习惯VMware)。
sudo mount -t vmhgfs .host:/ /mnt/hgfs/例如:挂载主机d:\123⽂件夹到虚拟机/mnt/hgfs/⽬录下,虚拟机访问修改/mnt/hgfs/mmm/⽂件夹下的⽂件相当于主机访问修改d:\123⽂件夹下的⽂件(mmm是d:\123共享到虚拟机的⽂件名)。
这样做的好处就是linux下解开要修改的⽂件,然后可以很⽅便的在windows下修改了。
若要详细设置挂载可以查看我的另⼀篇博⽂。
3、将所需⼯具放⼊/bin/⽬录下并添加执⾏权限:mv /mnt/hgfs/mmm/split_bootimg.pl /bin/mv /mnt/hgfs/mmm/mkbootimg /bin/mv /mnt/hgfs/mmm/mkbootfs /bin/chmod +x /bin/split_bootimg.plchmod +x /bin/mkbootimgchmod +x /bin/mkbootfs4、解开boot.imgmkdir /mnt/hgfs/mmm/bootcp /mnt/hgfs/mmm/boot.img /mnt/hgfs/mmm/boot/cd /mnt/hgfs/mmm/bootsplit_bootimg.pl boot.img此时BOOT⽬录下会多出⼏个⽂件,boot.img-ramdisk.gz和boot.img-kernel。
mkdir ramdiskcd ramdiskgzip -dc ../boot.img-ramdisk.gz | cpio -i我们对即将要修改的init.rc也备份⼀下吧:cp ./init.rc ../init.rc.backup5、修改init.rc使含有a2sd功能:a、搜索class_start default,在这⼀⾏之前,加⼊两⾏代码:start a2sdon property:cm.filesystem.ready=1b、在最末尾加⼊:service a2sd /system/bin/logwrapper /system/bin/sh /system/bin/a2sd disabledoneshotc、修改system为读写mount yaffs2 mtd@system /system rw remountd、修改su的相关代码:chown root system /system/bin/suchmod 4550 /system/bin/su改为:chown root root/system/bin/suchmod 6755 /system/bin/su6、加⼊第⼆屏要确定到底是那种格式的图⽚,⽅法是打开initrd\init⽂件,搜索logo,就会看到。
android中各种img文件的作用以及系统启动过程
android中各种img文件的作用以及系统启动过程android中各种img文件的作用以及系统启动过程2011-11-09 17:41首先通过编译,先将android内核编译成功。
正常情况下,在目录out/target.product/generic/(但是有的就没有generic文件,如freescale和iriver;但是lonshinetech下面就有这个文件,依据情况而定,只要能找到生成的三个文件就可以。
例如:~/freescale/R9.2/out/target/product/imx51_bbg$ )下会生成三个文件:ramdisk.img,system.img,userdata.img。
这三个文件的作用如下:(1)ramdisk.img一个分区影像文件,它会在kernel 启动的时候,以只读的方式被mount ,这个文件中只是包含了/init 以及一些配置文件,这个ramdisk 被用来调用init,以及把真正的root file system mount 起来。
#其实ramdisk.img的内容就是/out/target/product/generic/root目录的压缩而已。
方法1:android编译生成后的ramdisk.img是一个gzip 格式的文件,输入命令# file ramdisk.img, 会得到=>ramdisk.img: gzip compressed data, from Unix那么先解压ramdisk.img,因为后缀不是.gz,所以用—S选项, # gunzip -S .img ramdisk.img这样就得到一个新文件ramdisk.img,用# file ramdisk 查看格式, 得到=> ramdisk: ASCII cpio archive (SVR4 with no CRC) 可以看出解压生成的ramdisk是cpio格式的文件,再次解压,为了防止解压后文件混乱,首次建立一个目录如:# mkdir rfs //rfs可以用来放ramdisk解压后的文件, 进入# cd rfs解压# cpio -i -F ../ramdisk 方法2:将ramdisk.img复制一份到任何其他目录下,将其改名为ramdisk.img.gz,然后使用命令# gunzip ramdisk.img.gz,然后新建一个文件夹ramdisk,进入,输入命令# cpio -i -F ../ramdisk.img 得到结果如下drwxr-xr-x 8 root root 4096 2011-01-12 11:36 ./drwxr-xr-x 13 root root 4096 2011-01-12 11:35 ../drwxrwx--x 2 root root 4096 2011-01-12 11:36 data/-rw-r--r-- 1 root root 118 2011-01-12 11:36 default.propdrwxr-xr-x 2 root root 4096 2011-01-12 11:36 dev/-rwxr-x--- 1 root root 107784 2011-01-12 11:36 init*-rwxr-x--- 1 root root 492 2011-01-12 11:36init.freescale.rc*-rwxr-x--- 1 root root 1677 2011-01-12 11:36init.goldfish.rc*-rwxr-x--- 1 root root 18263 2011-01-12 11:36 init.rc*drwxr-xr-x 2 root root 4096 2011-01-12 11:36 proc/drwxr-x--- 2 root root 4096 2011-01-12 11:36 sbin/drwxr-xr-x 2 root root 4096 2011-01-12 11:36 sys/drwxr-xr-x 2 root root 4096 2011-01-12 11:36 system/ #可以看出这写文件是和root目录下的内容完全一样,其实就是对root目录的打包和压缩。
BOOT文件详解
[boot loader]timeout=2default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /detecthalc:\GHLDR=A key Host V2010.10.10c:\grldr="PE Server 2003"Windows XP主要依赖Boot.ini文件来确定计算机在重启(引导)过程中显示的可供选取的操作系统类别。
Boot.ini在缺省状态下被设定为隐含和系统文件属性, 并且被标识为只读文件。
attrib –s –r –h c:\boot.ini //使该文件解除系统属性、可读写、可显attrib +s +r +h c:\boot.ini //使该赋予系统系统属性、只读、隐藏该文件分为Boot loader(引导加载)和Operating systems(操作系统)两大部分。
在引导加载部分,timeout=xx表示等待用户选择操作系统的时间,默认是30秒,用户可以根据需要自行更改。
default=xxxx表示缺省情况下系统默认要加载的操作系统路径,表现为启动时等待用户选择的高亮条部分。
但是令很多用户困惑不解的是,那些“multi(0)disk(0)rdisk(0)partition(1)”是什么意思?实际上这是根据ARC规则命名的,它是x86或RISC计算机中用于标识设备的一种通用方法。
ARC名字指向存放操作系统文件的分区,对于磁盘设备, ARC 名字的构成如下:(X)disk(Y)rdisk(Z)partition(Q)1、Component部分有两种有效值,即multi和SCSI,它用于标明硬件适配器。
magisk修改boot.img原理
magisk修改boot.img原理Magisk修改boot.img原理[引言]随着安卓系统的不断发展,越来越多的用户开始尝试对手机进行Root和定制化操作。
而Magisk作为一款较为知名的Root工具,其强大的功能和稳定性深受用户喜爱。
其中,Magisk通过修改boot.img来实现Root和系统定制化。
本文将详细介绍Magisk修改boot.img的原理和步骤。
[boot.img是什么]在深入了解Magisk修改boot.img的原理之前,我们首先要了解boot.img是什么。
boot.img是安卓系统引导镜像文件,包含了启动Android系统所需的所有文件和配置。
其中包括了Linux kernel、initrd和设备树等,是Android系统启动的关键文件。
[Magisk是什么]Magisk是一款开源的Android软件,其主要功能是进行系统定制化和Root。
通过Magisk的安装,用户可以获得管理员权限并且进行深度定制化操作。
Magisk采用了一种无损的Root方式,可以通过修改boot.img的方式来实现。
[Magisk修改boot.img原理]Magisk修改boot.img的原理主要是通过修改Android系统的引导镜像文件boot.img,实现Root和定制化。
通过修改boot.img,Magisk可以实现Root 权限获取、系统级别的模块加载以及系统分区的修改等操作。
具体来说,Magisk 使用了一种叫做“隐藏”的技术,将Root和模块等操作隐藏在了系统中,从而避免了一些应用程序检测Root的问题。
[Magisk修改boot.img的步骤]接下来我们来具体了解Magisk修改boot.img的步骤:第一步:解锁手机的Bootloader。
在进行boot.img的修改之前,需要先解锁手机的Bootloader。
这是因为bootloader是安卓系统启动的关键组件,只有解锁了bootloader,才能对boot.img进行修改。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PLATFORM := msm7k MEMBASE := 0x00000000 # SMI MEMSIZE := 0x00800000 # 8MB BASE_ADDR := 0x10000000
TAGS_ADDR := BASE_ADDR+0x00000100 KERNEL_ADDR := BASE_ADDR+0x00800000 RAMDISK_ADDR := BASE_ADDR+0x01000000 SCRATCH_ADDR := BASE_ADDR+0x02000000
header 补齐page_size大小,kernel 从0x800开始,实际内容结束位置0x315778+0x800=0x315F78, 结 束于(1+n)*page_size -1= 0x316000 - 1 经过512byte(0x200)的信息头。Kernel内容开头标志重复8遍的0000A0E1。Kernel实际大小结束后0填充, 即padding剩余页空间。 (512byte信息头是由mkimage工具里面决定的。稍后介绍其结构。)
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr ** 6. if second_size != 0: jump to second_addr ** else: jump to kernel_addr */
boot header 为包括命令行参数等等,地址为 000-----0xFFF ramdisk 为 1F8B0800000000 开头 kernel 为 0000A0E1 重复 8 遍开头
根据上面的命令我们可以首先看看 mkbootimg 这个工具的源文件:system/core/mkbootimg /mkbootimg.c。看完之后我们就能很清晰地看到 boot.img 的内部构造,它是由 boot header /kernel /ramdisk /second stage 构成的,其中前 3 项是必须的,最后一项是可选的。mkbootimg 分析参数后,依 次写入 header, kernel ,ramdisk . header + padding + kernel + padding + ramdisk + padding + ... 4 * 2, magic,固定为"ANDROID!" 4 * 1, kernel 长度,小端 unsigned
out/host/linux-x86/bin/mkbootimg --kernel out/target/product/msm7630_surf/kernel --ramdisk out/target/product/msm7630_surf/ramdisk.img --cmdline "console=ttyMSM1,115200n8 androidboot.hardware=qcom" --base 0x00200000 --pagesize 4096 --output out/target/product/msm7630_surf/boot.img
/* ** ++ ** | boot header | 1 page ** ++ ** | kernel | n pages ** ++ ** | ramdisk | m pages ** ++ ** | second stage | o pages ** ++ ** ** n = (kernel_size + page_size 1) / page_size ** m = (ramdisk_size + page_size 1) / page_size ** o = (second_size + page_size 1) / page_size ** ** 0. all entities are page_size aligned in flash ** 1. kernel and ramdisk are required (size != 0) ** 2. second is optional (second_size == 0 > no second) ** 3. load each element (kernel, ramdisk, second) at ** the specified physical address (kernel_addr, etc) ** 4. prepare tags at tag_addr. kernel_args[] is ** appended to the kernel commandline in the tags.
由此可知 boot_img_hdr 中各成员值为:
magic[BOOT_MAGIC_SIZE] = "ANDROID!" kernel_size kernel_addr ramdisk_size = = = 0x00315778 0x10008000
0x000CAF13 0x11000000 0x00000000 0x10f00000 0x10000100 0x00000800
#define BOOT_MAGIC "ANDROID!" #define BOOT_MAGIC_SIZE 8 #define BOOT_NAME_SIZE 16 #define BOOT_ARGS_SIZE 512 struct boot_img_hdr { unsigned char magic[BOOT_MAGIC_SIZE]; unsigned kernel_size; /* size in bytes */ unsigned kernel_addr; /* physical load addr */ unsigned ramdisk_size; /* size in bytes */ unsigned ramdisk_addr; /* physical load addr */ unsigned second_size; /* size in bytes */ unsigned second_addr; /* physical load addr */ unsigned tags_addr; /* physical addr for kernel tags */ unsigned page_size; /* flash page size we assume */ unsigned unused[2]; /* future expansion: should be 0 */ unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ unsigned char cmdline[BOOT_ARGS_SIZE]; }; id[8]; /* timestamp / checksum / sha1 / etc */
接下来就是我们自己加在后面的 Magic formware 签名格式了。开始于 0x3E1000,Magic offset 为 4
kernel+ramdisk img 结构
cust_part.h
typedef union { struct { unsigned int magic; /* partition magic */ unsigned int dsize; /* partition data size */ char name[32]; /* partition name */ unsigned int maddr; /* partition memory address */ } info; unsigned char data[512]; } part_hdr_t;
经过分析:boot.img 与 recoveryimg、factoryimg 共用相同的结构,他们之间不同在于 Ramdisk 的内容, 线索在 load_image.c 中 check img info 使用相同结构体声明各个 img。 boot 镜像不是普通意义上的文件系统,而是一种特殊的 Android 定制格式,由文件头信息 boot header, 压缩的内核,文件系统数据 ramdisk 以及 second stage loader(可选)组成,它们之间非页面对齐部分 用 0 填充,可以从 mkbootimg.h 文件中看到。 文件头信息的具体结构可以在 system/core/mkbootimg/bootimg.h 中看到:
ramdisk 映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化 init 进程以及 init.rc(可以用于设置很多系统的参数)等文件。以下是一个典型的 ramdisk 中包含的文件 列表: ./init.trout.rc ./default.prop ./proc ./dev ./init.rc ./init ./sys ./init.goldfish.rc ./sbin ./sbin/adbd ./system ./data
ramdisk接着kernel开始于0x316000,实际内容结束位置0xCAF13+0x316000=0x3E0F13,结束于 (1+n+m)*page_size -1= 0x3E1000 – 1 经过512byte的信息头。Ramdisk内容开头标志1F8B0800000000。Ramdisk实际大小结束后0填充,即 padding剩余页空间。
4 * 1, kernel 地址,应为 base + 0x00008000 (base 根据对应平台的 rules.mk 指定) 4 * 1, ramdisk 长度,小端 unsigned 4 * 1, ramdisk 地址,应为 base + 0x01000000 4 * 1, second stage 长度,小端 unsigned,为 0 4 * 1, second stage 地址,应为 base + 0x00f00000 4 * 1, tags 地址,应为 base + 0x00000100 4 * 1, page 大小,小端 unsigned, 为 2048 或者 4096 4 * 2, 未使用,固定为 0x00 4 * 4, 板子名字,一般为空 4 * 128, 内核命令参数 4 * 8, id, 为 sha 之类,实际写 0x00 就可 padding, 以上 header 为 608 字节,把这部分补齐到 page_size 大小 kernel_size, kernel 内容 padding,把 kernel_size 补齐到 page_size ramdisk_size, ramdisk 内容 padding, 把 ramdisk 补齐到 page_size second_size, second 内容,一般为 0 padding, 补齐 second_sise 为 page_size,一般为 0 配合 boot.img 来看会比较好理解.