使用 SD 卡强制执行的只读模式锁定在哪里?这是在卡本身内部、在读卡器的固件中还是在操作系统中完成的?(其他地方?)
Red*_*ick 20
如果您阅读SD 规范第 1 部分物理层简化规范,第 4.3.6 节“写保护管理”说
SD 存储卡支持以下三种写保护方法:
- 机械写保护开关(仅主机责任)
- 卡内部写保护(卡责任)
- 密码保护卡锁定操作。机械写保护开关
用户将使用卡片侧面的机械滑动平板电脑(请参阅第 1 部分机械附录)来指示给定的卡片是否被写保护。如果滑动平板电脑的放置方式使窗口打开,则意味着该卡已被写保护。如果窗口关闭,则卡没有写保护。插座侧正确匹配的开关将向主机指示卡是否被写保护。保护卡是主机的责任。卡的内部电路不知道写保护开关的位置。
(我的重点)
一个东芝SD卡规范说
CMD28 SET_WRITE_PROT - 未实现内部写保护。
CMD29 CLR_WRITE_PROT - 未实现内部写保护。
CMD30 SEND_WRITE_PROT - 未实现内部写保护。
…
2) 不支持的功能:
卡的内部写保护(在物理层规范 4.3.5 中可选。)
小智 15
在我的工作中,我们在嵌入式系统中使用 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)
Run Code Online (Sandbox Code Playgroud)
如果您不想修补和构建 Linux 内核,但您有佳能 P&S 相机,则可以使用CHDK将文件(图片)写入写保护的 SD 卡(当相机打开时,OF 检查开关的状态;当设置为 RO 时,它会自动从 SD 卡加载固件。这允许用户直接启动到 CHDK;然后 CHDK 忽略开关的状态,因此它仍然可以将图片写入卡;参见例如http ://chdk.wikia.com/wiki/Bootable_SD_card)。
您还可以通过关闭只读标志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
$
Run Code Online (Sandbox Code Playgroud)