固件、驱动、HAL、BSP 等底层概念
在 Android ROM 开发、嵌入式开发、Linux 驱动开发中,经常会遇到这些概念:
固件 Firmware
驱动 Driver
HAL
BSP
Bootloader
Kernel
Device Tree
Framework
SDK / NDK
这些概念都和“硬件如何被系统使用”有关,但它们所在层级和职责不同。
一、整体层级关系
可以先从一张图理解:
App 应用层
↓
Android Framework
↓
System Service
↓
HAL 硬件抽象层
↓
Kernel Driver 内核驱动
↓
Firmware 固件
↓
Hardware 硬件
如果再加上启动流程,大概是:
BootROM
↓
Bootloader
↓
Linux Kernel
↓
Driver
↓
HAL
↓
Android Framework
↓
App
二、固件 Firmware
1. 什么是固件?
固件是运行在设备或硬件模块中的底层软件。
它通常和硬件绑定很紧,负责让硬件具备基本工作能力。
常见例子:
BIOS / UEFI
路由器系统
手机 ROM 包
Wi-Fi 芯片固件
蓝牙芯片固件
Modem 固件
触摸 IC 固件
摄像头模组固件
MCU 程序
2. 固件的特点
比普通 App 更底层
通常存储在 Flash / ROM / eMMC / SPI Flash 中
和具体硬件强相关
升级固件通常叫“刷固件”
3. 广义固件和狭义固件
广义上:
设备中的底层系统镜像也可以叫固件
例如:
手机刷机包
路由器系统包
Android ROM 包
狭义上:
运行在某个硬件模块内部的小程序才叫固件
例如:
Wi-Fi 芯片内部固件
蓝牙芯片内部固件
触摸 IC 固件
Modem 固件
三、驱动 Driver
1. 什么是驱动?
驱动是操作系统中用来控制硬件的代码。
它通常运行在 Linux Kernel 中,负责和具体硬件打交道。
常见驱动:
屏幕驱动
触摸驱动
摄像头驱动
音频驱动
Wi-Fi 驱动
蓝牙驱动
USB 驱动
电池驱动
充电 IC 驱动
指纹驱动
传感器驱动
2. 驱动的作用
驱动的作用是:
把硬件能力封装成操作系统可以使用的接口
例如触摸屏:
手指触摸屏幕
↓
触摸 IC 产生中断
↓
Linux 触摸驱动读取坐标
↓
Input 子系统上报事件
↓
Android Framework 处理输入事件
↓
App 收到 MotionEvent
没有驱动,系统就不知道如何使用硬件。
四、HAL
1. 什么是 HAL?
HAL 全称:
Hardware Abstraction Layer
硬件抽象层
一句话解释:
HAL 是 Android Framework 和底层驱动之间的标准接口层。
它不是驱动,而是对底层硬件能力的抽象封装。
2. HAL 所在位置
App
↓
Android Framework
↓
System Service
↓
HAL
↓
Kernel Driver
↓
Firmware
↓
Hardware
比如相机:
相机 App
↓
Camera Framework / CameraService
↓
Camera HAL
↓
Kernel Camera Driver
↓
Camera Sensor Firmware
↓
摄像头硬件
3. HAL 的作用
HAL 的核心作用是:
屏蔽硬件差异,让 Android Framework 用统一方式访问不同硬件。
比如不同手机可能使用不同摄像头模组:
索尼 Sensor
三星 Sensor
豪威 Sensor
不同 ISP
不同对焦马达
不同闪光灯
但 Android Framework 不可能为每一种硬件写一套逻辑。
所以 Android 规定一套标准 HAL 接口,厂商负责实现。
Framework 只调用标准接口,不关心底层硬件具体怎么实现。
4. HAL 和 Driver 的区别
可以这样记:
Driver:解决“硬件怎么操作”
HAL:解决“Android 怎么统一调用”
五、Firmware、Driver、HAL 的关系
以 Wi-Fi 为例:
Settings / App
↓
Wi-Fi Framework
↓
Wi-Fi HAL
↓
Wi-Fi Driver
↓
Wi-Fi Firmware
↓
Wi-Fi 芯片
对应职责:
Wi-Fi HAL:
给 Android Framework 提供统一接口
Wi-Fi Driver:
运行在 Linux Kernel 中,负责控制 Wi-Fi 芯片
Wi-Fi Firmware:
运行在 Wi-Fi 芯片内部,负责芯片自身逻辑
Wi-Fi Hardware:
真正的物理硬件
所以它们不是一个东西,而是不同层级的协作关系。
六、BSP
1. 什么是 BSP?
BSP 全称:
Board Support Package
板级支持包 / 板级开发支持包
BSP 不是单个程序,而是一整套底层适配包。
它的目标是:
让操作系统能在某一块具体硬件板子上跑起来。
2. BSP 通常包含什么?
一套 Android BSP 可能包含:
Bootloader
Linux Kernel
设备树 Device Tree
各种硬件驱动
HAL 层代码
固件文件
分区表
init 配置
sepolicy
BoardConfig 配置
编译脚本
烧录工具
测试工具
开发文档
可以理解成:
BSP 是一个大礼包
里面可能包含 Driver、HAL、Firmware、Kernel、Bootloader 等内容
3. BSP、Driver、HAL、Firmware 的关系
BSP
├── Bootloader
├── Kernel
│ ├── 显示驱动
│ ├── 触摸驱动
│ ├── 摄像头驱动
│ ├── 音频驱动
│ └── Wi-Fi 驱动
├── Device Tree
├── HAL
├── Firmware
├── init 配置
├── sepolicy
├── 编译配置
└── 烧录工具
所以:
BSP 是最大集合
Driver 是 BSP 的一部分
HAL 也是 BSP 的一部分
Firmware 也可能包含在 BSP 中
七、Bootloader
1. 什么是 Bootloader?
Bootloader 是启动加载器。
它负责在设备上电后,初始化基本硬件环境,然后加载操作系统内核。
启动过程大概是:
上电
↓
BootROM
↓
Bootloader
↓
Linux Kernel
↓
Android 系统
常见 Bootloader:
U-Boot
LK
ABL
UEFI
2. Bootloader 的作用
初始化内存
初始化存储
加载 Kernel
加载 Device Tree
校验启动镜像
进入 fastboot / recovery / 正常启动模式
八、BootROM
BootROM 是芯片内部固化的第一段启动代码。
它通常由芯片厂商写入芯片内部,用户一般不能修改。
它的作用是:
芯片上电后最先执行
初始化最基本环境
寻找 Bootloader
支持烧录模式 / 救砖模式
启动链路可以理解为:
BootROM 是第一个启动者
Bootloader 是第二阶段启动者
Kernel 是操作系统核心
Android 是上层系统
九、Kernel
1. 什么是 Kernel?
Kernel 是操作系统内核。
Android 底层使用的是 Linux Kernel。
Kernel 负责:
进程调度
内存管理
文件系统
网络协议栈
驱动模型
电源管理
权限和安全机制
2. Driver 和 Kernel 的关系
很多硬件驱动都运行在 Kernel 中。
例如:
触摸驱动
显示驱动
音频驱动
USB 驱动
电池驱动
摄像头部分驱动
所以可以简单理解:
Kernel 是操作系统核心
Driver 是 Kernel 中控制硬件的一部分代码
十、Device Tree
1. 什么是 Device Tree?
Device Tree,中文叫设备树。
常见文件:
.dts
.dtsi
.dtb
.dtbo
它的作用是描述硬件连接信息。
例如:
这块板子用了哪个屏幕
I2C 地址是多少
GPIO 引脚怎么接
中断号是多少
电源时序是什么
摄像头接在哪个 MIPI 接口
触摸屏复位脚是哪一个
2. Driver 和 Device Tree 的区别
Driver:告诉系统“怎么操作这个硬件”
Device Tree:告诉系统“这个硬件在哪里、参数是什么”
举例:
触摸驱动代码:
负责读坐标、处理中断、上报 input 事件
设备树:
描述触摸 IC 的 I2C 地址、中断 GPIO、复位 GPIO、电源配置
十一、Framework
Android Framework 是 Android 系统为 App 提供的上层 API 和系统服务。
常见 Framework 能力:
ActivityManager
WindowManager
PackageManager
CameraManager
AudioManager
WifiManager
SensorManager
LocationManager
Framework 通常不会直接操作硬件,而是通过 System Service 调用 HAL,再由 HAL 调用 Driver。
例如音频播放:
音乐 App
↓
MediaPlayer / AudioTrack
↓
AudioFlinger
↓
Audio HAL
↓
ALSA / Kernel Audio Driver
↓
Codec / Speaker
十二、SDK 和 NDK
1. SDK
SDK 全称:
Software Development Kit
软件开发工具包
Android SDK 面向应用开发者,提供:
Android API
编译工具
调试工具
模拟器
文档
Gradle 插件相关工具
SDK 更偏上层应用开发。
2. NDK
NDK 全称:
Native Development Kit
Android NDK 用于开发 C / C++ native 代码。
常见场景:
音视频
游戏引擎
OpenGL
图像处理
算法库
加密库
JNI
跨平台 C/C++ 库
NDK 不是驱动开发工具。
它主要服务于 App 的 Native 层开发。
十三、HIDL 和 AIDL
1. 它们和 HAL 的关系
HAL 是硬件抽象层的概念。
HIDL / AIDL 是定义 HAL 接口的方式。
可以理解为:
HAL:我要抽象硬件接口
HIDL / AIDL:用什么语言和规范来定义这些接口
2. HIDL
HIDL 全称:
HAL Interface Definition Language
它是 Android 为 HAL 设计的一套接口定义语言。
Android 8.0 Treble 之后,大量 HAL 使用 HIDL 方式定义接口。
3. AIDL HAL
AIDL 全称:
Android Interface Definition Language
AIDL 原本常用于 Android Binder 跨进程通信,后来也被用于定义 HAL 接口。
现代 Android 更推荐使用 AIDL HAL。
大概演进关系:
Legacy HAL
↓
HIDL HAL
↓
AIDL HAL
十四、Legacy HAL 和 Binderized HAL
1. Legacy HAL
早期 HAL 经常以动态库形式存在。
大概调用方式:
System Service
↓ dlopen
HAL .so
↓
Kernel Driver
特点是系统进程直接加载 HAL 动态库,耦合较重。
2. Binderized HAL
Android Treble 之后,很多 HAL 变成独立服务,通过 Binder 和 Framework 通信。
大概结构:
System Service
↓ Binder IPC
HAL Service
↓
Kernel Driver
优点:
Framework 和 Vendor 解耦
系统升级更方便
HAL 崩溃不一定拖垮 system_server
接口版本更清晰
权限隔离更好
SELinux 管理更清晰
十五、用 Android 手机举例
假设厂商要开发一台 Android 平板,芯片厂通常会提供一套 BSP:
Android BSP
├── Bootloader
├── Linux Kernel
├── 屏幕驱动
├── 触摸驱动
├── Camera 驱动
├── Audio 驱动
├── Wi-Fi / BT 驱动
├── Camera HAL
├── Audio HAL
├── Sensor HAL
├── Power HAL
├── Device Tree
├── init.rc
├── sepolicy
├── BoardConfig.mk
├── 固件文件
└── 烧录工具
设备厂商在这套 BSP 基础上进行适配:
换屏幕
换触摸 IC
换摄像头模组
换电池
改按键
改分区
改开机动画
适配传感器
调试功耗
调试音频
调试相机效果
最终生成可以烧录的系统镜像:
boot.img
vendor.img
system.img
dtbo.img
vbmeta.img
super.img
这些镜像整体也经常被称为:
ROM 包
固件包
刷机包
系统镜像
十六、几个概念的对比表
十七、最核心的记忆方式
可以这样记:
Firmware:硬件自己内部跑的程序
Driver:内核里控制硬件的代码
HAL:Android 对硬件能力的标准封装
Framework:给 App 提供系统 API
BSP:把 Bootloader、Kernel、Driver、HAL、Firmware、配置和工具打包起来
再简化一点:
Driver 负责“控制硬件”
HAL 负责“统一接口”
Firmware 负责“硬件内部逻辑”
BSP 负责“让整块板子跑起来”
十八、面试回答版本
如果面试官问:固件、驱动、HAL、BSP 有什么区别?
可以这样回答:
固件是运行在设备或硬件模块内部的底层程序,例如 Wi-Fi 固件、蓝牙固件、Modem 固件。驱动是操作系统内核中控制硬件的代码,例如触摸驱动、音频驱动、摄像头驱动。HAL 是 Android Framework 和底层驱动之间的硬件抽象层,它不是驱动,而是厂商按照 Android 标准实现的一组接口,用来屏蔽硬件差异。BSP 是板级支持包,是一个更大的集合,通常包含 Bootloader、Kernel、Driver、Device Tree、HAL、Firmware、编译配置和烧录工具,用来支持某块具体硬件板子运行操作系统。
十九、最终总结
这些概念可以按范围从小到大理解:
Firmware / Driver / HAL
↓
Kernel / Framework
↓
BSP
按运行链路理解:
App
↓
Framework
↓
HAL
↓
Driver
↓
Firmware
↓
Hardware
按启动链路理解:
BootROM
↓
Bootloader
↓
Kernel
↓
Android System
真正做 Android ROM 或嵌入式开发时,通常不是只改一个地方,而是会同时涉及:
设备树配置
内核驱动调试
HAL 适配
firmware 加载
init 启动配置
sepolicy 权限
系统镜像编译
烧录测试
所以这些概念最好不要孤立记,而是放到完整系统架构里理解。
固件、驱动、HAL、BSP 等底层概念
https://lautung.com/archives/W5dFw8nw