焕发生机|嵌入式存储eMMC原理解析

news2024/11/20 20:26:20

1.EMMC背景回顾

EMMC存储的发展历史可以追溯到1997年,当时该技术是为了解决移动设备中存储器的问题而提出的。当时移动设备的存储器主要是NOR flash,这种存储器虽然读写速度快,但是造价高、容量小,不适合大规模应用。而EMMC的出现,将存储器和处理器或其他电子元件一起集成到单一芯片中,形成小巧、轻便的封装模块,解决了这个问题。随着技术的不断发展,EMMC规格的标准也逐渐从eMMC4.3时代发展到eMMC4.4时代,并进一步发展出eMMC4.5和eMMC 5.0等版本。其中,eMMC 5.0是三星于2013年7月29日首先量产的行业首款eMMC 5.0存储产品。

2.EMMC基本原理

eMMC是嵌入式MultiMediaCard的简称,它是对MMC存储卡标准的一个拓展,以满足更高标准的性能、成本、体积、稳定、易用等的需求。eMMC整体架构主要可以分为Flash Memory、Flash Controller以及Host Interface三大部分。

其中,Flash Memory是eMMC存储数据的主要部分,属于非易失性存储器,用于存放系统、应用和数据等,类似于PC系统中的硬盘。在eMMC内部,Flash Memory会被划分成不同的区域,包括BOOT Area Partition、RPMB Partition、General Purpose Partition和User Data Area等。

3.EMMC应用场景

由于EMMC具有大容量、高可靠性、低功耗、可扩展性强等特点,被广泛应用于各种嵌入式系统中,如手机和平板等移动设备。在这些设备中,eMMC通常会与处理器或SOC配合使用,以实现数据的存储和读取。开发者可以使用eMMC存储和读取设备中的系统和应用数据,包括操作系统代码、用户数据、应用程序等。

同时,随着技术的发展,EMMC的读写速度也不断提升,比如最新的eMMC 5.1读写速度已经可以达到UHS-II等级的速度。此外,EMMC也被应用于一些新兴的技术领域,比如DPU。在DPU中,EMMC作为存储器使用,支持DPU处理大量数据时所需的大容量存储器,同时满足DPU对高速数据传输的需求。

业内也有一个iNAND,是西部数据公司符合eMMC协议的一种芯片系列名称。也就是说,iNAND是一种eMMC,它基于eMMC协议进行设计和生产。是由存储系统和接口电路构成的,但它的接口电路比较复杂,功能很健全。它不仅提供了块的ECC校验相关的逻辑,而且本身自己完成了存储系统的ECC功能。这样,当SoC使用iNAND时,它就不需要自己编写代码来进行ECC相关操作,从而大大简化了SoC的编程难度。

另外,WD在HDD上采用的OptiNAND不是EMMC,基于UFS的产品。此前,WD针对HDD的创新提出了OptiNAND技术。OptiNAND技术的核心就是新增了iNAND UFS EFD,把磁道记录等元数据记录在iNAND之中。

根据官方的介绍,OptiNAND可以提升容量、性能和可靠性。

  • 容量:采用triple stage actuator (TSA) 技术,实现更大的实现更大的TPI(每英寸磁道)数量和更高的面密度,在不需要增加碟片数量和磁头数量的情况下,实现容量的提升。原来放置在碟片的元数据,现在放在iNAND,也相当于给用户腾空了原来占用的数据空间,利于用户容量的提升。
  • 性能:降低了相邻磁道的干扰ATI,也可以降低写缓存的刷新频率,这样就可以减少延迟,提升性能
  • 可靠性:主要在EPO突然掉电场景,iNAND下刷的用户数据比之前DRAM缓存更多。

4.eMMC健康状态查询

在linux下,eMMC也是一个块设备,类似 /dev/mmcblk*。查看块设备的smartctl工具,对emmc也能查到一部分信息,但是信息很少。

# smartctl -a /dev/mmcblk0  
smartctl 6.6 2021-07-22 r5044 [x86_64-linux-4.18.0-140-generic] (local build)  
Copyright (C) 2002-18, Bruce Allen <brucea@smartmontools.org>  
  
=== START OF INFORMATION SECTION ===  
model number:                SanDisk Ultra Fit (Toshiba 1306)  
firmware version:           OI_R248R354E4B8AF6AFAAI405T54JABOHX7244_SD03_V06.1036_V315A0943_AB32970F-S  
LU WWN Device Id:           5 00a0d 661566343  
serial number:               D70262389048F5D6ECC342A5B9CBFA5C3    OI_R248R354E4B8AF6AFAAI4E87U46OUIA_SDS6P0W03E1A9E9A1B7A7F7C7E9E9B8F8D8C7A2D  
capacity:                   111,385,296 (56GiB)  
formatted capacity:         111,385,296 (56GiB)  
form factor:                 1.8 cm and below  
streaming mode features:     (none)  
mode page present:          yes  
default block size:         512 bytes  
sector size:                512 bytes  
cylinder size:              32 sectors  
heads:                      8  
sectors per track:          32  
capacity (logical):         111,385,296 (56GiB)  
capacity (physical):        111,385,296 (56GiB)  
  
