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

2024-05-08 01:32

本文主要是介绍Android内核开发:系统编译输出的镜像文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


本文是《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等,这里就不详细讲解了。

这篇关于Android内核开发:系统编译输出的镜像文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968940

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局