我在Linux的SD卡驱动程序中发现了一些奇怪的东西。驱动程序在文件mmc_read_ssr
中的函数drivers/mmc/core/sd.c
中读取卡状态。代码如下:
err = mmc_app_sd_status(card, ssr);
if (err) {
pr_warning("%s: problem reading SD Status "
"register.\n", mmc_hostname(card->host));
err = 0;
goto out;
}
当函数mmc_app_sd_status
返回指示错误的值时,错误将在
err = 0;
为什么在读取SSR时发生错误时应该清除错误?
答案 0 :(得分:1)
当我看到其他人的代码,特别是我认识的人真正擅长他们所做的代码时,我会采用“假设我错了”的态度。
我对Linux中的SD驱动程序知之甚少 - 但是从内核开发的(有限)经验来看,你总是在与CPU和内存使用,硬件错误,编译器“功能”的“可读代码”作斗争“等等。
你会注意到它确实比“清除”错误值更多 - 它会跳过后面的整个块。 (大概是因为它知道它会失败。)
我必须承认它看起来像是一场意外 - 因为它总是返回零(尽管陈述return err;
)。错误值由调用它的代码检查(在mmc_sd_setup_card()
内) - 如果它始终为零,那么它也毫无意义。
所有确实发生的事情(从我所看到的)是打印出内核警告。正如我所说的那样,我总是采取“假设我错了”的态度,所以我假设无论是谁编写代码(或者最近出现并修补它)都认为“警告”不是足以证明抛出错误代码是合理的。因此,他们将其写入内核日志并让“无论发生什么,都会发生”。
据推测,也许一些特别古老的SD硬件“错误地”行为,并且尽管“一切正常”但却导致错误抛出?设备驱动程序通常在整个过程中都有黑客攻击来处理这种边缘情况。
否则我只是建议问一个人口充足的Linux内核开发论坛(IRC或邮件列表等)。要礼貌,明确你“假设你错了”,如果你得到一个突然或粗鲁的反应,不要感到惊讶!
虽然是一个很好的问题......