SD card

Hardware 관련/Memory 2008.03.13 16:12


 

간략하게 SDHC드에 대해 설명하면 아래와 같습니다.


SDHC 메모리 카드는 성능 등급 및 용량을 재정의하는 SD Card Association가 제정한 새로운 표준입니다.  이러한 표준에 입각하여 SDHC 카드는 오늘날 SD 카드의 2GB 임계값을 뛰어넘는 용량을 가집니다.

SD카드와 SDHC카드는 크기가 똑같다.

SDHC(Secure Digital High Capacity)카드는 SD카드의 상위 버전이다.
SD카드의 한계를 극복하기 위해 나온 새로운 버전이다.

 SD카드와 SDHC카드의 가장 큰 차이점은 파일시스템이다.
SD카드는 구식인 FAT16 파일시스템을 사용하고, SDHC카드는 신식인 FAT32 파일 시스템을 사용한다.

SD카드는 FAT16이기때문에 2GB 이상의 파일을 인식하지 못한다.

그러나 SDHC는 FAT32를 사용하기 때문에 2GB 이상의 고용량을 지원한다.

SDHC에는 대용량의 디지털 비디오 녹화를 위해 최소로 유지되는 전송 속도를
보장하는 세 가지 속도 등급(Class 2, 4 및 6)이 있다. 클래스2는 2MB/s, 클래스4는 4MB/s,
클래스6은 6MB/s 전송속도를 보장한다는 뜻이다.

 SDHC 카드는 겉면에는 몇클래스 제품인지 써져 있다.


--------------------------

au1200 cpu를 사용하는 EVM 보드에서 sd card를 테스트 중입니다.
(kernel 2.6.11)

목표는 4G 이상 시판 되는 SD card를 사용하는 것입니다.

sd card spec에는 >=2GB 는 sdhc spec으로 사용 가능하다고 되어 있더군요.

그런데 시판되는 SD card 중에는 4G, 8G도 있습니다. 물론 sdhc로 별도 표기 되지 않은 제품입니다.

혹자는 sd card의 2G용량 한계가 fat16에 따른 것이라고 하는데 정확한지도 잘 모르겠네요.

어쨌든 리눅스 상에서 sd card를 4G 이상 쓰려면 어떤 방법이 있는지 알고 싶습니다.

또는 sd card를 사용하는데서 kernel version 상의 차이가 있다면 어떤 것이 있는지도 알려주시면 고맙겠습니다.



---

전용 SD 컨트롤러가 아니라면 사용하시는 SD카드리더에 더 영향을 많이 받습니다.
제가 파악하기론, 국내에서 애용되는 칩셋은 SDHC 를 검증을 받지 못했습니다. 언젠가 웹사이트를 돌아다니다 칩셋별로 테스트 결과를 적어놓은 것을 보긴 했는데... 기억이 나질 않네요.
다만, 중요한 것은, SDHC 를 지원하지 않는 칩셋을 사용한 SD카드리더라 해도 2G SD 카드를 읽고 쓰는덴 지장이 없다는 점입니다.

애석한 점은, 이것이 긍정적인 측면이 아니라 부정적인 측면의 중요한 점이라는 겁니다.
2G SD 는 tansfer block size 가 1024 byte 입니다.
4G SD 는 2048 byte 겠지요(없어서 확인 못했습니다)
FAT 에서 따지는 hard block size 즉 device sector size 가 됩니다.
removable media 는 파티션을 나누지 않는 것이 MS windows 의 관례이나 불가능한 것도 아닙니다.
파티션 테이블에는 각 파티션의 시작위치와 크기 정보가 담기게 되는데, 이는 전적으로 hard block size 로 계산된 block address 여야만 합니다.
왜냐하면 media 의 파티션 테이블을 분석하는 시점에서 OS 는 전적으로 h/w 가 보고하는 정보에만 의존해야 하기 때문입니다.
SDHC 를 지원하지 않는 칩셋을 사용한 카드리더들은 실제 media 가 제공하는 정보를 사용하지 않고 일률적으로 512byte 로 보고합니다.
이렇게 잘못된 정보를 기반으로 작성된 파티션 정보가 기록된 media 를 제대로 된 카드리더나 컨트롤러를 가지는 기기에 접속할 경우 파티션정보가 제대로 전달되지 않습니다.
더욱 더 불행한 것은, 이렇게 잘못된 카드리더가 이미 널리 퍼져있기 때문에... 그것들에 의해 사용된 카드를 제대로 읽어내기 위해 리눅스 커널 드라이버에서도 h/w 정보를 무시하고 hard block size 를 512 byte 로 고정시켜야 한다는 점이지요.
때문에, 현재 2.6 커널에 들어가 있는 몇몇 컨트롤러(주로 MPU 에 내장된)에 대한 드라이버(drivers/mmc/) 들은 2G 이상의 SD 카드를 사용하는데 애로사항이 많습니다. 드라이버가 원칙대로 작성되어 있기 때문입니다.

