SD 卡硬件、固件或软件(驱动程序、操作系统)上的锁定机制是否强制执行?

SD 卡硬件、固件或软件(驱动程序、操作系统)上的锁定机制是否强制执行?

只读模式的锁在哪里强制执行使用 SD 卡?这是在卡本身内部物理完成的,还是在读卡器的固件中,还是在操作系统中完成的?(其他地方?)

答案1

如果你读过SD 规格第 1 部分物理层简化规格,第 4.3.6 节“写保护管理”指出

SD 存储卡支持以下三种写保护方法:

  • 机械写保护开关(仅主机负责)
  • 卡内部写保护(卡的责任)
  • 密码保护卡锁操作。

机械写保护开关

用户将使用卡侧面的机械滑动片(请参阅第 1 部分机械附录)来指示给定卡是否受写保护。如果滑动片的位置使得窗口打开,则表示卡受写保护。如果窗口关闭,则卡不受写保护。插座侧的适当匹配开关将向主机指示卡是否受写保护。保护卡是主机的责任。卡的内部电路不知道写保护开关的位置。

(我强调)

A东芝 SD 卡规格 东芝 SD 卡规格

CMD28 SET_WRITE_PROT - 未实施内部写保护。CMD29
CLR_WRITE_PROT - 未实施内部写保护。CMD30
SEND_WRITE_PROT - 未实施内部写保护。

2)不支持的功能:
卡的内部写保护(物理层规范 4.3.5 中可选)。

答案2

在我的工作中,我们在嵌入式系统中使用 SD 卡。如果我们尝试使用已锁定的卡启动,我们将得到内核恐慌。这本来不是什么大问题,直到我们收到一批具有非常松散的写入开关的 SD 卡:将卡插入读卡器的动作有时足以移动开关并锁定卡。很多人开始尝试提出机械选项来防止这种情况,例如在每张 SD 卡上贴一块胶带,但最终我们通过更改 Linux 内核中的一行源代码解决了这个问题。现在,当检测到开关设置为只读的 SD 卡时,我们只需忽略开关并愉快地在需要时将数据写入卡中。

这是我们疯狂的混合反向移植,所以我怀疑这个补丁是否可以在任何地方干净地应用,但如果你想用自己的内核进行实验,这是一个很好的起点:

--- include/linux/mmc/card.h    (revision 1423)
+++ include/linux/mmc/card.h    (revision 1424)
@@ -125,7 +125,7 @@
 #define mmc_card_blockaddr(c)  ((c)->state & MMC_STATE_BLOCKADDR)
 
 #define mmc_card_set_present(c)    ((c)->state |= MMC_STATE_PRESENT)
-#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
+#define mmc_card_set_readonly(c) {printk("Ignoring MMC read-only switch\n");}
 #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
 #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)

如果你不想修补和构建 Linux 内核,但你有一个佳能 P&S 相机,你可以使用差分单片机将文件(图片)写入写保护的 SD 卡(当相机打开时,OF 会检查开关的状态;当设置为 RO 时,它将自动从 SD 卡加载固件。这允许用户直接启动 CHDK;然后 CHDK 会忽略开关的状态,因此它仍然可以将图片写入卡中;参见例如https://chdk.fandom.com/wiki/Prepare_your_SD_card)。

您还可以在 Linux 中通过关闭只读标志hdparm并重新安装卡来写入写保护的 SD 卡:

$ mount | grep mmc
/dev/mmcblk0p1 on /media/hello type ext3 (ro,nosuid,nodev,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered,uhelper=udisks)
$ touch /media/hello/test
touch: cannot touch `/media/hello/test': Read-only file system
$ sudo hdparm -r /dev/mmcblk0p1

/dev/mmcblk0p1:
 readonly      =  1 (on)
$ sudo hdparm -r0 /dev/mmcblk0p1

/dev/mmcblk0p1:
 setting readonly to 0 (off)
 readonly      =  0 (off)
$ touch /media/hello/test
touch: cannot touch `/media/hello/test': Read-only file system
$ sudo mount -t ext3 -o rw,remount /dev/mmcblk0p1 /media/hello
$ touch /media/hello/test
$ echo goodbye > /media/hello/test
$ cat /media/hello/test
goodbye
$ sudo umount /dev/mmcblk0p1
$ sudo mount /dev/mmcblk0p1 /mnt
mount: block device /dev/mmcblk0p1 is write-protected, mounting read-only
$ cat /mnt/test
goodbye
$ touch /mnt/test
touch: cannot touch `/mnt/test': Read-only file system
$ 

答案3

这取决于阅读器。阅读器可以忽略写保护标签。阅读器可以具有在写保护标签接合时禁用写入的固件。阅读器可以具有在写保护标签接合时禁用写入的软件驱动程序。实际上,绝大多数阅读器都在固件中执行此操作。

答案4

它是一种基于硬件的开关。它的功能只是阻止任何写入操作。

如果切换,您将不能:

  • 将文件移出或移至 SD 卡

  • 从 SD 卡中删除文件

  • 将文件复制到 SD 卡

  • 格式化 SD 卡

编辑 阅读更多这里请留意那个淡淡的橙色圆圈...

相关内容