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

时间:2018-03-27 02:04:11

标签: security linux-device-driver sd-card erase

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

通过读取内核代码,MMC驱动程序通过在QUEUE_FLAG_DISCARD中设置kernel/linux/drivers/mmc/card/queue.c mmc_queue_setup_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功能,但我不确定我需要做什么,或者即使在我的嵌入式系统上也可以。可以吗?

1 个答案:

答案 0 :(得分:2)

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

从卡的CSD(卡/设备特定数据)中读取

card->csd.cmdclass,并指示该卡支持哪些类别的命令。在这种情况下,代码检查擦除类命令。请参阅mmc_decode_csd()

card->erase_size也可以从卡的CSD(如果卡上有CSD,也可以是扩展的CSD)中读取,并在mmc_set_erase_size()中设置。

这些都不取决于内核的构建方式,而是取决于硬件的功能。要找出哪个(哪些)阻止您使用安全擦除,您需要在内核中添加一些检测以打印这些字段的值。