在块设备中,擦除数据的代价是很大的,大部分的设备都对该操作进行了优化。擦除操作不会立即进行物理删除,只是在逻辑上将数据进行删除,删除的数据很容易就被恢复了,数据的安全尤为重要了。
数据结构
了解 UFS 的数据安全之前,先了解一下UFS设备内部的数据格式。
暂时无法在飞书文档外展示此内容
-
Page:flash实际可以写入的最小大小
-
Block:flash实际可以擦除的最小大小
-
PBA:物理块,UFS协议规定的最小操作的大小,为4K。
LBA就是主机可以操作的地址,在UFS设备内部是使用一个映射表映射管理LBA与PBA。
删除操作
Descriptor
删除数据相关的描述符。
-
bProvisioningType:决定UNMAP具体行为的,00h表示每一个逻辑块都有固定映射的物理块,再UFS设备中一般不会使用00h。
-
bSecureRemovalType:决定Purge的具体行为
Discard
会将 LBA 与 PBA 解映射,LBA 可能会随机的与任何一个 PBA 映射,因此 Discard 之后,再次访问该逻辑块会读取到随机的数据,包括原数据。
Erase
也是进行解映射,但是 LBA 会再与一个空的 PBA 进行映射,所以总会访问到'0'。
Purge
上述的两个操作都没有进行物理上的擦除,Purge 就是真正意义上的物理擦除。
Purge 是通过设置 Attributes and Flags 实现的,使用 Query Requrst UPIU 。
-
fPurgeEnable flag :只写易失性标志,上电或复位后置零。当此标志等于1时,启用 purge 操作,否则禁用。该标志只能在所有逻辑单元的命令队列为空时设置。当操作完成或出现错误情况时,UFS设备会自e动清除此标志。主机可以清除此标志以中断正在进行的 purge 操作。
-
bPurgeStatus attribute :
-
00h:空闲 (禁用清除操作)
-
01h:正在进行purge操作
-
02h:主机提前停止purge操作
-
03h:purge操作成功完成。
-
04h:purge操作失败,原因是逻辑单元队列不空
-
05h:purge操作失败
-
-
bSecureRemovalType :
-
00h :直接擦除物理flash
-
01h :用一个字符覆盖后,再进行擦除
-
02h :使用一个字符、补码、随机字符,依次覆盖
-
03h :供应商自定义的擦除方式
-
通过 fPurgeEnable 写 '1' 启用 purge 操作,通过读取 bPurgeStatus ,获取 purge 执行的结果。
Wipe Device
主机通过发送FORMAT UNIT命令格式化逻辑单元(RPMB LU除外)。不过,对那些写保护的逻辑单元,FORMAT UNIT命令会失败。FORMAT UNIT的命令对象是Device well know LU,它格式化除RPMB之外所有无写保护的逻辑单元。
FORMAT UNIT会切断逻辑块到物理空间的映射。但如果要让数据彻底从设备上清除,UFS设备还需要执行Purge操作,这样数据才能彻底删除。
总结
所有的删除操作都是解映射,实际的擦除操作都需要进行 purge 操作才可行。
Data Protection
通过配置unit Desriptor 的 bLUWriteProtect ,可以在逻辑单元(LU)级别定义保护模式
bLUWriteProtect parameter
-
00h :逻辑单元不受写保护
-
01h :逻辑单元上电写保护,通过重新上电或硬件复位可以清除
-
02h :逻辑单元永久写保护,开启后不可改变
fPermanentWPEn flag :启用上电写保护,置 '1' 时才会使永久写保护的LU不可写,只写一次,设置后能再改变
fPowerOnWPEn flag :启用上电写保护,置 '1' 时才会使上电写保护的LU不可写,重新上电或硬件复位会清零