Nor flash 메모리 의 데이터 를 읽고 쓰는 방법

플래시 메모리에 대한 이해

많은 분들이 USB 플래시 메모리 드라이브 하나 정도는 들고 다니시고, 디지털 카메라의 저장장치, 더 나아가 최근에는 SSD(Solid State Disk)나 센트리노 4세대(산타로사)에 등장하는 터보 메모리 등등 다양한 분야에서 플래시 메모리를 사용하고 있습니다. 이렇듯 최근들어 널리 사용되는 플래시 메모리에 대한 주요 특징에 대해 여러분께 소개해 드리고자 몇 주 전 플래시 메모리를 위한 소프트웨어 개발 기법에 대한 강의 내용 중 관련 내용을 간단히 간추려봤습니다. 아주아주 낮은 수준의 내용이라 플래시 메모리에 대해 많이 알고 계신 분들의 첨언 부탁드립니다. ^^;

플래시 메모리의 특징

1. 비휘발성 메모리

플래시 메모리의 가장 큰 특징이라면 다들 아시다시피 전력 공급이 없더라도 데이터를 보존할 수 있다는 점이겠지요. 이 덕분에 디스크처럼 저장 공간으로 사용이 가능하면서도 XIP(eXecution In Place)나 저장위치에 상관 없이 접근시간이 동일한 메모리의 특성을 가지게 됩니다.

플래시 메모리라는 명칭은 1984년 도시바에서 "플래시 EEPROM"이라는 논문을 발표한 것에서 유래되었는데, 기존 EEPROM 셀의 구성과 동작을 변형한 것이라고 하네요.

기계적인 작업이 없어 디스크에 비해 다음과 같은 장점을 가집니다.

1. 빠른 접근 시간 / 2. 저전력 / 3. 내충격/온도 / 4. 소형, 경량 / 5. 무소음

저장 위치에 관계 없이 접근시간은 일정하므로 접근시간 향상을 위한 "디스크 조각모음"과 같은 작업은 플래시 메모리에 적합하지 않습니다.

2. 플래시 메모리의 구조


플래시 메모리는 일정한 크기를 가진 여러 개의 블록들로 구성되어 있습니다. 이 블록들은 다시 페이지와 스페어 공간으로 나뉩니다. 블록과 페이지의 크기는 소블록(1세대)/대블록(2세대)으로 나뉘는데, 최근에는 거의 대블록으로 나온다고 하는군요.

소블록 : Page(512B), Spare(16B), Block(16KB) :: 1 Block = 32 Pages

대블록 : Page(2KB), Spare(64B), Block(128KB) :: 1 Block = 64 Pages

페이지는 읽고 쓰기의 기본 단위, 블록은 삭제의 기본 단위입니다. 이에 대해서는 뒤에서 다시 이야기할게요.

3. 덮어쓰기 제한

플래시 메모리의 특정 페이지에 데이터를 쓰려고 한다고 가정합시다. 데이터를 쓰고자 하는 페이지가 비어 있는 경우 곧바로 데이터를 쓰는 게 가능합니다.

 

Nor flash 메모리 의 데이터 를 읽고 쓰는 방법


하지만 그 페이지에 다른 데이터가 이미 기록되어 있는 경우 곧바로 쓰는게 불가능합니다. 다른 비어있는 페이지를 골라 데이터를 쓰거나, 블록을 지운 뒤 써야 합니다.


첫 번째 그림처럼 단순히 블록을 지우고 데이터를 새로 쓰는 방법은 참 간단해 보입니다. 하지만 앞서 "읽고 쓰기의 단위는 페이지", "지우기의 단위는 블록"이라고 말씀을 드린 바대로, 갱신하고자 하는 페이지만 지우고 새로 쓰는게 아니기 때문에 해당 블록에 다른 유효한 데이터가 있는 경우 이 데이터를 다른 블록에 옮기는 작업이 먼저 이뤄지지 않으면 유효한 데이터가 파괴되어 버리는 문제가 있겠죠.

두 번째 방법은 블록 삭제 과정 없이 다른 빈 페이지에 갱신된 데이터를 쓰는 것입니다. 이 경우는 갱신되기 이전의 무효 데이터를 어떻게 수집하고 처리할 지에 대한 고민이 필요합니다.

4. 작업의 종류에 따라 달라지는 비용(시간)

플래시 메모리는 읽기, 쓰기, 지우기에 필요한 시간이 각각 다릅니다. 많은 분들께서 아시다시피 읽기보다는 쓰기가 느리지만, 일반적으로 사용할 때에는 지우기 작업까지 포함되는 경우가 많아 작업 완료에 필요한 시간은 읽기에 비해 훨~씬 느려지게 됩니다.

최신 자료는 아니지만, 다른 메모리와 비교 자료가 있어 소개해 드립니다.


위 표를 보시면 휘발성 메모리 3종은 읽기/쓰기에 모두 똑같은 시간을 소비하는 반면 NOR, NAND 플래시 메모리는 읽기/쓰기/지우기에 각각 다른 시간을 소비하는 것을 알 수 있습니다. ns는 10억분의 1초(1.e-9), μs는 100만분의 1초(1.e-6), ms는 1000분의 1초(1.e-3)이니, NAND 메모리는 쓰기가 읽기보다 약 20배 느리고, 지우기는 약 198배 느리다는 이야기가 됩니다. NOR메모리는 쓰기가 읽기보다 1053배, 지우기는 6000배 느리군요(푸하하). 계산이 틀리진 않았길 바랍니다(-_-).

