只读模式的锁在哪里强制执行使用 SD 卡?这是在卡本身内部物理完成的,还是在读卡器的固件中,还是在操作系统中完成的?(其他地方?)
答案1
如果你读过SD 规格第 1 部分物理层简化规格,第 4.3.6 节“写保护管理”指出
SD 存储卡支持以下三种写保护方法:
- 机械写保护开关(仅主机负责)
- 卡内部写保护(卡的责任)
- 密码保护卡锁操作。
机械写保护开关
用户将使用卡侧面的机械滑动片(请参阅第 1 部分机械附录)来指示给定卡是否受写保护。如果滑动片的位置使得窗口打开,则表示卡受写保护。如果窗口关闭,则卡不受写保护。插座侧的适当匹配开关将向主机指示卡是否受写保护。保护卡是主机的责任。卡的内部电路不知道写保护开关的位置。
(我强调)
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
这取决于阅读器。阅读器可以忽略写保护标签。阅读器可以具有在写保护标签接合时禁用写入的固件。阅读器可以具有在写保护标签接合时禁用写入的软件驱动程序。实际上,绝大多数阅读器都在固件中执行此操作。