Answers:
如果您阅读SD规范第1部分物理层简化规范,请参见第4.3.6节“写保护管理”
SD存储卡支持三种写保护方法,如下所示:
- 机械写保护开关(仅限主机)
- 卡内部写保护(卡的责任)
- 密码保护卡锁定操作。机械写保护开关
用户将使用卡侧面的机械滑动平板电脑(参见第1部分机械附录)来指示给定的卡是否受到写保护。如果滑动平板电脑的位置使得窗口打开,则意味着该卡被写保护。如果窗口关闭,则卡不受写保护。插座侧的正确匹配的开关将向主机指示该卡是否被写保护。主机有责任保护卡。写保护开关的位置对于卡的内部电路是未知的。
(我的重点)
一个东芝SD卡规范说
CMD28 SET_WRITE_PROT - 未实现内部写保护。
CMD29 CLR_WRITE_PROT - 未实现内部写保护。
CMD30 SEND_WRITE_PROT - 未实现内部写保护。
...
2)不支持的功能:
卡的内部写保护(物理层规范中可选4.3.5。)
在我的工作中,我们在嵌入式系统中使用SD卡。如果我们尝试使用锁定的卡启动,我们会遇到内核恐慌。在我们得到一批具有非常松散的写入开关的SD卡之前,这不是什么大问题:将卡插入读卡器的行为有时足以移动开关并锁定卡。很多人开始尝试提出机械选项来防止这种情况,比如在每张SD卡上粘贴一块磁带,但最后我们通过更改Linux内核中的一行源代码来解决这个问题。现在当检测到SD卡并将开关设置为只读时,我们只需忽略开关,并随时将数据写入卡中。
这是因为我们对backports的疯狂错误,所以我怀疑这个补丁会干净利落地应用于任何地方,但如果你想试验自己的内核,这是一个很好的起点:
--- 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相机,则可以使用CHDK将文件(图片)写入写保护的SD卡(当相机开启时,OF检查开关状态;当设置为RO时,它将自动从SD卡加载固件。这允许用户直接启动到CHDK;然后CHDK忽略开关的状态,所以它仍然可以将图片写入卡;参见例如http ://chdk.wikia.com/wiki/Bootable_SD_card)。
您还可以通过关闭readonly标志hdparm
并重新安装卡来写入Linux中的写保护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
$