探究eFuse:硬件保障与系统安全的核心
探究eFuse:硬件保障与系统安全的核心
图1: 编程熔断的 eFuse
eFUSE的全名是"Electrically Programmable Read-Only Memory Fuse",它是一种电可编程只读存储器。
eFUSE是一种用于存储固定信息的存储器,它的主要特点是一旦编程后就无法再进行擦除或修改,类似于传统的只读存储器(ROM)的功能。
作为系统工程师,虽然不会对eFuse 这块做深入的开发,更多的还是依赖芯片厂商自己的实现,然后取出自己的数据,但是通过对 eFuse 大致的了解,能够对整机的一些概念紧密联系起来,让知识图谱更全面。
目前手机行业内,出厂都会做熔丝处理,熔丝之后,不能进行随意刷机,非熔丝设备一般属于开发设备,用来内部自定义刷机。
熔丝过程中,有一个步骤就是写入设备ID信息, 熔丝设备通常具有唯一的设备ID,可以用防止软件篡改和仿冒,一些商业化行为的唯一标记等。
这些标识通常是在制造过程中预先烧录到eFUSE中的,用于识别每个设备的唯一性,Bootloader可以读取eFUSE中的这些标识,并在设备启动时使用它们来进行身份验证。
eFuse不是软件上的分区
eFUSE(熔断保护)通常是硬件特性,而不是预置的软件特性,eFUSE是一种一次性可编程的硬件存储器,用于存储固定的数据或配置信息,例如设备序列号、密钥、硬件配置等。
eFUSE在手机或其他设备的主板上实现,并由硬件厂商预置一些不可更改的数据。这些数据通常在制造过程中被烧录到eFUSE中,并且无法在后续的使用中被修改。因此,eFUSE中存储的信息是设备固有的、不可更改的。
在 Android 系统中,eFUSE通常被用于存储一些重要的设备信息和安全相关的数据,例如设备唯一标识、安全密钥、加密相关信息等。这些数据的安全性和不可篡改性是系统的重要保障,因此通常会将它们存储在eFUSE中,以防止被非法篡改或泄漏。
由于eFUSE的特性,它一般不受 Android 系统软件的影响,也不是可编程的软件特性。因此,Google 原生 Android 系统上的eFUSE通常是由设备硬件厂商预置和配置的,与 Android 系统软件无关。
BootLoader 实现读取
eFUSE 在Bootloader中扮演着重要的角色,用于存储关键的设备信息和安全配置,帮助确保设备的启动过程和运行环境的安全性。它是Android设备等嵌入式系统中重要的安全保障措施之一。
Android bootloader 是一个引导加载程序,它位于 Android 设备的存储芯片中,负责启动设备并加载操作系统。它是设备上的第一个软件程序,负责执行一系列初始化任务和配置操作,以确保设备能够正确启动。
目前 bootloader 不属于 AOSP 内标准的模块,一般是芯片厂商在维护,目录结构也不统一,对于 eFuse 的读取模块也在 lk 内, 高通的 bsp 模块一般是独立编译,MTK和展讯所在的目录也不太一样,常见的有这些目录结构:
- bsp/bootloader/lk
- kernel/lk/
eFuse 存在 BootLoader 中的功能有:
安全启动验证
Bootloader是在设备启动时运行的第一个软件程序,负责初始化硬件和加载操作系统,在安全启动流程中,Bootloader通常会检查 eFUSE 中的安全配置信息,例如是否启用了 Secure Boot(安全启动)功能。
如果eFUSE中的安全标志被设置为启用,Bootloader会执行相应的安全验证流程,以确保设备启动的固件和操作系统是经过验证的,从而防止未经授权的固件加载。设备唯一标识
Bootloader可能会使用eFUSE中存储的设备唯一标识(Device ID)作为设备的身份认证信息。
这些标识通常是在制造过程中预先烧录到eFUSE中的,用于识别每个设备的唯一性。
Bootloader可以读取eFUSE中的这些标识,并在设备启动时使用它们来进行身份验证。安全密钥存储
某些Bootloader可能会使用eFUSE来存储安全密钥,例如用于加密和解密数据的密钥。这些密钥通常是在制造过程中预先烧录到eFUSE中的,以确保密钥的安全性和不可篡改性。防止硬件修改
Bootloader可能会使用eFUSE来检查设备硬件的配置和状态,以确保硬件没有被修改或篡改。通过读取eFUSE中存储的硬件配置信息,Bootloader可以识别任何不合法的硬件修改,从而确保设备的完整性和安全性。
eFuse 和 NVRAM 的区别
eFUSE(Electrically Programmable Read-Only Memory Fuse)和 NVRAM(Non-Volatile Random Access Memory)
eFUSE(电可编程只读存储器):
- 特性:eFUSE是一种只读存储器,一旦编程后就无法再进行擦除或修改。它是一次性可编程的,一旦被烧录,存储的数据将变为永久性的。
- 用途:eFUSE通常用于存储一些重要的设备信息和安全相关的数据,例如设备唯一标识、安全密钥、硬件配置等。这些数据的安全性和不可篡改性是系统的重要保障。
- 编程:eFUSE通常在制造过程中被烧录,由硬件厂商预置一些不可更改的数据。它一般不受软件的影响,也不是可编程的软件特性。
NVRAM(非易失性随机存取存储器):
- 特性:NVRAM是一种随机访问存储器,它可以读取和写入数据,并且数据在断电后仍然保持不变,具有非易失性特性。
- 用途:NVRAM通常用于存储一些配置信息、用户设置、操作系统状态等需要持久化保存的数据。
- 编程:NVRAM中的数据通常由操作系统或应用程序进行读取和写入,可以在运行时进行修改和更新。
在手机行业中, eFuse 涉及到的开发一般是工具开发工程师在处理,兼容不同芯片,将设备ID等基础功能兼容好,NVRAM的开发更多是涉及到软件工程师,根据实际的需求来读写数据。
比如常见的电子保卡,WIFI、MAC等一些格式化需要保留的信息等。

