Android内核开发:系统编译输出的镜像文件

简介:

1. MLO, u-boot.img

 

任何操作系统的启动,都离不开“引导程序”,比如桌面Windows系统的BIOS、桌面Linux系统常用的是Grub,而在嵌入式系统中,这个引导程序通常叫做“bootloader”,它通常由处理器的片上ROM中的引导代码和u-boot两部分组成(当然,也有其他类型的bootloader,这里以最常用的u-boot为主)。

 

这些“引导程序”的功能,通常都是完成硬件系统的检测和配置,然后到指定的位置去“加载并运行”操作系统内核,这个加载过程就是把指定的内核镜像文件解压到内存DDR中去,然后运行内核代码,并交出CPU控制权。

 

由此我们知道,Android系统的启动,第一个最重要的文件就是:“bootloader”。“bootloader”是与操作系统无关的,无论设备上跑的是Linux还是Android,都需要“bootloader”来启动引导。  

 

关于“bootloader”,需要解释的是:处理器片上ROM中的引导代码通常由处理器厂商实现,我们无法获取也无法修改,u-boot则是具体的开发板/设备厂商实现,如果我们自己设计Android硬件设备,则也需要去修改标准的u-boot代码适配我们自己的硬件模块。 

 

u-boot编译输出文件有2个,一个是MLO,另一个是u-boot.img,因此,对于很多Android开发板而言,一定存在一个boot分区(通常是fat32格式),该分区里存放有MLO和u-boot.img这两个重要的文件。


2. uImage


由于Android系统是基于Linux内核的,因此,与嵌入式Linux启动过程一样,“bootloader”完成硬件检测和初始化配置后,第一步要做的也是加载并运行Linux内核镜像,因此,在Android设备启动过程中,除了MLO和u-boot.img文件外,另一个最重要的文件就是内核镜像uImage文件了。


注:Linux内核编译成功后,会在arch/arm/boot/目录下生成zImage文件,通过mkimage命令,给zImage文件加上了64个字节的数据头得到uImage文件,这样才能被u-boot识别并正确引导。


3. ramdisk.img


在Linux内核启动时,首先去创建虚拟的根文件系统,然后在指定位置寻址真正的根文件系统镜像并加载到内存中,然后执行init可执行程序完成系统启动过程。


对于嵌入式Linux系统而言,一般需要用busybox等工具专门创建一个根文件系统镜像,而Android源码中已经实现了一个根文件系统,即ramdisk.img,Android内核系统启动时会首先加载ramdisk.img作为根文件系统,然后再执行init程序,解析init.rc脚本,挂载系统其他分区、开启各个进程和服务等。


因此,Android系统启动第三个必不可少的文件即ramdisk.img文件,它是Android系统的根文件系统镜像。


4. boot.img


Android系统中,通常会把zImage和ramdisk.img打包到一起,生成一个boot.img镜像文件,放到boot分区,由bootloader来引导启动,其启动过程本质也是和分开的uImage&ramdisk.img类似,只不过把两个镜像按照一定的格式合并为一个镜像而已。


bootloader如何知道去哪加载Linux内核(zImage)和根文件系统(ramdisk.img)呢?通常是由命令行参数传入bootloader程序,或者在bootloader代码中给出启动参数配置文件的路径,具体的原理可以去参考bootloader启动Linux内核相关的文章分析,这里就不做详细介绍了。


5. system.img


前面我们提到的镜像如“bootloader”,“Linux Kernel”,“文件系统”都是不包含Android系统的核心文件,那么,真正的Android操作系统核心部分在哪呢?其实就位于system.img中,它包含了Android系统的firmware、用户界面、一系列的预编译应用等等,会在内核启动后被挂载到/system分区。因此,它也是Android系统启动必不可少的镜像之一。


6. userdata.img


前面介绍的system.img镜像中包含的都是Android系统级别的数据,而“用户”的“出厂”数据则都被放到了userdata.img镜像中了,它会被挂载到文件系统的/data分区,用户新存储的数据、安装的程序均会被放置到这个分区中,如果擦除这个分区,本质上则等同于手机恢复了出厂设置,它也是Android系统启动必不可少的镜像之一。


7. 其他的镜像


前面介绍的几个都是Android系统启动涉及到的最重要的几个镜像文件,当然,编译输出还有其他的几个文件包括:用来缓存最频繁访问的数据和应用的cache.img,用来恢复系统时使用的recovery.img等,这里就不详细讲解了。




本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1655761,如需转载请自行联系原作者
相关文章
|
16天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
21天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
30 19
|
7天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
23天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
23天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
4天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
|
Java Android开发 存储
Android 文件操作心得体会
android 的文件操作说白了就是Java的文件操作的处理。所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了。好了,话不多说,开始今天的正题吧。
979 0