=== START OF SMART DATA SECTION ===  
SMART overall-health self-assessment test result: PASSED  
SMART capabilities include:      read-look-ahead capable  
using internal smoking ritual to test write performance and bytematch against unprotected area (ETag 0x5d9a0bcb) ... or we could have a serious problem. If the ritual completes, it has吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。ok, all tests complete, but my head is off.也许是到了换我了时候了吧,,., ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,。,,,。,,(((((())))))))))))))))))))))))))))。。.,.。.,。.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.

在linux一般用MMC-utils是一个用于管理和调试eMMC设备,以下是一些常用的命令和用法:

  1. 查看EMMC设备信息:
mmc dev

当执行“mmc dev”命令时,它返回关于所有已连接的eMMC设备的信息,返回结果可能是:

/dev/mmcblk0: [    0.000] capacity=111.4G features=0x1ff80600  
/dev/mmcblk0boot0: [    0.000] capacity=   64M features=0x1ff80600

在这个示例中,第一行显示了主eMMC设备的信息,包括设备节点为/dev/mmcblk0,容量为111.4GB,以及一些其他特征信息。第二行显示了一个启动分区的信息,这个启动分区的设备节点为/dev/mmcblk0boot0,容量为64MB。
 

  1. 读取EMMC设备的CSD数据:
mmc extcsd read /dev/mmcblk0

该命令将读取/dev/mmcblk0设备的CSD数据,并将其打印出来。CSD数据包含了EMMC设备的各种信息,如容量、块大小、读写速度等。返回结果可能是:

Device: /dev/mmcblk0
Card version: 2.0
Card revision: 0x01
Maximum data block length: 512 bytes
Card size: 128 GiB (16 GB)
Card capacity: 128 GiB (16 GB)
Card block size: 512 bytes
Card erase block size: 4096 bytes
Card write block size: 512 bytes
Card read block size: 512 bytes
Card bus width: 8 bits
Card speed: 20 MHz
Card type: MMC
Card mode: DDR
Card interface version: 2.0
Card OCR (operating voltage range): 2.7-3.6V
Card command set: MMC

当有异常返回时,比如:

mmc_cmd_err(CMD1): cmd_timeout cmd1 arg 0x00000000

这个结果表示EMMC设备发生了错误,无法执行CMD1命令。出现这个问题的原因可能是设备不支持该命令,或者该命令的语法不正确。

  1. 查看EMMC设备的健康状态:
mmc health /dev/mmcblk0

该命令将显示/dev/mmcblk0设备的健康状态,包括介质错误、读写错误等信息。返回结果可能是:

Device: /dev/mmcblk0
Type: MMC
...
CRC error count: 0
Data read error count: 0
Data CRC error count: 0
Endurance level: Class A
Bus width: 4-bit
Power class: 6
Switch off voltage: 1.8V
Switch mode voltage: 1.8V
Minimum voltage: 1.7V
Maximum voltage: 3.6V
...
  1. 检查EMMC设备的写保护状态:
mmc writeprotect boot get /dev/mmcblk0

该命令将显示/dev/mmcblk0设备boot分区的写保护状态。

  1. 设置EMMC设备的写保护状态:
mmc writeprotect boot set /dev/mmcblk0 1

该命令将设置/dev/mmcblk0设备boot分区的写保护状态为开启(1表示开启,0表示关闭)。

当eMMC出现异常时,可以使用mmc工具来查看返回结果。下面是一个示例案例,展示了如何使用mmc工具来检查eMMC的状态并解析返回结果:

$ sudo mmc read 0x18000000 0x200

上述命令中,mmc read用于读取eMMC的数据,0x18000000是要读取的起始地址,0x200是要读取的数据长度。

如果eMMC正常,返回的结果将是读取到的数据。如果eMMC出现异常,返回的结果可能包含错误代码或状态信息。

例如,如果eMMC出现坏块,返回的结果可能类似于以下内容:

$ sudo mmc read 0x18000000 0x200  
Error: Block address 0x18000000 is bad

上述结果中,Error: Block address 0x18000000 is bad表示在地址0x18000000处存在一个坏块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

hiredis在vs2010上编译不通过

下载源代码 https://github.com/redis/hiredis 然后单独创建pro文件&#xff0c;将相应的.c和.h文件加进去。 然后使用vs2010&#xff08;带有qt插件&#xff09;打开.pro文件&#xff0c;编译报错 上面的为C99语法&#xff0c;而vs2010不支持。只能选择 https://github.com/…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

[Hadoop] start-dfs.sh ssh报错

