安全删除 eMMC 卡 (BLKSECDISCARD returns EOPNOTSUPP)

Secure Delete of eMMC Card (BLKSECDISCARD returns EOPNOTSUPP)

我需要在嵌入式系统中安全擦除 MMC 卡。但是,我的 ioctl(BLKSECDISCARD) returns EOPNOTSUPPBLKDISCARD)。

MMC驱动通过读取内核代码,在kernel/linux/drivers/mmc/card/queue.c mmc_queue_setup_discard()中设置QUEUE_FLAG_DISCARD启用DISCARD,调用如下:

if (mmc_can_erase(card))
    mmc_queue_setup_discard(mq->queue, card);

其中 mmc_can_erase()kernel/linux/drivers/mmc/core/core.c 中定义为:

int mmc_can_erase(struct mmc_card *card)
{
    if ((card->host->caps & MMC_CAP_ERASE) &&
        (card->csd.cmdclass & CCC_ERASE) && card->erase_size)
        return 1;
    return 0;
}

满足mmc_can_erase()中的条件需要什么?

它是卡、控制器、驱动程序、内核构建方式还是其他原因的特性?

理想情况下,我想启用 BLKSECDISCARD 功能,但我不确定我需要做什么,或者即使它在我的嵌入式系统上是可能的。可以吗?

card->host->caps描述了主机控制器的能力。设置的位置(假设支持)取决于您使用的控制器,例如,对于 SDHCI 控制器,其设置在 sdhci_setup_host().

card->csd.cmdclass 从卡的 CSD 中读取(Card/Device 特定数据),并指示卡支持哪些 classes 命令。在这种情况下,代码正在检查命令的擦除 class。参见 mmc_decode_csd()

card->erase_size 也从卡的 CSD(或扩展 CSD,如果卡有的话)中读取,并在 mmc_set_erase_size().

中设置

None 其中取决于内核的构建方式,但取决于硬件的功能。要找出哪些阻止您使用安全擦除,您需要向内核添加一些工具以打印这些字段的值。