하지만 USB 플래시 메모리 드라이브나 C/F 등에 파일을 복사할 때 저렇게 많은 차이는 나지 않을겁니다. 옛날 자료라서 요즘에는 그 차이가 더 줄었을거고, 지우기 횟수를 줄이면서 데이터를 쓰는 여러 알고리즘도 많이 개선됐을테니까요.

5. 지우기 횟수의 제한

플래시 메모리는 쓸 수 있는(정확히는 지우기) 횟수가 제한되어 있어, 그 횟수를 초과하는 경우 정상적인 작동을 보장할 수 없게 됩니다. 이 사실은 많은 분들께서 아실거구요. 보통 한 블록당 10만번 정도의 지우기가 가능하다고 하네요.

그렇다면 특정 파일이 자주 변경되는 경우 해당 블록만 자주 사용해서 플래시 메모리에 배드블록이 생기느냐? 일반적인 경우라면 그런 걱정은 하지 않아도 됩니다. 파일을 갱신하는 경우 사용자 관점에서 위치는 변함이 없지만, 플래시 메모리상의 블록/페이지 위치는 파일이 갱신될 때마다 계속 바뀌기 때문에 블록들을 골고루 쓰는거나 다름이 없으니까요.

플래시 메모리의 종류

플래시 메모리는 크게 NOR, NAND, DINOR, AND 의 네 가지 형식으로 나뉩니다. 각각의 특징은 다음 표를 참고.


네 가지 형식 중 역시 유명한 것은 인텔이 미는 NOR과 삼성이 미는 NAND 방식이죠. DINOR은 NOR과 비슷한 특성을 가지고 AND는 NAND와 비슷하다고 보시면 되겠습니다.

1. NOR

NOR 플래시의 가장 큰 특징은 바이트 단위로 접근이 가능하다는 것입니다(위 표의 어드레싱 크기 부분 참고). 컴퓨터에서 프로그램을 실행할 때 과거의 개념으로는 주 메모리에 프로그램을 적재한 후 수행하는 방식을 사용하지만, 바이트 단위로 접근이 가능하기 때문에 주 메모리에 적재하는 과정 없이도 플래시 메모리상에서 바로 프로그램을 실행할 수 있게 됩니다(XIP, eXecution In Place).

크게 인텔과 AMD 제품군으로 구분이 되는데, 인텔 제품군은 부트블록 플래시와 스트라타 플래시로 구분이 가능합니다. 부트블록 플래시는 한 워드씩 쓸 수 있지만 스트라타 플래시는 16개 워드를 병렬로 쓸 수 있다는군요(AMD 제품군은 부트블록 플래시와 유사함).

주로 부트 및 프로그램 수행에 이 NOR 플래시를 사용합니다.

2. NAND

NAND 플래시는 바이트 단위가 아닌 일정한 크기의 데이터블록(플래시 메모리 구조상의 블록과는 다릅니다) 단위로 입출력이 가능합니다. NOR 플래시가 "메모리"에 가깝다면 NAND 플래시는 "디스크"에 가깝다고 할 수 있습니다. NOR 플래시에 비해 데이터 쓰기/지우기가 다소 빠르고(읽기는 NOR이 다소 유리) 무엇보다 집적도가 높아 대용량 플래시 메모리에 적합합니다.

NAND 플래시만으로는 부팅이 불가능해서, SRAM과 컨트롤러를 추가한 OneNAND라는 제품이 등장했습니다. 부팅과 읽기/쓰기 버퍼로 SRAM을 이용하겠다는거죠. 여기에서 더 나아가 SRAM+컨트롤러+ROM을 추가해 moviNAND라는 제품까지 나와있는 상태입니다.

OneNAND를 이용하면 부팅을 위해 NOR 플래시를 사용할 필요가 없어지므로, 인텔에서는 자사의 모바일 프로세서에 NOR 플래시를 집적해버리는 방법으로 자존심을 지키고 있다고 합니다.

SLC NAND / MLC NAND의 구분은 한 셀당 비트 수에 따라 결정되는데, SLC(Single-Level Cell) NAND는 한 셀이 1-bit / MLC(Multi-Level Cell) NAND는 한 셀이 2-bit 이상을 저장할 수 있음을 의미합니다. 현재로서는 MLC NAND의 한 셀은 2-bit입니다. 같은 수의 셀이라면 SLC에 비해 MLC가 용량이 두 배 크다는 얘기가 되겠죠.

하지만 MLC NAND는 SLC NAND에 비해 속도가 느리고, 에러율이 높아 강화된 에러 검출/복구 알고리즘이 필요합니다. 무엇보다, 블록당 지울 수 있는 횟수가 SLC는 10만회인 데 반면 MLC는 1만회로 1/10 수준밖에 되지 않아 용량을 제외한 속도, 수명 및 신뢰도 면에서는 SLC가 현재는 유리하다고 할 수 있습니다.

오랜만에 글을 쓰려니 영 잘 안 풀리네요. 플래시 메모리 이해에 조금이나마 도움이 되었으면 하는 바람입니다. 부족한 글 끝까지 읽어주시느라 수고하셨고, 본문 서두에 적어둔 것처럼 부족한 부분에 대한 보충설명이나 잘못된 부분에 대한 지적, 의견 등등 부탁드리겠습니다. (_ _)