Permission denied (publickey 决解方案 相关命令 cd ~/.sshssh-keygen -t rsa -p""cat id_rsa.pub >> authorized_keyschmod 0600 authorized_keys 相关链接Hadoop: start-dfs.sh permission denied - Stack Overflow Java HotSpot(TM) Server VM warning…

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一&#xff0c;虽然很长一段时间以来&#xff0c;所有基本git操作都已经可以通过GitLab实现&#xff0c;但GitLab集成仍是JetBrains社区的一大最热门请求。为此&#xff0c;JetBrains团队今年与GitLab联手提供了这种类型的集成。 …

【问题记录】解决Git上传文件到GitHub时收到 “GH001: Large files detected” 错误信息!

环境 Windows 11 家庭中文版git version 2.41.0.windows.1GitHub 问题情况 在命令行中使用git上传pdf文件到GitHub服务器时&#xff0c;提示了如下警告信息&#xff1a; 原因是 GitHub 有一个文件大小限制&#xff0c;通常为 100 MB。 如果尝试上传大于此限制的文件&#xff0c…

EMANE中olsrd的调试

1 调试目的 本着学习的态度&#xff0c;对emane tutorial中的示例程序进行重现&#xff0c;以加深对EMANE的理解和掌握。在示例程序0(见https://github.com/adjacentlink/emane-tutorial/wiki/Demonstration-0)中介绍了使用olsrlinkview.py脚本来通过可视化界面观察olsr节点的链…

Marin说PCB之封装设计系列---(01)--非金属化孔的设计总结

提到封装设计小编我刚刚开始学习的时候也是一头雾水&#xff0c;在网上各种找视频学习怎么建封装。在这里小编我也推荐一波凡亿PCB商城上是有封装课程的&#xff0c;我当时就是买的凡亿的封装设计课程自己跟着老师学习的&#xff0c;效果还是挺好的。小编我免费给他们做一波推广…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具 1.概述2. 工具使用1.概述 Fuxploider是一款功能强大的开源渗透测试工具,该工具专门针对文件上传漏洞而设计,可以帮助广大研究人员以自动化的方式检测和利用目标站点文件上传表单中的安全问题 由于该工具基于Python 3…

用ChatGPT自动生成流程图

我们看别人代码时&#xff0c;总希望有流程图&#xff0c;这样可以一目了然&#xff0c;不过自己写的代码&#xff0c;又不想花几个小时去画流程图。有没有更好的方法呢&#xff1f; 方法就是用ChatGPT等大模型自动生成流程图&#xff0c;并用python等语言实现自动输出流程图。…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web 应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚…

贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...

原文链接&#xff1a;http://tecdat.cn/?p22702 贝叶斯回归分位数在最近的文献中受到广泛关注&#xff0c;本文实现了贝叶斯系数估计和回归分位数&#xff08;RQ&#xff09;中的变量选择&#xff0c;带有lasso和自适应lasso惩罚的贝叶斯&#xff08;点击文末“阅读原文”获取…

K8S集群中部署服务之应用环境配置

微服务项目sangomall应用环境配置说明 一、应用环境配置文件创建 可以创建多个application.properties或application.yml文件,通过关键配置进行激活使用&#xff0c;例如测试环境和生产环境等。 1.1 创建开发环境&#xff08;dev&#xff09; 名称&#xff1a;application-…

举例说明用 easylanguage 语言,编写抄底公式

EasyLanguage 语言在金融领域被广泛使用&#xff0c;尤其是用于编写交易策略和算法。以下是一个简单的抄底公式示例&#xff1a; swift 复制 // 定义变量和参数 Dim StopLossPrice As Double Dim TakeProfitPrice As Double Dim InitialPosition As Double Dim SafetyZon…

Docker 一键安装Confluence(已支持最新版本)

Docker 一键安装Confluence&#xff08;已支持最新版本&#xff09; 本文用于Confluence在Docker的安装&#xff0c;仅用于记录安装方式Jira 也可以参考这种方式安装&#xff0c;只有细微差别转载请注明来源Linux安装可参考链接Windows安装可查考链接条件允许时&#xff0c;请…

HTTP反爬困境

尊敬的程序员朋友们&#xff0c;大家好&#xff01;今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代&#xff0c;许多网站采取了反爬措施来保护自己的数据资源。然而&#xff0c;作为程序员&#xff0c;我们有着聪明才智和技术能力&#xff0c;可以应对这些困境…

《存储IO路径》专题:四种IO栈大比武

1.Linux IO栈处理 我们就从一个常见Linux IO处理流程示意图开始今天的主题。 这个示意图主要描述了Linux系统中I/O请求的处理流程,涉及了I/O接口、文件系统、块层、NVMe驱动等多个部分,整个IO流程处理主要概括以下步骤: 1. 应用程序(Applications)将I/O请求提交给I/O接口…