事情要知道Android启动和恢复图像

    亚历克斯·罗马
    分享

    这篇文章最初发表在TextNow工程博客。必威滚

    充分把握Android启动和恢复图像发挥作用,我们首先需要了解一般Android手机的启动过程。虽然嵌入式软件在TextNow不再是我日常工作的一部分,我曾经穿embedded-engineer帽子在一个我和我以前的工作中涉猎的嵌入式电子产品在我的业余时间,所以我熟悉现代微处理器启动例程。我必须提醒你,这是一个非常技术职位,但希望有人找有用的参考材料在这之间如何相互磨合,更深入的探究与链接,如果需要的话。这种类型的文章是非常有用的,当我正在学习:)

    Android启动过程中

    当电源和复位信号应用于处理器,它醒来,需要弄清楚该做什么。在现代处理器,isusually一个非常小的程序常用的处理器函数表示下一个组件的完整性。有时候是自己的第一个组件安全启动芯片,和它的工作是确保nextcomponent负载是可信的,验证软件。这可以防止unwantedtampering的系统软件,因此,提高设备的安全性。密码的验证通常涉及到某种cipherusing公钥/私钥方案,用私钥通常由制造商保持closelyguarded秘密。注意:通常publickey程序在手机制造商在组装期间,“永远不可能改变,从而要求处理器总是给引导装载程序运行,与私营对手atassembly公钥燃烧的时间。

    下一个组件由安全加载引导ROM是人们通常所说的引导装载程序。引导装载程序,就像我提到的,通常是与手机制造商的私钥签署,它有几个工作:

    1。加载引导映像从非易失性内存(通常是现在快闪记忆体)为易失存储器(RAM)并运行它。

    2。可选地,图像需要becryptographically验证之前被加载(这些天越来越多的手机一样,甚至不提供一种方法来解锁bootloaderto运行未签名的图像)。

    3所示。提供flash新启动的能力和其他图像为未来的升级和恢复fromfailure非易失性内存。

    4所示。在屏幕显示一些信息,可以为用户提供一个接口进行交互。这是通常被称为fastboot模式在一些摩托罗拉、谷歌和其他制造商的设备。

    安卓系统引导映像

    我们现在来的最终组件boot-upprocess——加载启动或恢复图像RAMand运行它。

    技术上来说,没有扣之间的启动和恢复图像。唯一的区别是whichkernel加载初始ramdisk,但包装是相同的。我们将回到如何包装这些整洁整齐引导映像。

    有几个步骤参与运行theboot图片:

    1。密码验证

    2。加载的内核(Linux) requiredmemory地址

    3所示。加载的初始ramdisk requiredmemory地址

    4所示。跳转到内核的起始地址

    密码验证通常是manufacturer-specificand这通常很难逆向工程方法,尽管notimpossible——它已经做过某些手机(例如,年长的半身画像时代LG手机)。

    内核是操作系统的核心,楼下的恒定的心跳保持modernoperating系统运行中断和事件。这个魔法很微薄的起源作为一个简单的chunkof字节编译的醒来,开始从特定地址的内存。这个地址变化取决于particularphone和内存布局。一旦执行开始时,内核会loadingdrivers和设置更先进的设施,以便它可以运行一些其自己的程序。

    就其本身而言,内核就不会知道whatto做一旦加载。坐在那里什么都不做。但是Linuxkernel预计是一个在一个预定义的memoryaddress初始ramdisk。这个ramdisk包含一个非常基本的,通常read-onlyfilesystem包含最基本的根文件系统,以及fileunder/ sbin / init哪个内核执行最后thingit作为初始化的一部分。这 初始化 programstarts运行一些脚本,启动其他程序交谈andfinally交付完整的体验系统。

    现在我们回到aboot和恢复图像之间的区别。而内核有时是一样的bootimage,经济复苏ramdisk有截然不同的形象初始化scriptswhich不启动Java VM,而是开始一个小的C程序称为(didyou猜吗?)复苏。恢复显示有限的用户interfacethat允许用户启动系统,工厂复位,清除cachepartition等等一些自定义的复苏有自己的程序,提供了水功能。

    包装一个Android启动镜像

    Android启动有一个图像 特定的结构,其内部organizationreflects内存驻留,即闪光。Flash是一个特定的领域并不是随机存取内存,但阅读的页面大小varydepending特定的芯片,通常在4 k字节的范围之内。就,引导映像的组件页面大小是一致的,所以thatloading更有效率(还有其他原因我不会详细)。引导映像的结构如下图所示:

    Android的布局引导映像

    我应该提及的这一阶段。说实话,我不知道存在的理由,原来的意图。我看到它在近代用来容纳thekernel的设备树块(防晒霜,另一个又长又深的技术主题bestexplained其他地方)通过特定的手机制造商。旧的内核已经theDTB内核映像的一部分,现在他们已经把它到自己的separatepiece更容易建立一个更通用的内核,可以适应各种硬件配置在同一架构。

    迅速沿着bootimage头(!),这主要是告诉引导映像的引导装载程序如何加载组件,和它看起来像这样:

    安卓系统引导映像头

    正如你所看到的,它有一些“簿记”字段如何大的其他子组件启动镜像,whataddress将它们加载到等。

    它也有一个字段魔法。Themagic领域仅仅是一系列著名的字符识别这是anAndroid引导映像。在这种情况下,字符串“ANDROID !”,这符合neatlyinto 8个字节。

    有人熟悉Linux内核andboot-up过程将识别内核标签和命令行参数fieldsas传递更多的自定义信息到内核的方法,如需求应该,发现初始ramdisk loadits从什么地方出初始化程序。

    使用Android引导映像

    所以,既然我们自定义的复苏和引导imagesfor Android手机(如TWRP CWM等等),很显然,有人为了自己的恢复图像或修改现有引导映像。大部分的工作已经完成使用开源谷歌Android代码,但是仅仅是代码组件创建一个启动镜像。也并未对修改工具将引导映像。现在,您可以使用工具 https://github.com/osm0sis/mkbootimg topack和解压内核引导映像和改变,或修改initialramdisk。

    进一步的领域去探索

    有一些有趣的方面涉及到初始ramdisk,适用于Android启动和恢复使用本文不会讨论细节由于其大小已经蓬勃发展,但这是值得一提的。

    ●通常初始虚拟磁盘useis gzip的文件系统CPIO存档

    ●你可以包initialramdisks和修改它们

    ●init脚本写在他们owndomain特定语言(DSL),你可以阅读他们 自述文件的更多信息

    ●默认文件SELinux上下文和policyusually驻留在内存虚拟盘的根

    我们可以花很多时间谈论和playingwith上面的项目,但至少现在我将把它们作为练习以敏锐的读者。

    Baidu