- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
图1: 编程熔断的 eFuse 。
eFUSE的全名是"Electrically Programmable Read-Only Memory Fuse",它是一种电可编程只读存储器。 eFUSE是一种用于存储固定信息的存储器,它的主要特点是一旦编程后就 无法再进行擦除或修改 ,类似于传统的只读存储器(ROM)的功能.
作为系统工程师,虽然不会对eFuse 这块做深入的开发,更多的还是依赖芯片厂商自己的实现,然后取出自己的数据,但是通过对 eFuse 大致的了解,能够对整机的一些概念紧密联系起来,让知识图谱更全面.
目前手机行业内,出厂都会做 熔丝 处理,熔丝之后,不能进行随意刷机,非熔丝设备一般属于开发设备,用来内部自定义刷机。 熔丝过程中,有一个步骤就是写入设备ID信息, 熔丝设备通常具有唯一的设备ID,可以用防止软件篡改和仿冒,一些商业化行为的唯一标记等。 这些标识通常是在制造过程中预先烧录到eFUSE中的,用于识别每个设备的唯一性,Bootloader可以读取eFUSE中的这些标识,并在设备启动时使用它们来进行身份验证.
eFUSE(熔断保护)通常是 硬件特性 ,而不是预置的软件特性,eFUSE是一种一次性可编程的硬件存储器,用于存储固定的数据或配置信息,例如设备序列号、密钥、硬件配置等。 eFUSE在手机或其他设备的主板上实现,并由硬件厂商预置一些不可更改的数据。这些数据通常在制造过程中被烧录到eFUSE中,并且无法在后续的使用中被修改。因此,eFUSE中存储的信息是设备固有的、不可更改的。 在 Android 系统中,eFUSE通常被用于存储一些重要的设备信息和安全相关的数据,例如设备唯一标识、安全密钥、加密相关信息等。这些数据的安全性和不可篡改性是系统的重要保障,因此通常会将它们存储在eFUSE中,以防止被非法篡改或泄漏。 由于eFUSE的特性,它一般不受 Android 系统软件的影响,也不是可编程的软件特性。因此,Google 原生 Android 系统上的eFUSE通常是由设备硬件厂商预置和配置的,与 Android 系统软件无关.
eFUSE 在Bootloader中扮演着重要的角色,用于存储关键的设备信息和安全配置,帮助确保设备的启动过程和运行环境的安全性。它是Android设备等嵌入式系统中重要的安全保障措施之一.
Android bootloader 是一个引导加载程序,它位于 Android 设备的存储芯片中,负责启动设备并加载操作系统。它是设备上的第一个软件程序,负责执行一系列初始化任务和配置操作,以确保设备能够正确启动。 目前 bootloader 不属于 AOSP 内标准的模块,一般是芯片厂商在维护,目录结构也不统一,对于 eFuse 的读取模块也在 lk 内, 高通的 bsp 模块一般是独立编译,MTK和展讯所在的目录也不太一样,常见的有这些目录结构:
eFuse 存在 BootLoader 中的功能有:
安全启动验证 Bootloader是在设备启动时运行的第一个软件程序,负责初始化硬件和加载操作系统,在安全启动流程中,Bootloader通常会检查 eFUSE 中的安全配置信息,例如是否启用了 Secure Boot(安全启动)功能。 如果eFUSE中的安全标志被设置为启用,Bootloader会执行相应的安全验证流程,以确保设备启动的固件和操作系统是经过验证的,从而防止未经授权的固件加载.
设备唯一标识 Bootloader可能会使用eFUSE中存储的设备唯一标识(Device ID)作为设备的身份认证信息。 这些标识通常是在制造过程中预先烧录到eFUSE中的,用于识别每个设备的唯一性。 Bootloader可以读取eFUSE中的这些标识,并在设备启动时使用它们来进行身份验证.
安全密钥存储 某些Bootloader可能会使用eFUSE来存储安全密钥,例如用于加密和解密数据的密钥。这些密钥通常是在制造过程中预先烧录到eFUSE中的,以确保密钥的安全性和不可篡改性.
防止硬件修改 Bootloader可能会使用eFUSE来检查设备硬件的配置和状态,以确保硬件没有被修改或篡改。通过读取eFUSE中存储的硬件配置信息,Bootloader可以识别任何不合法的硬件修改,从而确保设备的完整性和安全性.
eFUSE(Electrically Programmable Read-Only Memory Fuse)和 NVRAM(Non-Volatile Random Access Memory) 。
eFUSE(电可编程只读存储器):
NVRAM(非易失性随机存取存储器):
在手机行业中, eFuse 涉及到的开发一般是工具开发工程师在处理,兼容不同芯片,将设备ID等基础功能兼容好,NVRAM的开发更多是涉及到软件工程师,根据实际的需求来读写数据.
比如常见的电子保卡,WIFI、MAC等一些格式化需要保留的信息等.
MTK的刷机设备上通过 Download Only 以及 Android设备自带的恢复出厂设置就不会将 NVRAM 存储的数据清除, 但是 Format ALL+Download(格式化刷机) 就会将NVRAM数据清除.
eFuse 一般就是一次写入,比如设备ID, NVRAM是根据实际的需求,由软件工程师来进行读写.
熔丝工具(Fuse Programming Tool)是用于编程eFuse的特定工具,其原理主要涉及以下方面:
熔丝工具原理可能因厂商、芯片型号和设备特性而异, 因此,在使用熔丝工具时,需要严格按照厂商提供的文档和指导进行操作,避免因错误的操作而导致设备损坏或数据丢失, 此外,由于eFuse是一次性编程的,一旦编程完成,其中的信息将无法修改或擦除,因此操作时必须谨慎.
所以对于工具工程师而言,这里面核心的工作任务就是兼容不同芯片,保证熔丝的稳定.
一般涉及到 eFuse 写入的稳定性问题,一般都是芯片厂内部的逻辑,对于手机厂商而言,如果遇到设备ID失败,异常的问题,就会被归类为影响整机的严重问题.
任天堂的 Switch 掌机通过 eFuse 来防止设备降级, 在用户升级系统时,机器会熔断一定数量 eFuse ,而用户试图降级系统时会校验版本和熔丝的数量,如果不匹配就无法刷入系统。 软破解的任天堂的Switch,就是通过外接锡纸的形式然后进入到一个大气层系统,然后在进入到Switch原始的系统, 对于设备的破解而言,一般都是推荐用户在离线的模式下进行,一个是防止软件上的数据更新导致的异常行为被发现,一个是设备升级版本之后,会对 eFuse进行熔断到当前的系统版本,如果熔断到最新版本后,可能就没法在刷入三方系统.
eFuse 是可以通过电子显微镜看见熔断的情况,见图一.
在大型安全SOC芯片中, 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:硬件保障与系统安全的核心的文章就讲到这里了,如果你想了解更多关于探究eFuse:硬件保障与系统安全的核心的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!