Erase/Trim/Discard/Sanitize

2024-08-28 12:32
文章标签 trim discard erase sanitize

本文主要是介绍Erase/Trim/Discard/Sanitize,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

针对JEDEC协议中几个抹除资料的命令,大家都很容易将其混淆。现在就这四个抹除命令作详细介绍,希望能帮助大家分清各个命令的具体含义及用法。

  1. Erase

1.1擦除组(EraseGroup

Erase翻译过来是抹去、擦除的意思。eMMC中可擦除的单位称为“擦除组”,擦除组是用写入块(writeblocks,Device的基本可写单位)来测量的。擦除组的大小是一个设备特殊参数,当ERASE_GROUP_DEF设置为不可用的时候,擦除组的大小在CSD中定义;当ERASE_GROUP_DEF设置为可用的时候,擦除组的大小在EXT_CSD中定义。

ERASE_GROUP_DEF(EXT_CSD[175])=0

size of erasableunit
= (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULT+ 1)

size of writeprotect
= (WP_GRP_SIZE+1)

ERASE_GROUP_DEF(EXT_CSD[175])=1

size of erasableunit
= 512Kbyte × HC_ERASE_GRP_SIZE

size of writeprotect
= 512KB * HC_ERASE_GRP_SIZE *HC_WP_GRP_SIZE

    1. Erase的原理

一旦擦除的命令成功完成,擦除掉的映射地址范围用写满01的形式表现出来。擦除命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

    1. Erase的过程

Erase的过程分三个步骤:

  1. 首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址

  2. Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址

  3. 通过ERASE(CMD38)命令将参数全部设置为0ERASE命令的地址段是一个擦除组地址)

如果erase命令(CMD35,CMD36.CMD38)接收到的命令顺序与Erase步骤不同,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。

如果host提供一个范围外的地址作为CMD35CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个擦除顺序。

如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。

如果擦除的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_RESET位将会在状态寄存器中设置。

具体流程图如下所示:

  1. TRIM

2.1TRIM单位—写入块(writeblock)

Trim的可擦除单位是写入块,而非擦除组。定义了三种多块写入的类型:

Open-ended Multiple-block write ,Multiple-block write with pre-defined block count,

Reliable Write

Host可以通过多块操作在任意时间中止写动作。Host通过发送一个传输命令中止动作。

2.2 TRIM的原理

一旦Trim的命令成功完成,Trim掉的映射地址范围用写满01的形式表现出来。Trim命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

2.3 TRIM的过程

TRIM的过程分三个步骤:

  1. 首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址

  2. Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址

  3. 通过ERASE(CMD38)命令将参数bit0设置为1,其他的bit都设置为0.(在TRIM操作中CMD35CMD36地址的识别都是通过写入块实现的)

如果Trim命令(CMD35,CMD36CMD38)中的一个元素接收到与既定TRIM步骤不同的顺序,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。

如果host提供一个范围外的地址作为CMD35CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个TRIM顺序。

如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。

如果TRIM的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_RESET位将会在状态寄存器中设置。

Host应该慎重执行Trim命令以防止非故意的数据丢失。

