eMMC 卡的安全删除(BLKSECDISCARD 返回 EOPNOTSUPP)

Mat*_*dge 3 security sd-card erase linux-device-driver

我需要安全地擦除嵌入式系统中的 MMC 卡。然而,我的ioctl(BLKSECDISCARD)回报EOPNOTSUPP,(也是如此BLKDISCARD)。

MMC驱动通过读取内核代码,通过设置使能DISCARD QUEUE_FLAG_DISCARDkernel/linux/drivers/mmc/card/queue.c mmc_queue_setup_discard()调用如下:

if (mmc_can_erase(card))
    mmc_queue_setup_discard(mq->queue, card);
Run Code Online (Sandbox Code Playgroud)

其中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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Stu*_*efy 5

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

card->csd.cmdclass从卡的 CSD(卡/设备特定数据)中读取,并指示卡支持哪些命令类别。在本例中,代码正在检查命令的擦除类。看mmc_decode_csd()

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

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