本文是《Android内核开发》的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟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等,这里就不详细讲解了。

8.  小结

关于Android系统编译输出的几个镜像文件就介绍到这儿了,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流,你也可以关注我的微博 @卢_俊 获取最新的文章和资讯,谢谢。

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

  1. android内核编译教程,Android内核开发:系统编译输出的镜像文件

    主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的. 1. MLO, ...

  2. Android内核开发:系统分区与镜像文件的烧写

    本文是<Android内核开发>系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中. 玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android ...

  3. Android内核开发:图解Android系统的启动过程

    本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始 ...

  4. Android内核开发:学会分析系统的启动log

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

  5. Android内核开发:为什么刷机后系统第一次启动会很慢?

    转自:http://ticktick.blog.51cto.com/823160/1677216 在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都 ...

  6. Android内核开发:如何统计系统的启动时间

    转自:http://ticktick.blog.51cto.com/823160/1660996 本文是<Android内核开发>系列的第七篇文章,通过上一篇文章<Android内核 ...

  7. Android内核开发:系统启动速度优化

    在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务:  ...

  8. Android内核开发:从源码树中删除出厂的app应用

    本文是<Android内核开发>系列的第十一篇文章,本文重点介绍如何从Android源码中删除出厂的app应用. 上一篇文章中提到过,系统出厂的app应用,其实就是被安装到/system分 ...

  9. Android 内核源码编译记录

    注:此处内容总结自google官网:AOSP 编译内核.编译完成后刷机部分参考自其他大佬的文章.文中末尾提供了上传至CSDN的msm内核和Aarch64gcc工具 的下载链接,不想从官网下载的可以直接 ...

最新文章

  1. delphi自定义事件处理
  2. Oracle 查询转换之子查询展开
  3. ELF 文件 动态链接 - 地址无关代码(GOT)
  4. 个人工作总结09(第二阶段)
  5. php prs4,pr关键帧有什么用
  6. pytorch简单框架
  7. oracle12c之 控制pdb中sga 与 pga 内存使用
  8. 实战,实现幂等的8种方案!
  9. 埃夫特机器人示教器keba_埃夫特下一代智能工业机器人研发及产业化项目奠基...
  10. ORACLE坏块检查
  11. 【Oracle 10201 lsnrctl status卡住问题解决】
  12. 私人飞机包机运营商flyExclusive通过与BitPay合作支持加密货币付款
  13. 机器学习之监督学习(一)——决策树
  14. 华为ADSL路由设置
  15. DevExpress DateEdit控件选择精确到秒
  16. 2022最新软考考试时间已公布
  17. 74CMS4.1.2.4版本黑盒测试
  18. 华为matebook鸿蒙,16寸专业大屏+满血Zen3!华为MateBook 16评测:鸿蒙加持 平板变身新外设...
  19. 乔布斯去世十年,粉丝哀叹苹果正失去昔日创新光环,但库克是更好领导者
  20. 工业智能网关在物联网系统中扮演什么角色?

热门文章

  1. html复选框对齐文字,input【type=checkbox】标签与字体对齐
  2. c语言 五子棋 悔棋代码,跪求C语言五子棋悔棋部分实现
  3. python集合属性方法运算_Python基础__字典、集合、运算符
  4. 彩超探头频率高低的区别_超声波液位开关和液位开关的区别,它们的工作原理分别是什么?...
  5. inline-block什么意思中文_css中inline-block是什么?inline-block布局的使用
  6. Zabbix监控Nginx性能状态
  7. 用Fiddler对Android应用进行抓包
  8. 【CF913F】Strongly Connected Tournament 概率神题
  9. saltstack学习-9:批量安装nginx服务并定时更新配置(pillar)
  10. C# IOThread