重置Device(使用CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。

  1. Discard

3.1Discard单位-写入块(writeblock)

Discard的可擦除单位是写入块,而非擦除组

3.2 Discard的原理

Host端不关心Discard的映射地址范围的表现形式,不像ERASETRIM根据内存技术的不同需要写满01,它的表现形式可以是一些或全部的原始数据。它的作用也是简单的将映射地址范围移动到未映射的地址范围。

3.3 Discard的过程

Discard的过程分三个步骤:

  1. 首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址

  2. Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址

  3. 通过ERASE(CMD38)命令将参数bit0bit1设置为1,其他的bit都设置为0.(在Discard操作中CMD35CMD36地址的识别都是通过写入块实现的)

如果Discard命令(CMD35,CMD36CMD38)中的一个元素接收到与既定Discard步骤不同的顺序,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。

如果host提供一个范围外的地址作为CMD35CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个Discard顺序。

如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。

如果Discard的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_RESET位将会在状态寄存器中设置。

Host应该慎重执行Discard命令以防止非故意的数据丢失。

重置Device(使用CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。

  1. Sanitize

Sanitize操作是一个功能,它不同于TrimErase将映射地址范围移动到未映射的地址范围。而是要求Device直接从未映射地址范围空间的数据物理移除。

Sanitize通过extendedCSD[165]SANITIZE_START写入一个值发起,当device在进行Sanitize操作时,Device进入到busy状态。直到下列操作发生时,Sanitize操作才会停止:

Sanitizeoperation is complete.

AnHPI is used to abort the operation

Apower failure.

Ahardware reset.

Sanitize操作完成了之后,在未映射的host地址空间内将不会有数据存在。当Sanitize操作被HPIPowerfailure中断后,未映射的host地址空间状态将无法得到保护,Host必须写入extendedCSD[165]SANITIZE_START来重新初始化Sanitize操作并允许Sanitize操作来确保未映射的host地址空间里的数据已被清除。

Host无法对该域进行Sanitize操作时,应用程序必须配合Device生厂商正确地实现该操作以确保device的可靠性。

  1. ERASE/TRIM/DISCARD/SANITIZE的区别

总体上来说,ERASE/TRIM/DISCARD三者很相似,SANTIZE差异比较大。总体区别如下图表格所示:

 

擦除命令

 

Erase

Trim

Discard

Sanitize

argument

0x00000000

0x00000001

0x00000003

N/A

unit

Erase group

Write block

Write block

N/A

Operation

moving the mapped host address range to the unmappedhost address range

moving the mapped host address range to the unmappedhost address range

moving the mapped host address range to the unmappedhost address range

Removedfrom unmapped user address space

Read the region applied

All 0 or 1 (depending on memory tech.)

All 0 or 1 (depending on memory tech.)

Don’t care (Some or all of the original data)

N/A

Interrupt

N/A

重置Device(使CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。

重置Device(使CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Discard命令,这样将会导致在这样操作中的数据处在一个未知的状态。

Sanitize操作完成了之后,在未映射的host地址空间内将不会有数据存在。当Sanitize操作被HPIPowerfailure中断后,未映射的host地址空间状态将无法得到保护,Host必须写入extendedCSD[165]SANITIZE_START来重新初始化Sanitize操作并允许Sanitize操作来确保未映射的host地址空间里的数据已被清除。

这篇关于Erase/Trim/Discard/Sanitize的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114769

相关文章

C++ set find erase 报错 崩溃

不是find报错,而是访问find之后的迭代器或者erase,报错崩溃。 这是因为可能find出来的元素不存在,所以需要先判断一下。

Python trim()切片函数去除首尾空格

def trim(s):if len(s) == 0: # 字符串为空直接返回return ''elif s[0] != ' ' and s[-1] != ' ': # 首尾不存在空格直接返回return selif s[0] == ' ': # 字符串头存在空格则截断return trim(s[1:])else:return trim(s[:-1]) # 字符串尾存在空格则截断

解决Spring Boot中Druid连接池“discard long time none received connection“警告

在使用Spring Boot结合Druid连接池时,开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种解决方法。 问题现象 在使用Druid连接池的新版本(如1.2.5)时,控制台可能会时不时打印以下警告: WARN

discard connection

现象 2021/05/31-19:36:38.927 [] [ShardingSphere-0] ERROR com.alibaba.druid.pool.DruidDataSource- discard connectioncom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations a

【廖雪峰 python教程 课后题 切片】利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:

#encoding:utf-8 #定义一个函数,用来去除字符串首尾的空格 def trim(s):     '''首先判断该字符串是否为空,如果为空,就返回该字符串,     如果不为空的话,就判断字符串首尾字符是否为空,     如果为空,就使用递归再次调用该函数trim(),否则就返回该函数'''     if len(s) == 0:         re

mysql与oracle在使用trim()函数上的区别

oracle中测试结果如下: SQL> select 1 from dual where (trim(' ') is null); 1 ---------- 1 SQL> select 1 from dual where (trim(' ') = ''); 1 ---------- mysql中测试结果如下: mysql> select (trim('

boost::string_algo详解5——erase相关函数

erase的主要函数(以及其包括的copy函数)包括:  erase_range, erase_first, erase_last, erase_nth, erase_head, erase_tail, erase_regex, erase_all, erase_all_regex [cpp] view plain copy print ? void test_s

boost::string_algo详解4——trim_if,trim_copy_if,trim_xxxx_if,trim_xxxx_copy_if

函数的部分原型 [cpp] view plain copy print ? template<typename SequenceT, typename PredicateT>     void trim_if(SequenceT & Input, PredicateT IsSpace);      template<typename OutputIteratorT, typen

STL 序列容器和关联容器erase的用法

之前在代码中使用map::erase函数时,误搬了vector::erase的用法,导致Server down掉了,好在在测试环境就及时发现了问题,在上线前进行了补救==。 以下总结一下map::erase的正确用法。 首先看一下在循环中使用vector::erase时我习惯的用法: for(vector<int>::iterator it = vecInt.begin(); it != vec