FAT16 의 한계가 있긴 하지만....
FAT 은 media 의 hard block size 말고 logical sector 를 따로 가져가며,
이보다도 sectors per cluser 라는 것을 통해 용량을 극복합니다.
FAT16 이라는 것은 관리할 수 있는 cluster 의 갯수가 최대 2^16-1 개라는 뜻입니다. 65535 개입니다.
리눅스의 mkdosfs 옵션을 살펴보시면 포맷 옵션에 sectors per cluser 갯수를 설정할 수 있는 옵션을 보실 수 있습니다.
기억이 정확지는 않지만 최대 127개까지 가능했던 것 같습니다.
logical sector size 가 512byte 라 해도 최대 512*127*65535=4261347840 까지 FAT16 으로 감당이 됩니다. 다만, 1byte 짜리 파일을 만들어도 단순 데이타만을 저장하기 위해 512*127=65024 byte 가 낭비된다는 단점이 있습니다.

간추리면, 카드리더를 사용하실 것이라면 카드리더에 사용된 칩셋을 알아보고 그 칩셋이 검증을 받은 칩셋인지 미리 확인해보는 겁니다. 사실상... 직접 확인하시기가 거의 불가능에 가깝겠습니다. 주변의 소문이나 이름난 전문 커뮤니티(디지털카메라등...)를 뒤져보면 혹시 정보가 있을지도 모르겠습니다.

전용 컨트롤러를 선택해야 하신다면,
컨트롤러의 스펙도 보세요. 제가 직업이 직업인지라 경험이 일천합니다만,
인기있는 MPU 들 중에서 SD 컨트롤러를 내장한 예를 들면 PXA25x 는 최대 transfer block size 가 1024byte 이고, PXA27x 는 2048byte 까지입니다.
윗 글에서 말씀드린 여자저차한 이유로 이리저리 꼼수를 부려 512 로 사용해야 하지만, 스펙은 스펙이죠.

사실상 SDHC 스펙은 용량보다는 속도 향상에 그 가치가 있습니다.

---

제가 사용중인 cpu에 sd 컨트롤러가 내장되어 있습니다.

따로 card reader를 사용하지 않지요.

그렇다면 내장 sd 컨트롤러의 transfer block size가 sd card의 block size를 지원한다면 mmc 이하의 드라이버를 수정해서 4G까지도 사용할 수 있다는 것으로 보아도 될는지요?

sd 관련 linux-mips 쪽의 메일링 리스트에 이것에 관한 간단 패치가 올랐다가 native directory 쪽의 강한 반대에 부딛힌듯 하던데...

가능한지 어떤지 모르겠습니다. 가능하기만 하다면 mmc 디렉토리를 손봐서라도 써야 하겠는데 말입니다.

--

커널 drivers/mmc/ 는 MMC protocol 을 사용하여 구현되어 있습니다.

read/write 커맨드의 아규먼트로 address 를 넘겨줘야 합니다.
행인지 불행인지 애매하지만,
이 address 는 tansfer block size 와는 상관없는 media offset 이며 단위(unit) 은 byte 입니다.
unsigned 32bit 이므로 4G 까지입니다.

2G 까지는 SD protocol 과 꼼수를 사용하여 PXA27x 에서 사용했는데 4G 는 잘 모르겠습니다.
실제로 해보기 전에는 누구도 뭐라 못 할 것 같네요.

8G SD 카드가 있다면, 아마도 SD memory 가 아니라 SDIO 로 만들어진 놈이 아닐까 조심스레 추측해봅니다.
하여간, 가난해서... 4G 8G 카드는 구경도 못 해봤습니다.

신고
블로그 이미지

꽃중년

불만있으면 떠나라...

Tag

티스토리 툴바