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地址空间里的数据已被清除。

### MTD 设备擦除和写入操作 在 Linux 中,MTD (Memory Technology Device) 接口用于访问闪存设备。为了安全有效地管理这些设备的操作,Linux 提供了一套 API 来处理读取、写入和擦除等基本功能。 #### 擦除 MTD 分区 要擦除 MTD 分区,可以使用 `mtd-utils` 工具包中的命令行工具或通过编程接口实现: 1. **命令行方式** 使用 `flash_erase` 命令来擦除整个分区或指定区域: ```bash sudo flash_erase /dev/mtdX 0 0 ``` 这里 `/dev/mtdX` 是目标 MTD 设备文件名,最后一个参数设置为 0 表示擦除整个分区[^1]。 2. **编程接口** 对于程序开发来说,可以通过调用 C 库函数来进行更细粒度控制: ```c #include <fcntl.h> #include <libmtd.h> #include <mtd-user.h> int main(void){ struct libmtd_t *mtd; struct mtd_info_user info; unsigned long offset = 0; /* 起始偏移 */ size_t length = 0xFFFFFFFF; /* 需要擦除的数据长度 */ mtd = libmtd_open(); ioctl(fd, MEMGETINFO, &info); erase_kernel_mtd(mtd, fd, offset, length); libmtd_close(mtd); close(fd); return 0; } ``` 上述代码展示了如何打开 MTD 设备并准备对其进行擦除操作。实际应用中可能还需要根据具体需求调整起始地址和大小[^3]。 #### 向 MTD 设备写入数据 向 MTD 设备写入新内容之前通常先完成相应的擦除工作,因为大多数类型的 Flash 存储器不允许直接覆盖旧数据。 1. **命令行方式** 可以利用 `nandwrite` 或者 `ubiupdatevol` 等工具将镜像文件烧录到 NAND Flash 上面去: ```bash sudo nandwrite -p /dev/mtdX image.bin ``` `-p` 参数表示忽略坏块警告继续写入过程;如果遇到不可修复的错误,则跳过该位置而不终止整个进程。 2. **编程接口** 下面是一个简单的例子说明怎样把缓冲区内保存的新数据写回到物理介质上: ```c ssize_t ret; // ... 初始化部分省略 ... lseek(fd, start_addr, SEEK_SET); // 定位指针至欲修改处 ret = write(fd, buffer, data_size); if(ret != data_size){ perror("Write failed"); exit(EXIT_FAILURE); } fsync(fd); // 刷新缓存确保所有更改都被提交给硬件层 ``` 此片段假设已经完成了必要的前期准备工作(如获取有效句柄),并且提供了有效的内存映射以便后续操作[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值