답변:
SD 사양 1 부 물리 계층 단순화 사양 을 읽으면 4.3.6 절 "쓰기 방지 관리"에 나와 있습니다.
SD 메모리 카드에서는 다음과 같은 세 가지 쓰기 방지 방법이 지원됩니다
.-기계적 쓰기 방지 스위치 (호스트 책임 만 해당)
-카드 내부 쓰기 방지 (카드 책임)
-암호 보호 카드 잠금 작동.기계식 쓰기 방지 스위치
사용자는 카드 측면의 기계식 슬라이딩 태블릿 (1 부 기계식 부록 참조)을 사용하여 지정된 카드가 쓰기 방지되어 있는지 여부를 나타냅니다. 슬라이딩 태블릿이 창이 열리도록 배치 된 경우 카드가 쓰기 방지되어 있음을 의미합니다. 창이 닫히면 카드가 쓰기 방지되어 있지 않은 것입니다. 소켓 쪽의 스위치가 올바르게 일치하면 호스트에 카드가 쓰기 방지되어 있는지 여부가 표시됩니다. 카드를 보호하는 것은 호스트의 책임입니다. 쓰기 방지 스위치의 위치는 카드의 내부 회로에 알려져 있지 않습니다.
(내 강조)
CMD28 SET_WRITE_PROT-내부 쓰기 방지가 구현되지 않았습니다.
CMD29 CLR_WRITE_PROT-내부 쓰기 방지가 구현되지 않았습니다.
CMD30 SEND_WRITE_PROT-내부 쓰기 방지가 구현되지 않았습니다.
…
2) 지원되지 않는 기능 :
카드의 내부 쓰기 보호 (물리적 계층 사양 4.3.5에서 선택 사항)
우리는 임베디드 시스템에서 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 커널을 패치하고 빌드하고 싶지는 않지만 Canon 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
$
독자에 따라 다릅니다. 리더는 쓰기 방지 탭을 무시할 수 있습니다. 리더에는 쓰기 방지 탭이 활성화 된 경우 쓰기를 비활성화하는 펌웨어가있을 수 있습니다. 리더에는 쓰기 방지 탭이 활성화되어 있으면 쓰기를 비활성화하는 소프트웨어 드라이버가있을 수 있습니다. 실제로 대다수의 독자는 펌웨어로이를 수행합니다.
하드웨어 기반 스위치입니다. 이 기능은 모든 쓰기 작업을 차단합니다.
전환하면 다음을 수행 할 수 없습니다.
SD 카드에서 또는 SD 카드로 파일 이동
SD 카드에서 파일 제거
SD 카드에 파일 복사
SD 카드 포맷