写点什么

作为 Android 开发者,你真的知道 Android 按下开机键到启动发生什么吗?

用户头像
Android架构
关注
发布于: 刚刚

在一个夜黑风高的晚上,我的男同事突然给我发了一条微信,我点开来看,他竟然问我 Android 从按下开机键到启动到底发生了什么?此刻我的内心如下图:



但是作为一个 Android 开发者,了解整个系统架构是必须的,所以这篇就总结一下 Android 手机从按下开机键到启动这一过程发生了什么。


要了解 Android 手机启动过程,我们先来了解一下基于 linux 系统的电脑从按下电源键的那一刻起,发生了什么,这样类比可以更好的理解 Android 手机的启动过程。

基于 Linux 的 pc 启动过程

我们都知道,所有的程序软件包括操作系统都是运行在内存中的,然而我们的操作系统一般是存放在硬盘上的,当我们按下开机键的时候,此时内存中什么程序也没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是 BIOS


装过系统的人一定知道 BIOS 这个东西,那么它究竟是什么呢?


BIOS:Basic Input/Output System(基本输入输出系统),在 IBM PC 兼容系统上,是一种业界标准的固件接口(来自维基百科)。有点难以理解,其实 BIOS 是我们电脑启动时加载的第一个程序,这个程序不是由 Java 语言编写也不是由 C 语言编写,一般是汇编程序。


BIOS 程序固化在主板上


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


的一块芯片上,是连接计算机硬件与操作系统的桥梁,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序。


那么问题来了,BIOS 程序又是怎么启动的?BIOS 的启动,是由硬件完成的,Intel 80x86 系列的 cpu 的硬件都设计为加电(即开机瞬间)就进入 16 位实模式状态运行,此时将 cpu 的硬件逻辑设计为强行将 CS 的值设置为 0xFFFF,IP 的值设置为 0x0000,这样 CS:IP 就指向了 0xFFFF0 这个位置,而这个位置就是 BIOS 程序的入口地址。


因此这是一个硬件厂商之间的约定,所有的 BIOS 程序入口地址均为 0xFFFF0,这样在开机的时候,就找到这个地址,如果该地址并没有代码段,那么计算机将会死机,如果这个地址处有代码段,将会执行这个代码段,并由此执行下去,即 BIOS 程序开始启动。


补充:**CS:**代码段寄存器,存在于 CPU 中,指向 CPU 当前执行代码在内存中所在的区域。**IP:**指令寄存器,存在于 CPU 中,记录将要执行的指令在代码段内的偏移地址,与 CS 组合即为将要执行的指令的内存地址。


当 BIOS 程序启动时,就会检测硬件设备,比如我们的显卡、内存等信息。BIOS 会在内存中建立中断向量表和中断服务程序。中断向量表中有 256 个中断向量,每个中断向量占 4 个字节,每个中断向量指向一个中断服务程序,这些中断服务程序完成了将操作系统由硬盘加载到内存中的任务.基于 linux 的操作系统而言,计算机将分三批逐次加载操作系统的代码,第一批由 BIOS 中断 int 0x19 将 第一扇区 bootsect 的内容加载到内存;第二批和第三批在 bootsect 的指挥下,分别加载后面扇区的内容到内存中。


**经过执行一系列的 BIOS 代码后,计算机完成了自检等操作,**计算机硬件体系会与 BIOS 联合操作,让 cpu 接收到一个 int 0x19 中断,cpu 接收到这个中断后,会立即在中断向量表中找到 int 0x19 中断向量,此时会找到对应的中断服务程序,并由该中断服务程序将硬盘中第一个扇区的引导程序加在到内存中的指定位置。


**随后,在引导程序的作用下,陆续将操作系统的其他程序载入内存,**完成实模式到保护模式的转变,为执行操作系统的入口函数 main 做准备,后面就是操作系统的初始化工作了,最后完成计算机的启动。

Android 手机的启动过程

Android 系统虽然也是基于 linux 系统的,但是由于 Android 属于嵌入式设备,并没有像 pc 那样的 BIOS 程序。


取而代之的是 Bootloader ——系统启动加载器。它类似于 BIOS,在系统加载前,用以初始化硬件设备,建立内存空间的映像图,为最终调用系统内核准备好环境。


在 Android 里没有硬盘,而是 ROM ,它类似于硬盘存放操作系统,用户程序等。ROM 跟硬盘一样也会划分为不同的区域,用于放置不同的程序,在 Android 中主要划分为一下几个分区:


  • /boot:存放引导程序,包括内核和内存操作程序

  • /system:相当于电脑 c 盘,存放 Android 系统及系统应用

  • /recovery:恢复分区,可以进入该分区进行系统恢复

  • /data:用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序

  • /cache:安卓系统缓存区,保存系统最常访问的数据和应用程序

  • /misc:包含一些杂项内容,如系统设置和系统功能启用禁用设置

  • /sdcard:用户自己的存储区,可以存放照片,音乐,视频等文件


那么 Bootloader 是如何被加载的呢?我们可以想到,应该跟 pc 一样,当开机加电的时候,cpu 会从 cpu 制造厂商预设的地址上取指令,这个地址是各厂商约定俗称的,类似于上面 80x86 架构里的 0xFFFF0 地址,因此 Android 手机会将固态存储设备 ROM 预先映射到该地址上,当开机加电的时候,cpu 就会从该地址执行/boot 分区下的 Bootloader 程序,载入 linux 内核到 RAM 中。


当 linux 内核启动后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并开始执行根文件系统的 init 程序,init 程序是 Android 启动过程中最重要的核心程序。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
作为Android开发者,你真的知道Android按下开机键到启动发生什么吗?