3.3 擦除
(参考链接:https://blog.csdn.net/weixin_38233274/article/details/79258951)
UDA/BOOT区域可以进行擦除,RPMB区域不可以。
3.3.1 Erase
erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。
(1)单位:擦除组(EraseGroup)
Erase翻译过来是抹去、擦除的意思。eMMC中可擦除的单位称为“擦除组”,擦除组是用写入块(writeblocks,Device的基本可写单位)来测量的。擦除组的大小是一个设备特殊参数,当ERASE_GROUP_DEF(ecsd[175])设置为不可用的时候,擦除组的大小在CSD中定义;当ERASE_GROUP_DEF设置为可用的时候,擦除组的大小在EXT_CSD中定义。
当ERASE_GROUP_DEF(EXT_CSD[175])=0时
size of erasableunit = (ERASE_GRP_SIZE[46:42] + 1) * (ERASE_GRP_MULT[41:37] + 1)
size of writeprotect = (WP_GRP_SIZE [36:32] +1) * erasableunit
当ERASE_GROUP_DEF(EXT_CSD[175])=1时
size of erasableunit = 512Kbyte × HC_ERASE_GRP_SIZE(ecsd[224])
size of writeprotect = 512KB * HC_ERASE_GRP_SIZE *HC_WP_GRP_SIZE
(注意:ecsd[175]是0还是1,根据自己需要可以改的,并不是固定不动的)
(2)原理
一旦擦除的命令成功完成,擦除掉的映射地址范围用写满0或1的形式表现出来。(写0还是1,根据不同的工艺)擦除命令的作用就是简单的将映射地址范围移动到未映射的地址范围。
(3)Erase的过程
Erase的过程分三个步骤:
首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址
Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址
通过ERASE(CMD38)命令将参数全部设置为0(ERASE命令的地址段是一个擦除组地址)
(4)注意点
如果erase命令(CMD35,CMD36.CMD38)接收到的命令顺序与Erase步骤不同,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。
如果host提供一个范围外的地址作为CMD35或CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个擦除顺序。
如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38或CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。
如果擦除的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_SKIP(device status bit15)位将会在状态寄存器中设置。如前面块写所述,设备将通过拉低 DAT0 表示擦除正在进行。实际的擦除时间可能相当长,主机可发送 CMD7 命令取消对设备的选定。
设备忽略低于擦出组大小的低位,舍入地址到擦除分组的边界。
(例1:擦除组大小为100个LBA,设置擦除个数为202,那么实际擦除的区间是300个LBA)
(例2:比如擦除组大小为1024个LBA,从第2个LBA开始擦除,擦到1025个LBA,虽然擦除大小是擦除组,但是实际上会把LBA0到LBA2047都擦除)
(5)如何验证erase是否成功?
erase完成后的区域,要么是0,要么是1,具体是0还是1呢?
查看ecsd[181]可知,erase完读取该寄存器的值,看是0还是1.
所以,读取擦除区域的数据和ecsd[181]进行比较,如果相同,erase就成功了。
3.3.2 secure erase
1、secure erase和其他几种擦除的区别
emmc安全擦除执行的是secure erase的操作; 非安全擦除执行的是discard操作。 两者的差异是这样的: secure erase在物理上做擦除; discard只做逻辑上的擦除,类似擦除索引文件,但不会擦除器件上的每个物理位。 Secure erase优势主要体现在被擦除数据安全性上,数据恢复难度比discard大很多。 Discard执行会比secure erase快很多。
2、secure erase流程
和erase的流程基本一样,使用CMD35/36/38。
erase的CMD38的arg的bit31置0,但是secure erase事后CMD38的bit31需要置1(不过在ecsd[231]bit0置1时候,CMD38的bit31才能置1,换句话说,ecsd[231]bit0置1时候才支持secure erase)。
3.3.3 trim(剪切)
(1)单位:TRIM单位—写入块(writeblock)
Trim的可擦除单位是写入块,而非擦除组。
定义了三种多块写入的类型:Open-ended Multiple-block write ,Multiple-block write with pre-defined block count,Reliable Write。
Host可以通过多块操作在任意时间中止写动作。Host通过发送一个传输命令中止动作。
(2)TRIM的原理
一旦Trim的命令成功完成,Trim掉的映射地址范围用写满0或1的形式表现出来。Trim命令的作用就是简单的将映射地址范围移动到未映射的地址范围。
(3)TRIM的过程
TRIM的过程分三个步骤:
首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址
Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址
通过ERASE(CMD38)命令将参数bit0设置为1,其他的bit都设置为0.(在TRIM操作中CMD35及CMD36地址的识别都是通过写入块实现的)
(4)注意点
如果Trim命令(CMD35,CMD36或CMD38)中的一个元素接收到与既定TRIM步骤不同的顺序,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。
如果host提供一个范围外的地址作为CMD35或CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个TRIM顺序。
如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38或CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。
如果TRIM的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_RESET位将会在状态寄存器中设置。
Host应该慎重执行Trim命令以防止非故意的数据丢失。
重置Device(使用CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。
3.3.4 secure trim
1、secure trim流程
和trim的流程基本一样,使用CMD35/36/38。
trim的CMD38的arg的bit31置0,但是secure trim事后CMD38的bit31需要置1(不过在ecsd[231]bit0置1时候,CMD38的bit31才能置1,换句话说,ecsd[231]bit0置1时候才支持secure trim)。
3.3.5 Discard(丢弃)
(1)单位:写入块(writeblock)
Discard的可擦除单位是写入块,而非擦除组。
(2)Discard的原理
Host端不关心Discard的映射地址范围的表现形式,不像ERASE和TRIM根据内存技术的不同需要写满0或1,它的表现形式可以是一些或全部的原始数据。它的作用也是简单的将映射地址范围移动到未映射的地址范围。
(3)Discard的过程
Discard的过程分三个步骤:
首先host通过ERASE_GROUP_START(CMD35)命令定义地址范围的开始地址
Host再通过ERASE_GROUP_END(CMD36)命令定义地址范围的终止地址
通过ERASE(CMD38)命令将参数bit0及bit1设置为1,其他的bit都设置为0.(在Discard操作中CMD35及CMD36地址的识别都是通过写入块实现的)
(4)注意点
如果Discard命令(CMD35,CMD36或CMD38)中的一个元素接收到与既定Discard步骤不同的顺序,Device端将在状态寄存器中设置一个ERASE_SEQ_ERROR位并重置整个顺序。
如果host提供一个范围外的地址作为CMD35或CMD36的参数值,Device将会拒绝这个命令,回复一个ADDRESS_OUT_OF_RANGE的提示并重置整个Discard顺序。
如果接收到一个“非擦除”(不是CMD35,CMD36,CMD38或CMD13)的命令,Device将会回复一个ERASE_RESET位,重置擦除顺序并执行最后一个命令。对于所选设备的非地址范围的命令将不会终止整个擦除顺序。
如果Discard的范围包含写保护块,写保护块将会完整保留,只会擦除未写保护的数据块。WP_ERASE_RESET位将会在状态寄存器中设置。
Host应该慎重执行Discard命令以防止非故意的数据丢失。
重置Device(使用CMD0,CMD15,或使用eMMC的硬件重置)或电源故障将终止任何挂起和运行中的Trim命令,这样将会导致在这样操作中的数据处在一个未知的状态。
(5)如何验证discard是否成功?
discard按照协议的话 资料就是无意义的 所以无法从host端验证,就是因为discard没有强制清除数据,所以,discard通常和sannitize一起使用,仅仅用discard进行emmc擦除测试,没有意义。
3.3.6 Sanitize(消密)
(1)原理
Sanitize操作是一个功能,它不同于Trim和Erase将映射地址范围移动到未映射的地址范围。而是要求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.
前面几种都是cmd35/36/38来进行操作,而sanitize是直接进行设置寄存器就行了。所以sannitize没有单位,通常,配合discard使用,将discard的的区域数据真正清理掉。
(其实sanitize的作用就是将erase/trim/discard这些没有去在物理位置中删除的数据进行真正删除,所以说直接用sanitize是不行的)
- 注意点
当Sanitize操作完成了之后,在未映射的host地址空间内将不会有数据存在。当Sanitize操作被HPI或Powerfailure中断后,未映射的host地址空间状态将无法得到保护,Host必须写入extendedCSD[165]SANITIZE_START来重新初始化Sanitize操作并允许Sanitize操作来确保未映射的host地址空间里的数据已被清除。
当Host无法对该域进行Sanitize操作时,应用程序必须配合Device生厂商正确地实现该操作以确保device的可靠性。
3.3.4 相关参数计算
(1)Erase Group Size
1.先看eCSD[175] Bit 0
0x0 : 采用旧的擦除分组长度和写保护分组长度(缺省)
0x1 : 采用大容量擦除单元长度,大容量超时值和大容量写保护长度定义
2.(1)如果eCSD[175] Bit 0为1,即大容量擦出组长度,看eCSD[224]
(2)如果eCSD[175] Bit 0为0,即旧容量的擦出组长度,看CSD[46:42]和CSD [41:37]
(根据经验,不同芯片的擦出组大小基本相同,为1024个LBA,默认ecsd[175]为0,CSD[46:42]和CSD [41:37]都为31,但并不一定。)
(2) 如何验证erase/secure erase/trim/secure trim是否成功?
erase完成后的区域,要么是0,要么是1,具体是0还是1呢?
查看ecsd[181]可知,erase完读取该寄存器的值,看是0还是1.
所以,读取擦除区域的数据和ecsd[181]进行比较,如果相同,erase就成功了。
3.3.5 几种擦除之间的关系
1、eMMC为什么会用discard cmd来替代erase cmd 和 trim cmd?
根据JEDEC EMMC5.1 standard,erase和trim的区别是,erase的操作单元是erase group,这个大小是定义在CSD/ext_CSD中;而trim的操作单元是write block,即512 bytes. 而discard CMD和trim CMD非常相似,唯一的区别在于host发出CMD,而device执行完成之后,host再去读取被"擦除"的地址,trim之后的会返回全0或全1;而discard之后的是可以返回部分或全部的original data,这个由device自己控制,JEDEC没有强制要求。
那么为什么discard可以取代erase & trim呢?
首先,device对这三个命令的执行并没有什么质的区别。device对discard/erase/trim实际执行的操作都是把设定范围内的address给标记起来,说明这些地址已经被host擦除,也就是把mapped address给映射到 unmapped address. 而对flash实际执行擦除,却要等到sanitize命令,或者是GC等background操作。
其次,discard采用write block作为operation unit,可以覆盖erase和trim的地址范围。
最后,对于已经擦除的地址返回什么内容,我个人认为,host其实是不care的。
所以,从host对eMMC使用的角度来看,discard可以替代erase和trim.
- erase/secure erase/trim/secure trim/discard/sannitize对emmc内部数据的操作到底有什么不同?
erase:擦除单位为擦除组,实际上在PBA,数据并不一定进行真正被擦除掉了。只不过同一个LBA,host端读到的数据为0或1.
secure erase:在PBA,数据的确被擦除掉了。
trim:旧版本的emmc没有trim功能,但是由于erase每次擦除的数据比较大,以擦除组为单位,所以增加了trim功能,和erase一样,并没有在PBA真正擦除数据,和erase唯一不一样的就只是擦除的大小不同而已。
secure trim:和secure erase一样,在PBA的数据真正被清除掉,只是擦除的单位不同而已。
discard:在PBA,数据并没有被清除,只是映射关系可能变了,也就是emmc会告诉host同一个LBA的数据是无效的罢了,和secure/trim不同的是:此时读到的数据并不是全0或全1。(例如:对LBA0写入数据0x44,通过discard后,emmc读取到的数据也可能是0x44,也可能是其他值,也可能是全0全1,但无所谓,因为读到的数据是无效的。)
sanitize:把emmc内部PBA的数据真正清理掉了。
3、ERASE/TRIM/DISCARD/SANITIZE的区别
总体上来说,ERASE/TRIM/DISCARD三者很相似,SANTIZE差异比较大。总体区别如下图表格所示:
|
擦除命令 |
|
|||
|
Erase |
Trim |
Discard |
Sanitize |
|
argument |
0x00000000 |
0x00000001 |
0x00000011 |
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操作被HPI或Powerfailure中断后,未映射的host地址空间状态将无法得到保护,Host必须写入extendedCSD[165]SANITIZE_START来重新初始化Sanitize操作并允许Sanitize操作来确保未映射的host地址空间里的数据已被清除。
|