Boot ROM的过程是固定资产的定义的吗

技术人员解释一下,boot,rom是什么意思?_百度知道
技术人员解释一下,boot,rom是什么意思?
boot里面包含什么?大约的我知道一点,应该是启动用的运行文件吧,但是rom里面都有什么?还有刷机里用的那几个文件都有什么用处?
我有更好的答案
去百度搜,,好象是最高权限
采纳率:64%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。后使用快捷导航没有帐号?
查看: 4237|回复: 3
【转】HPS典型的启动流程与BOOT ROM执行流程的应用笔记
在线时间3649 小时
威望5168分
芯币12480枚
E金币387枚
TA的帖子TA的资源
HPS典型的启动流程与BOOT ROM执行流程的应用笔记 HPS作为一个SoC器件,所有执行程序都要遵循严格的启动流程,本文针对对于HPS的启动引导流程不曾关注过或者不是十分清楚的开发人员。HPS的启动是多阶段的流程,每一个阶段都会完成自己相应的工作并把下一阶段的执行代码引导起来。下图展示了一个典型的HPS的启动流程
1.jpg (8.33 KB, 下载次数: 2)
15:41 上传
HPS 典型的启动流程 系统复位(上电或者硬件复位)之后,HPS内部boot Rom开始在CPU0上执行(通过指定复位向量指定BOOT ROM区域实现自动执行BOOT ROM),完成工作并引导用户程序,当然用户程序的构架会因为具体引用有所差别!
此处先介绍Boot ROM! 总的来说,Boot ROM是HPS内核的一段ROM上固化的可执行程序,完成的工作是系统复位以后,执行引导preloader并把CPU使用权交给preloader 的过程!特殊情况是不需要执行preloader而直接引导应用程序,这种情况是可能的,比如DS-5中baremental HelloWorld程序,但是这种情况并没有实际运用意义:其一是限制了程序大小,容量受片上RAM限制;其二是运用程序基本只能够使用到MPU内部的寄存器,外设没有被初始化(没有相应的时钟)。所以更多的应用是Boot ROM通过引导preloader把CPU使用权交给preloader进行后续的引导工作。
BOOT ROM除了引导用户软件外还完成的具体工作有:
●&&使能指令缓存, branch predictor,浮点单元,NEON 向量单元[在ARM内部做过图形加速的可能比较熟悉]
●&&设定看门狗0定时器,BOOT ROM保留适用,参考文档 page A-11
●&&根据CLKSEL设定配置MainPLL 和外设PLL
●&&根据BOOTSEL设定配置I/Opin的复用(此处应该只是完成了QSPI or SPI Flash or SDMMC controller 的pin的复用,更多的pin的复用需要根据preloader才能够完成设定)
● 初始化FLASH Controller 到默认设置
BOOT ROM 引导的preloader来源分为三类:
▲片上RAM热启动,对应下图中的矩形框①
如果之前执行过一次preloader了,preloader会留在On-chip RAM 中,按下WARM reset 后,会首先选择从on-chip ARAM 启动,此过程具有最高优先权,但是从on-chip ARAM 启动时会对遗留的preloader代码进行CRC校验(具体是否校验用户可以通过warmramgrp配置决定),校验成功才会执行。防止了用户对ON-chip 里的内容进行更改!如校验失败,会选择从Flash中启动preloader,对应图中矩形框 ③
▲从FPGA部分冷启动,对应下图中的矩形框②
具有第二优先权,如果用户设定了bootsel从FPGA启动,则会等待FPGA配置成功[通过FPGA manager获取FPGA的状态]!HPS会通过 HPS-to-FPGAbridge执行位于 0xC0000000【相对于HPS-to-FPGAbridge偏移地址为0】的momory中的指令。对应着GHRD中on-chip memory的功用,这里大概知道即可。
▲ 从Flash 存储器启动,对应图中矩形框④
▲ 如果在Flash中找不到preloader的话,则会检验FPGA处的回调镜像(callback image)【这个image暂没有见到更多说明和使用】
▲依然不成功就只能坐等被复位了!见图中矩形框 ⑤ 、 ⑥
2.jpg (71.14 KB, 下载次数: 2)
15:41 上传
BOOT ROM执行流程 说明:
⑴只有冷启动才会选择从FPGA 引导
⑵不论热启动还是FPGA冷启动,如不成功都会进入到了红色框的QSPI启动中
⑶ 矩形框②中的yes 和 no 由bootsel 决定,矩形框③、④中最后具体是使用哪个FLASH存储器也由bootsel管脚决定。
上文中讲到BOOT ROM在HPS启动过程中的左右以及搜寻preloader的工程,接下来介绍preloader的相关理论知识。后面会介绍如何生成preloader,并讲述如何在从SD 卡启动的时候更新preloader。 preloader的命名是相对于BOOTLoader的!其作用类似于PC主板上的BIOS。BIOS基本上是系统启动启动 之前控制着板上的硬件设备,引导系统启动程序。preloader在HPS系统中完成功能主要包括了系统时钟配置,所有pin脚的复用配置,存储器的初始 化以及引导下一步用户软件!下一步用户软件可以直接是用户的baremental 程序,也可以不需要bootloader的系统程序,如ucos,或者是操作系统的引导程序,如u-boot。 此处列出HPS启动过程中三大典型用户软件构架:
①preloader+baremental code
②preloader+无bootloader的操作系统(如ucos)+用户定义软件
③preloader+bootloader code(如u-boot)+操作系统(如linux)+用户定义软件
preloader从BOOT ROM中接手CPU的时候CPU的状态列表(可能对于进行汇编开发或者AMP构架开发的用户有用):
(以下仅适用于CPU0从FLASH memory 启动的状态)
● 指令缓存使能
● Branch predictor 使能
● 数据缓存使能
● MMU 没有被使能
● 浮点单元使能
● NEON 向量单元使能
● ARM处理处于secure supervisor状态
ARM Cortex-A9 MPCore 的寄存器的值:
● r0—共享内存的地址指针, 共享内存用于在BOOTROM和preloader直接传递数据.共享内存位于on-chip RAM的高4K地址.
具体内容参考文档page A-8。
● r1—共享内存的大小.
● r2—复位值0x0.
● r3—保留.
其他寄存器的状态无定义。
如果CPU0从FPGA BOOT或者CPU1参与了boot,以上描述皆不适用!
另外,prelaoder接手CPU的时候,还有下面两个状态:
●&&boot ROM 被映射在地址0x0。需要重新映射on-chip RAM 使得异常可以被preloader执行。
●&&L4 看门狗0定时器处于激活状态并已触发。preloader可以任意处理此定时器。
preloader具体完成的工具包含了下面部分:
■&&初始化SDRAM接口.
■&&配置 remap 寄存器,把ton-chipRAM 映射至地址0x0,异常会被preloader处理.
■&&on-chip RAM 可以被读写,初始地址从0x0对齐.
■&&通过scan manager配置HPS I/O.
■&&通过system manager配置pin 复用.
■&&通过clock manager配置HPS clocks .
■&&初始化包含了下一阶段启动代码的flash控制器(NAND, SD/MMC, or quad SPI).
■&&把下一阶段启动或者叫用户代码引导入SDRAM并把控制权交至下一段代码.
●用户可以在preloader阶段使用HPSconfigure FPGA
preloader 的具体执行流程有机会会结合preloader code 讲述!
本文参考:①Altera Booting and Configuration Introduction Document:
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
在线时间31 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 6, 距离下一级还需 194 积分
一粒金砂(中级), 积分 6, 距离下一级还需 194 积分
正在学,好东西啊
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 8, 距离下一级还需 192 积分
一粒金砂(中级), 积分 8, 距离下一级还需 192 积分
在线时间7 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
谢谢分享,明白了许多
EEWORLD 官方微信
Powered by[燃烧的ROM] ROM不求人,自己修改ROM初教程2[boot.img篇]
我的图书馆
[燃烧的ROM] ROM不求人,自己修改ROM初教程2[boot.img篇]
本帖最后由 sjssd 于
11:35 编辑
上一篇中介绍了一些ROM的基本知识,并举例修改了内置软件。现在我们要做的是,在boot.img中作修改,以达到向系统中插入新服务、植入新功能的目的。普遍来说,一般首先要做的就是开启APP2EXT。本文就以此举例。
& &PS:由于不同的机型的boot.img各不相同,本文仅以N600 的boot.img举例,但其他机型如何打包,也会有所涉及。总之,在看完本文后,诸位完全可以自行修改各机型的boot.img。毕竟,android都是同根同源的。正如四则运算数学题,原理在手,任它千变万化,也无非是加减乘除,结果不同罢了。
&&废话不说,正式开始。
&&一如本人风格,在完成一件事之前,先要对它有一定的了解,然后才会下手,不然就是狐狸抓刺猬--无从下手了。
&&1.要修改boot.img,那么就需要了解它的格式。在各种查阅之后,确定了android系统的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)复制代码
解释一下,以上一大段代码的意思是什么呢?
就是说boot.img文件分成4大块,第一块占1页大小,存放的是boot头部信息。
第二块,是kernel(即内核)部分,占n页,这个n是多大呢?这得由系统内核(kernel)的实际大小而定。算式是n=(kernel_size page_size-1)/page_size。
这个算式为什么是kernel长度加上页长(page_size)再除以页长呢?很简单,问个问题,一个盒子装10张卡片,那么,11张卡片需要多少个盒子呢?答案是2个。
第三块,是ramdisk(即内存盘)部分,系统在启动时,会把这部分先加载到内存中执行,继而完成整个系统的加载。占m页,同样,m由ramdisk的实际大小而定。
第四块,这个应该是绝大部分手机android系统都不需要的,略过。当然,即便有,同样对待就行了。
最后,可能有人会问了,在上面多次提到了页长(page_size),那么这个页长究竟是多少?抱歉,在分析之前,具体多少我也不知道。
唯一可以确定的是,它会是1K(即1024个字节的整数倍),
首先是我们的目的是什么?是要开启app2ext。从android系统的方面来说,用户安装的程序,是安装到/data目录下的(普通程序是/data/app),程序产生的缓存数据,也是存放在/data目录下。
很多童鞋们,总喜欢安装很多很多软件啊游戏什么的,不管用得着用不着,这样一来,问题来了。
手机是有成本的啊,手机的“硬盘”是有限的,不可能大量安装软件。那么怎么办呢?就有聪明人(显然NOT ME)想了,为什么不将/data目录下的重要目录挂载到SD卡中呢?&&
系统中依然有着/data目录,/data目录下的文件结构也不变。
只是存放的位置,从手机的“硬盘”改成了SD卡。这样,只要SD卡足够的大(笑),那么,理论上就可以无限装软件了。
显然,对于大多数知足的童鞋们来说,只需要一定的空间,来安装一定量的软件就够了。
其次是,我们需要修改什么?说起来其实很简单,我们需要“欺骗”android系统,让它把你的SD卡的ext分区当成/data下的目录。现在,可能很多童鞋们,都想到了一个名词--“快捷方式”。& &正如WIN下有快捷方式,在LINUX下,支持另一种叫链接的强大工具。它可以为我们达成所需的目的。
&&这样一来,问题就简单了。我们只要在android启动过程中,将sd卡中的ext分区挂载到内存盘中的某个目录下(总不能挂载到内核里吧?笑~)。然后,将它链接到/data目录下就行了。然后,系统在安装程序的时候,就会不知不觉的,将程序存放在EXT分区中了。并且我们可爱的系统永远不会发现,它被骗了~
再次是,改哪?各种查阅,查什么?android挂载ramdisk下的各文件系统是在什么时候进行的?答案出来了,init.rc。那就改它吧。
3.我们从第一步的结构可以知道,boot.img的主体是kernel和ramdisk。而kernel是最核心的东西,是不能乱改的(除非你知道你机器的硬件参数)。
它只负责让shell和硬件正常交流,命令上传下达。
那么,只剩下ramdisk可以改了,我们要求很低,只需要将几行代码加进入,让/data/app的实际存放地址稍稍的变化一下。要改,先得解压吧?工具是现成的,ANDROID的WIKI上有,地址:
当然,我等会会把所有工具上传到附件中。PS:话说E文鸟语学得比较好的,可以略过我的废话。直接去上面的地址中查看。里面解压、打包、BOOT.IMG结构都有。免得看完哥的连篇废话之后,怨念无限,那可就冤枉我SJ哥了。
4.下载我附件中(或WIKI中)的split_bootimg.zip,解压之,并放到上一篇“”所述的数据空间文件夹中(本人是F盘)。
然后用如下命令,将之移动到BIN目录下,并赋予可执行权限:mv /mnt/shared/split_bootimg.pl /bin/chmod x /bin/split_bootimg.pl复制代码5.从你下载好的ROM包中,提取boot.img放到数据空间文件夹中(本人是直接放在F盘下)。输入命令解压之(为方便LINUX新手,本人命令基本使用绝对路径):& &&&mkdir /mnt/shared/boot
& & mv /mnt/shared/boot.img /mnt/shared/boot/
& && &cd /mnt/shared/boot
& && && && &split_bootimg.pl boot.img复制代码
& && && &&&这时你发现BOOT目录下多了几个文件,boot.img-ramdisk.gz 和boot.img-kernel6.
& && && && &创建一个新的名叫ramdisk的目录,用于存放ramdisk盘中的文件。然后,提取出ramdisk文件。
& && && &&&命令如下:& && && && && && &cd ramdisk
& && && && && && &gzip -dc ../boot.img-ramdisk.gz | cpio -i复制代码
& && && & 7.这时,ramdisk中的文件已经解压出来了,可以修改了。不过修改之前,我们还是备份一下吧。备份是个好习惯。mv /mnt/shared/boot/boot.img /mnt/shared/boot.img.backup复制代码
& && && && && & 我们即将要修改的init.rc也备份一下吧,万一出现问题,可以直接还原,重新修改而不需要再次解压boot.img-ramdisk.gzcp ./init.rc ../init.rc.backup复制代码
& && && && &&&8.用编辑器打开init.rc,查找到mkdir /data/app的行。
& && && && && &再次解释一下/data目录的结构,/data/app是普通应用程序存放的地方,/data/app-private是加密程序的存放地点(一般用不到)/data/dalvik-cache 是程序执行缓存(android系统会将JAVA代码转换成其自创的dalvik虚拟机可执行的代码,后缀是.dex,再执行,缓存就放在这里)。
& && && && && &此三个目录,系统并不会经常调用,而且对SD卡的速度要求不高。所以可以链接到SD卡的EXT分区中。
& && && && & 而/data/data这个目录,请诸位就不要乱链接了。为什么呢?因为它是存放程序在运行过程中,经常要访问的数据。如果你放进去了,而且你的SD卡的速度不够(class 4以下,即每秒SD卡读\写速率低于4M/s),那么你的系统会很卡很卡。打电话,显示通话记录卡一会。查看联系人又卡一会。看信息又卡一会。严重了还会死机。基本(有些人可能可以忍受)没法用。& && && && && &&&
& && && && && & 首先在mkdir /data/local ... mkdir /data/local/tmp mkdir /data/data mkdir /data/app这一大段mkdir代码之前,加入如下代码:#mount a dir for app2sd by sjssd,oops,it's rw now
& && && && &mkdir /system/app2sd& && && &&&#此为注释,逐行解释给诸位听的,不要加入init.rc。创建挂载目录,用于挂载ext分区。可换名字
& && & if [ -e /dev/block/mmcblk0p2 ];& &#判断,如果SD卡中存在第二个分区(即ext分区)
& && & #解释一下,/dev/block/mmcblk0p1 是指SD卡中第一个分区。mmcblk0p2则是第2个分区。如果SD卡未分过区,则不会有mmcblk0p2
& && &then
& && &mount ext2 /dev/block/mmcblk0p2 /system/app2sd& && &#结合上文,如果存在ext分区,则挂载到/system/app2sd目录下
& && & chown system system /system/app2sd #更换用户组,将之还给system
& && & chmod 6775 /system/app2sd& & #修改权限。
& && && & #这是结束判断语句,不用说了吧?
& && &#swap on by sjssd, if Mem &20,then use swap
& && &&&if [ -e /dev/block/mmcblk0p3 ];& &#如果存在第三个分区,即swap分区
& && &&&then& &
& && && && && &&&echo 20 &/proc/sys/vm/& &#向SWAP配置文件中写入,使用SWAP的条件。当可用内存低于20M时,才使用它& && && && &
& && && && && && & swapon /dev/block/mmcblk0p3;& && && &#开启SWAP分区
& && &&&& & #这段开启swap可不添加,没什么用处。N600 的手机内存有七八十M,一般不需要用。如果是其他内存低的手机型号,可以添加复制代码
9.把原来的mkdir /data/app&&... mkdir /data/app-private ... mkdir /data/dalvik-cache三行剪切掉,在第8步的代码后面加入如下代码:
& && && &&&#if the ext2 exists,mkdir the dir in SDCARD EXT2 partition
& && && &&&if [ -e /dev/block/mmcblk0p2 ];& & #如果EXT2分区存在
& && && && &then
& && && && && &&&mkdir /system/app2sd/data/ 6775 system system #在ext2分区中创建一个data目录,来存放我们需要修改的三个目录。可换其他名字& && && &&&
& && && && && &&&mkdir /system/app2sd/data/app-private 6775 system system
& && && && && &&&mkdir /system/app2sd/data/app 6775 system system
& && && && && && &mkdir /system/app2sd/data/dalvik-cache 6775 system system
& && && && & #以上代码是在ext2分区的data目录下,分别创建三个需要to ext的目录。
& && && && &&&#link for app2sd
& && && && && &#以下代码是链接代码
& && && && &&&symlink /system/app2sd/data/app-private /data/app-private& &#让/data/app-private目录实际链接到ext分区中的app2sd/data/app-private
& && && && && &symlink /system/app2sd/data/app /data/app&&#链接/data/app
& && && && && &symlink /system/app2sd/data/dalvik-cache /data/dalvik-cache&&#链接/data/dalvik-cache#if ext2 partition Not exists
& && && &&&else& &
& && && && && && &#do nothing
& && && && & #如果ext分区不存在,那么,一切按照原来的官方ROM的工作方式做。请将刚才剪切出去的三行,复制到这里
& && && && && && &&&mkdir /data/app-private 0771 system system
& && && && && && &&&mkdir /data/app 0771 system system
& && && && && && &&&mkdir /data/dalvik-cache 0771 system system
& && && && & #结束复制代码
10.顺便提一下如何用添加服务的方式,实现app2sd吧。注意,第10步和第8.9步无法共存。它们是达到同一个目的的两种方式。
& && && && &&&app2sd.sh sample代码:
& && && && && && && && &&&mount rootfs rootfs / rw remount& & #说声抱歉,这句直到今天3.22 检查帖子的时候才发现忘了加上。不加上是不能进行下面的步骤的
& && && && &&&if [ ! -e /system/app2sd -a -e /dev/block/mcblk0p2] ;&&#如果具备开启app2sd的条件(即存在ext分区),且system/app2sd目录不存在(即尚未开启app2sd),则删除原来存在的目录并在SD卡中创建目录,以备开启
& && && && && &then& &&&
& && && && && && && && &busybox rm -rf /data/app& &&&#删除原来的目录,等会需要将其链接到SD卡中的EXT分区上
& && && && && && && &&&busybox rm -rf /data/app-private& &&&
& && && && && && && && &busybox rm -rf /data/dalvik-cache& &
& && && && && && && && & mkdir /system/app2sd #创建挂载目录& &&&
& && && && && && && && &mount -t ext2 /dev/block/mmcblk0p2 /system/app2sd rw&&#挂载ext分区& &
& && && && && && && && &mkdir /system/app2sd/data& &#在SD卡中创建目录& &
& && && && && && && && & mkdir /system/app2sd/data/app& &
& && && && && && && && & mkdir /system/app2sd/data/app-private& &
& && && && && && && && &&&mkdir /system/app2sd/data/dalvik-cache
& && && && && &&&#结束上一个if
& && && && &&&if [ -e /system/app2sd -a -e /dev/block/mmcblk0p2 ];&&#如果存在app2sd目录,且存在ext分区,则说明上一步已经执行完毕,EXT分区中已经存在app目录了,那么我们要做的是链接它
& && && && && &then& &
& && && && && && &&&busybox ln -s /system/app2sd/data/app-private /data/app-private
& && && && && && &&&busybox ln -s /system/app2sd/data/app /data/app& &
& && && && && && &&&busybox ln -s /system/app2sd/data/dalvik-cache /data/dalvik-cache
& && && && && &
& && && && && & if [ -e /dev/block/mmcblk0p2 -a -e /dev/block/mmcblk0p3 ] ; #挂载swap,内存较大的机子,可不要这段
& && && && &&&then
& && && && && && && && &echo 20 &/proc/sys/vm/
& && && && && && && && &&&swapon /dev/block/mmcblk0p3;
& && && && && &
& && && && &&&#do nothing
& && && && & #####如果没有ext分区,即mmcblk0p2,则不做任何事情。
& && && && & 复制代码
& && && && &&&创建好app2sd.sh好后,我们给它加上可执行权限,在虚拟机linux中输入命令: chmod x app2sd.sh
& && && && && &&&再将移动到sbin目录下: mv app2sd.sh /mnt/shared/boot/ramdisk/sbin/
& && && && &&&依然,需要修改init.rc文件,使之成为一个服务,每次开机都执行一次。
& && && && && & 如何修改init.rc?如下:搜索class_start default。在之一行之前,加入两行代码:& && && && && & start app2sd& &&&#这里的app2sd应该是前面app2sd.sh的前面的文件名,如果你是a2sd,请用start a2sd.其他类推。此注释不要加入到文件中
& && && && && && &on property:cm.filesystem.ready=1复制代码
& && && && & 然后,在init.rc文件的最末尾,加入
& && && && && &service app2sd /system/bin/logwrapper /system/bin/sh /system/sbin/app2sd.sh #中间有一个logwrapper是指日志转移到系统日志文件中,可以以logcat查看
& && && && && &&&disabled
& && && && && && &oneshot #oneshot指仅开机的时候运行一次。复制代码
& && && && &11.下载附件中的打包工具,解压之并复制到数据空间中。运行命令以复制之到bin目录中并赋予可执行权限:
& && && && && &mv /mnt/shared/mkbootimg /bin/ && chmod x /bin/mkbootimg
& && && && && && &mv /mnt/shared/mkbootfs /bin/ && chmod _x /bin/mkbootfs复制代码
& && && && &&&12.正式打包吧。按WIKI所说,应执行:& && && && && &cd ../ mkbootfs ./ramdisk | gzip & ramdisk-new.gz
& && && && && &mkbootimg&&--kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot.img复制代码
& && && && && &然后,复制到刷机目录中,替换原来的boot.img,刷机之。就万事OK了。
& && & 13.好吧,说笑的。我只是检查一下大家会不会看完。
& && && &&&如果诸君按照12步打包完,刷机,无论你是什么手机,十有**是会卡在开机界面,屏幕一闪一闪啊黑屏啊之类的症状层出不穷。
& && && && &很可惜,我当初就是这么做的,结果开不了机。然后没办法啊,潜心研究。
& && && && && & 结果发现,在刷机过程中未停电且未断开数据线的情况下,开不了机普遍有两种可能。
& && && && &&&一、boot.img是加过密的。各位手机出产的公司,在做ROM的时候,以他们独自的加密算法,对整个文件进行CRC验算,然后将验算值添加到boot.img的最末尾。刷机的时候,手机的硬件BIOS就像一名尽职的士兵,对此进行验算,对不上口令的,那么对不起,请君离开,不离开我报警了~~呃,报不了警,那反正我不让你进门~~
& && && && & 二、boot.img还有一个重要的参数,基址 base,用于告诉手机从哪个地址开始,是准备给内存盘的入口,哪个地址是给kernel的入口。如果你对不上号,对不起,不能非法入室的。& && && &&&
& && && && & 如果是第一种,我只能望风而逃,罢手了。
& && && && &&&本人加密解密不到境界,无法解决如此高深的问题。鬼知道为官方开发手机ROM的开发人员,用的什么加密方式。那么只能向第二种方式上想了。
& && && && & 好吧,虚拟机中下载一个十六进制编辑器,ghex2.命令如下:apt-get install ghex2
& && && && & 也可以在WIN下下载 ultra edit。
& && && && && &下完继续看吧。没想到本文这么长,推荐在看之前买杯茶。呃,在快到文末才说,是不是邪恶了些?
& && && & 14.各种查阅,终于发现,在ROM的boardconfig.h中存在地址偏移的define。。虽然本人手机 的ROM中不存在这文件,但各android系统这个偏移是通用的,一般没吃错药不会去改。
偏移DEFINE如下:
#define PHYSICAL_DRAM_BASE& &0x&!--IWMS_AD_BEGIN--&& &//基址,各不相同,我们的目的是为了获得这个基址,但由于没有ROM源代码,这貌似是不可能的。&!--IWMS_AD_END--&
#define KERNEL_ADDR& && && & (PHYSICAL_DRAM_BASE 0x)
#define RAMDISK_ADDR& && && &(PHYSICAL_DRAM_BASE 0x)
#define TAGS_ADDR& && && && &(PHYSICAL_DRAM_BASE 0x)
#define NEWTAGS_ADDR& && && &(PHYSICAL_DRAM_BASE 0x)复制代码
15.还记得WIKI中有这句话吧?
For Nexus One : Add --base 0x to mkbootimg command-line.&&翻译一下,如果是nexus one手机,那么需要在mkbootimg命令中加入 --base 0x。。现在是不是很熟了?原来基址写在这里,mkbootimg会自动为你加入偏移量,并写入boot.img。。
好吧,我们现在需要知道,这些值是在哪个位置的。
为什么需要呢?在第14步,我们已经知道了偏移量了,那么如果我们再从官方ROM的boot.img中获取 kernel_addr,再用kernel_addr -偏移量0x,不就可以得出基址了吗?
16.没辙,需要知道mkbootimg工具把它们写到哪了,只能查看mkbootimg的源代码(幸好mkbootimg作为一个典型的LINUX工具,是开源的。若换成WIN,哥就真悲情了)。
& && &&&各种查找,找到mkbootimg.c文件,看吧。
& &&&header padding kernel padding ramdisk padding ...(padding是补全,还记得上面所说的,一个盒子装10张卡片,11张卡片需要几个盒子的事情吧?第二个盒子由于只放了一张卡片,所以需要9张空白卡片来填充位置,即padding)
4 * 2, magic,固定为"ANDROID!"
4 * 1, kernel长度,小端unsigned类型
4 * 1, kernel地址,应为base 0x
4 * 1, ramdisk长度,小端unsigned
4 * 1, ramdisk地址,应为base 0x
4 * 1, second stage长度,小端unsigned,为0
4 * 1, second stage地址,应为base 0x00f00000
4 * 1, tags地址,应为base 0x
4 * 1, page大小,小端unsigned, 为2048或者4096
4 * 2, 未使用,固定为0x00
4 * 4, 板子名字,一般为空
4 * 128, 内核命令参数,一大串
4 * 8, id,不知道啥玩意,0x00
给亲爱的16进制帖张图吧,看图说话,下图是N600 官方2.1ROM的16进制图片,如下:
从图中我们可以知道:
41 4E 44 52 4F 49 44 21 就是Magic Number ,内容是固定的ANDROID!。一一对应
kernel_size就是0x。注意,小端读法。是Byte内,顺读,整个类型中,逆读。故70 74 23 00 的确切数字是0x 00 23 74 70
kernel_addr即0x 。这时有人就问了,那用这个减去上面获取的kernel偏移,0x,那么base是不是0x?好了,我知道了,我就用--base 0x来打包。那么,恭喜你,在N600上,这样写依然是不能启动的,为什么,请继续看。
ramdisk_size是:B9 66 03 00 --&0x 00 03 66 B9。
ramdisk_addr即00 00 A0 03 --&0x 03 A0 00 00。减去偏移0x,base=0x02a00000
second_stage size:
second_stage addr:00 00 90 03--&0x 03 90 00 00.减去偏移0x00f00000,base=0x02a00000
tags_addr:00 01 a0 02--&0x 02a00100.减去偏移0x,base=0x02a00000
page_size:00 80 --&0x0800.这是页长。记得我前面说过的页长一般都为1K(1024)的整数倍吧?此处页长是0x0800,转为十进制,则是2048
好吧,我们来看下base吧, 嗯,kernel的base是0x,ramdisk和second_stage及tags_addr的基址都一样啊,是...是0x02a000000。。我了个去~~4个base竟然有不一样的~是的,我当时就是这么骂的。
我就想,还好本人闲着无事算了4个base,如果有只算第1个,然后用0x来打包的,基本就是悲剧的结果,可能还摸不着头脑,以为这个boot.img是CRC校验的,而非基址弄错。
好吧,以少数服从多数的原则,我们在打包的时候,把基址填为0x02a00000。然后把第一个地址kernel_addr,手动修正。
那么,正确的命令如下:
mkbootfs ramdisk |gzip &ramdisk-new.gzmkbootimg --kernel boot.img-kernel --ramdisk ramdisk-new.gz --base 0x02a00000 -o boot.img复制代码
然后用ghex2打开boot.img,忽略前面的4*2Byte,41 4E 44 52 4F 49 44 21,这是magic number,固定不变的。
再跳过4*1Byte,在我这是70 74 23 00。这是kernel_size,程序生成,不需要手动改。
其后的4*1Byte才是kernel_addr,现在是00 80 A0 02,修改成 00 80 00 03。保存之。
17.好了,将它放到刷机包目录中,打开刷机工具,刷之。快乐的启动吧。
18.其他机型的ROM,只要不是采用CRC校验方式的,如果修改boot.img后出现问题的话,也可以按照本文方式查找基址。
19.另外附送一个XDA论坛上顺来的boot_kitchen,,WIN下的。虽然,本人在WIN7下未使用成功。不过还是传上来吧。
& & 解释一下。boot_kitchen下的workfolder目录里的1.bat是解压的批处理,2.bat是打包的批处理,请注意:不同的手机的base不同,请在获取后,修正2.bat里面的mkbootimg命令。
3.bat是flashboot刷机的。
另外,WIN需要另外安装perl,以支持split_bootimg.pl。
20.既然写了这么长了,就把步骤凑个整数吧。诸君努力。还有,申明一点,如果有看了本文 之后,配出一个生活不能自理的ROM的话,请不要提我SJ的名字,会败坏哥的名号的哇哈哈~~哼哼,如果还有销赃不及,被抓个正着的~~请说日语~~说笑~~
& &另外,本人有意将CyanogenMod移植到N600 上来,内核编译倒是简单,但卡在2.3系统的编译配置上了。有高人吗?高人吗?人吗?吗?援个手吧~~有有过移植经验的,打打下手就成~~M我吧~~敬候~~
PS:N600 的2.2ROM出来的时候,本人也分析过它的代码,发现它的4个地址的base竟然变得一致了,想来是在驱动级修正了这个问题。直接告诉大家N600 官方2.2的base地址吧,是0x。
boot.img示例:
TA的最新馆藏[转]&[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 固定的 英文 的文章

 

随机推荐