MTK的刷机设备上通过 Download Only 以及 Android设备自带的恢复出厂设置就不会将 NVRAM 存储的数据清除, 但是 Format ALL+Download(格式化刷机) 就会将NVRAM数据清除。
eFuse 一般就是一次写入,比如设备ID, NVRAM是根据实际的需求,由软件工程师来进行读写。
熔丝工具
熔丝工具(Fuse Programming Tool)是用于编程eFuse的特定工具,其原理主要涉及以下方面:
- 接口和通信
熔丝工具需要与目标设备建立通信,并通过特定的接口与设备进行数据传输。通常,熔丝工具使用USB、JTAG、SWD(Serial Wire Debug)等接口与目标设备进行连接。 - 认证和权限
为了确保对eFuse的编程是安全可靠的,熔丝工具通常需要进行认证和权限验证。这可以防止未经授权的访问者对设备的eFuse进行编程。 - 操作命令
熔丝工具通过发送特定的操作命令到目标设备来控制eFuse的编程。这些命令可能包括读取eFuse的状态、擦除eFuse、编程eFuse等。 - 保护机制
为了防止误操作或恶意篡改,熔丝工具可能会实现一些保护机制,如写保护功能、编程次数限制等。 - 错误处理
熔丝工具需要能够处理可能出现的错误情况,如通信错误、设备响应超时、编程失败等,以保证编程的准确性和稳定性。
熔丝工具原理可能因厂商、芯片型号和设备特性而异, 因此,在使用熔丝工具时,需要严格按照厂商提供的文档和指导进行操作,避免因错误的操作而导致设备损坏或数据丢失,
此外,由于eFuse是一次性编程的,一旦编程完成,其中的信息将无法修改或擦除,因此操作时必须谨慎。
所以对于工具工程师而言,这里面核心的工作任务就是兼容不同芯片,保证熔丝的稳定。
一般涉及到 eFuse 写入的稳定性问题,一般都是芯片厂内部的逻辑,对于手机厂商而言,如果遇到设备ID失败,异常的问题,就会被归类为影响整机的严重问题。
任天堂的 Switch 掌机通过 eFuse 来防止设备降级, 在用户升级系统时,机器会熔断一定数量 eFuse ,而用户试图降级系统时会校验版本和熔丝的数量,如果不匹配就无法刷入系统。
软破解的任天堂的Switch,就是通过外接锡纸的形式然后进入到一个大气层系统,然后在进入到Switch原始的系统, 对于设备的破解而言,一般都是推荐用户在离线的模式下进行,一个是防止软件上的数据更新导致的异常行为被发现,一个是设备升级版本之后,会对 eFuse进行熔断到当前的系统版本,如果熔断到最新版本后,可能就没法在刷入三方系统。
eFuse 是可以通过电子显微镜看见熔断的情况,见图一。
在大型安全SOC芯片中, eFuse 是一种重要的非易失性存储单元,由熔丝结构构成,通过熔丝可以在芯片上编程并存储信息.常常用于存储安全相关的内容,比如密钥、密码等信息,
因此对于芯片的安全系统非常重要。但是由于工艺尺寸的突飞猛进,efuse作为一种较为脆弱的电路单元,常常在使用过程中由于静电或者其他原因造成efuse损坏,造成整个芯片和系统无法工作,只能整机报废,从而导致大量的浪费。
eFuse 读取
对于设备ID而言,一般是通过在 BootLoader 内部读取 eFuse存储位中的信息得到设备ID,可以写入到属性,然后Android 系统进入后,就可以通过读取属性得到唯一的设备ID。
大部分的情况而言,设备ID的异常问题,是出现在 BootLoader 的读取里面,需要手机厂商自行去解决。
例如,在某些系统中,eFuse 可能被配置为存储一个 32 位的整数值。读取该 eFuse 后,得到的数据可能是一个 32 位的二进制数,或以十六进制表示的 8 位数(4 字节)。
比如通过芯片厂商提供的接口,能够获取到32位的整数值,然后需要转换记录到本地, 比如fdt32_to_cpu 函数的实现:
#include <stdint.h>
uint32_t fdt32_to_cpu(const uint32_t *val)
{
// 假设系统为小端字节序(Little-Endian)
uint32_t result;
uint8_t *p = (uint8_t *)val;
result = (uint32_t)p[0];
result |= ((uint32_t)p[1] << 8);
result |= ((uint32_t)p[2] << 16);
result |= ((uint32_t)p[3] << 24);
return result;
}
fdt32_to_cpu 函数接受一个指向 FDT 中存储 32 位整数的指针 val,然后按照小端字节序将这个 32 位整数值转换为 CPU 的本地字节序,并将转换后的值返回。
本文只是从软件开发的角度,简单梳理一下eFuse 涉及到的模块以及基本概念,本文也在持续的更新中,如果你需要得到最新的更新,请访问: 探究eFuse:硬件保障与系统安全的核心
探究eFuse:硬件保障与系统安全的核心的更多相关文章
- ubuntu下的时间设定(硬件时间,系统时间,本地时间)
问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...
- Linux中有硬件时钟与系统时钟
在Linux中有硬件时钟与系统时钟等两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.当Linux启动时,系统时钟会去读取硬件时钟的设 ...
- StatsD!次世代系统监控的核心
在互联网业务蒸蒸日上的今时今日,系统架构日渐复杂,随着软件产品和工程团队的变革,许多开源的监控工具应运而生,其中有一些相当出名,比如 Zabbix.Nagios 还有 StatsD.也有一些问题被大家 ...
- Centos7 修改硬件时间和系统时间
查看系统时间 [root@localhost ~]# date Tue Jun 13 10:20:13 CST 2017 查看硬件时间 [root@localhost ~]# hwclock --sh ...
- (转)Centos7 修改硬件时间和系统时间
查看硬件时间 [root@localhost ~]# hwclock --show Tue 13 Jun 2017 02:11:12 AM CST -0.848845 seconds 1 2 可以看出 ...
- ntp/系统时钟/硬件时钟/双系统下计算机时间读取的问题
http://blog.chinaunix.net/uid-182041-id-3464524.html //linux系统时间和硬件时钟问题(date和hwclock) http://j ...
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
1.时间同步(手动): date -s "2015-07-15 22:13:30" hwclock --systohc (表示系统时间同步到硬件时钟) hwclo ...
- ti的硬件时钟和系统时钟同步
1.hwclock -w软到硬 hwclock -s 硬到软 2. 通过ntp网络时钟控制同步 3.etc下的localtime文件和GMT-8
- 嵌入式系统图形库GUI核心模块介绍
本文转载自:http://blog.csdn.net/xteda/article/details/6575278 (作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO Blog:h ...
- 数据聚合 & 分组:新一代系统监控的核心功能
遥想 2015 年 8 月 17 日,Cloud Insight 还在梳理功能原型,畅想 Cloud Insight 存在的意义:为什么阿里云用户需要使用 Cloud Insight 来加强管理. 而 ...
随机推荐
- windows11 下使用 阿里云 modelscope docker 环境 运行参考
昨天看视频 我们做了个能对话的AI派蒙,免费给大家玩! 发现阿里有一个语音转文字的模型(paraformer),之前处理这种需求一直都是直接调用服务商提交好的API接口 突然想尝试一下本地搭建,虽然和 ...
- #Powerbi 理解VAR函数
VAR意思即为变量,在编程语言中,变量是一个重要概念,DAX作为一种语言也有变量概念,利用VAR,我们可以缩短我们一些DAX语句的长度,更清晰的表达我们的度量值计算逻辑. 举例说明: 我们要计算一个产 ...
- js验证统一社会信用代码
js验证统一社会信用代码 //验证信用代码 function CheckSocialCreditCode(Code) { var patrn = /^[0-9A-Z]+$/; //18位校验及大写校验 ...
- 2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨
2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨 ...
- 2022-11-28:给定两个数组A和B,比如 A = { 0, 1, 1 } B = { 1, 2, 3 } A[0] = 0, B[0] = 1,表示0到1有双向道路 A[1] = 1, B[1]
2022-11-28:给定两个数组A和B,比如 A = { 0, 1, 1 } B = { 1, 2, 3 } A[0] = 0, B[0] = 1,表示0到1有双向道路 A[1] = 1, B[1] ...
- 2021-06-01:K个逆序对数组。给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第 j个元素,如果满
2021-06-01:K个逆序对数组.给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数.逆序对的定义如下:对于数组的第i个和第 j个元素,如果满 ...
- 2021-08-17:谷歌面试题扩展版,面值为1~N的牌组成一组,每次你从组里等概率的抽出1~N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜
2021-08-17:谷歌面试题扩展版,面值为1N的牌组成一组,每次你从组里等概率的抽出1N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且< ...
- Redis数据结构二之SDS和双向链表
本文首发于公众号:Hunter后端 原文链接:Redis数据结构二之SDS和双向链表 这一篇笔记介绍一下 SDS(simple dynamic string)和双向链表. 以下是本篇笔记目录: SDS ...
- 树莓派上使用docker部署aria2,minidlna
目前在树莓派上安装aria2跟minidlna能搜到的教程基本上都是直接apt-get install安装的.现在是docker的时代了,其实这2个东西可以直接使用docker run跑起来.有什么问 ...
- 蓝桥杯真题 平面切分(Set自定义去重)
题目详情 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 平面上有 N 条直线,其中第 i 条直线是 y=Ai⋅ ...
