NOR 플래시 구조, 코드를 제자리에서 실행하는 메모리

NOR 플래시 구조, 코드를 제자리에서 실행하는 메모리

철이 바뀌면 옷장을 다시 정리하게 됩니다. 매일 입는 교복이나 외투는 현관 옷걸이에 걸어 두고 바로 꺼내 입고, 계절이 지난 옷은 상자에 담아 창고로 보내죠.

메모리에도 같은 구분이 있습니다. 오늘 다룰 NOR 플래시가 현관 옷걸이 쪽이고, 한 번에 많이 쌓아 두는 창고 상자 쪽이 낸드입니다. NOR는 프로세서가 필요한 위치를 직접 짚어 곧바로 읽을 수 있어서 부팅 코드의 자리가 됩니다.

옷걸이와 다른 점이 있습니다. 옷걸이의 옷은 갈아 입히기 쉽지만, NOR는 읽기가 빠른 대신 쓰기와 지우기가 느리고 지우는 단위가 정해져 있습니다. 이 비대칭이 NOR의 쓰임새를 정하는 핵심입니다.

NOR 플래시가 코드 저장소로 쓰이는 이유

프로세서가 프로그램을 실행하려면 명령어를 순서대로, 때로는 분기해서 여기저기 읽어야 합니다. 이런 읽기는 위치가 예측되지 않고 한 번에 몇 바이트씩 짧게 일어나기 때문에, 원하는 주소를 바로 짚어 읽을 수 있는 메모리가 유리합니다.

NOR는 바로 이 임의 접근에 맞춰진 플래시입니다. 낸드가 페이지 하나를 읽기 시작하는 데 수십 마이크로초가 걸리는 것과 달리, NOR는 개별 바이트나 워드를 나노초 단위의 짧은 응답으로 읽을 수 있습니다.

그래서 부트 코드, PC의 펌웨어, 차량 제어기와 네트워크 장비의 펌웨어처럼 한번 넣어 두면 자주 바꾸지 않고 읽기는 많이 하는 코드 저장에 오래 쓰여 왔습니다. 마이크로컨트롤러 안에 내장된 플래시도 NOR 방식을 쓰는 경우가 많습니다.

병렬 셀 구조가 임의 위치 읽기를 가능하게 하는 방식

NOR라는 이름은 셀을 연결한 모양이 논리 게이트 NOR의 병렬 트랜지스터와 닮은 데서 왔습니다. 각 셀의 한쪽 단자가 비트 라인에 직접 이어지고 다른 쪽이 접지 쪽 소스 라인에 이어져서, 셀 하나를 골라 그 값을 독립적으로 읽을 수 있습니다.

낸드는 셀 여러 개가 직렬로 이어진 줄을 한 묶음으로 다루기 때문에 줄 안의 셀 하나를 읽으려면 나머지 셀을 모두 켜 줘야 합니다. NOR는 이런 준비가 필요 없어서 읽기가 빠릅니다.

대가는 면적입니다. 셀마다 비트 라인에 연결하는 접점이 필요하니 같은 면적에 담을 수 있는 비트 수가 적어지고, 같은 용량이라면 낸드보다 비싸지는 경향이 있습니다. 그래서 NOR는 대용량 저장이 아니라 비교적 작은 용량의 코드 저장에 주로 쓰입니다.

신뢰성 면에서도 역할이 나뉩니다. NOR는 상대적으로 비트 오류가 적어서 오류 정정 회로 없이 쓰는 설계가 많고, 한 비트만 어긋나도 프로그램 전체가 오동작할 수 있는 코드 저장에 잘 맞습니다.

1에서 0으로만 쓰는 규칙과 섹터 소거

플래시 메모리의 셀은 지운 상태가 1이고, 프로그램하면 0이 됩니다. 한 번 0으로 만든 비트를 다시 1로 되돌리는 것은 프로그램만으로는 불가능하고, 그 비트가 속한 섹터(Sector) 전체를 지워야 합니다.

전통적인 NOR는 프로그램할 때 채널 핫 일렉트론 주입(CHE, Channel Hot Electron injection)으로 전자를 플로팅 게이트에 넣고, 지울 때는 파울러-노드하임 터널링(Fowler-Nordheim Tunneling)으로 전자를 빼냅니다. 프로그램은 바이트나 워드 단위로 가능하지만 소거는 섹터 단위입니다.

섹터 안의 값 일부를 바꾸는 절차

  1. 수정할 위치가 속한 섹터의 내용을 다른 곳(RAM이나 여유 섹터)에 읽어서 보관합니다.
  2. 해당 섹터를 통째로 소거해 모든 비트를 1로 만듭니다.
  3. 보관해 둔 내용에 바꿀 값을 반영합니다.
  4. 섹터에 다시 프로그램해 새 내용을 기록합니다.

섹터는 보통 수 KB에서 수백 KB 크기이고, 소거에는 읽기와 비교해 몇 자릿수 긴 밀리초 단위의 시간이 걸립니다. 그래서 설정값 몇 바이트를 고치려고 섹터를 지우는 일은 비싼 작업입니다.

여기서 NOR 플래시는 이미 쓴 바이트를 마음대로 덮어쓸 수 있다는 생각은 오해입니다. 이미 0이 된 비트를 1로 바꿀 수 없으므로, 새 값이 기존 값에서 0만 더 늘어나는 모양일 때만 지우지 않고 쓸 수 있습니다.

제자리 실행(XIP)과 부팅 흐름

NOR의 가장 큰 장점은 제자리 실행(XIP, eXecute In Place)입니다. 프로그램을 RAM으로 복사하지 않고 NOR에 놓인 그대로 프로세서가 명령어를 가져와 실행하는 방식이며, RAM 용량이 작은 기기에서 특히 유용합니다.

NOR에서 부팅할 때의 흐름

  1. 전원이 켜지면 프로세서가 미리 정해진 시작 주소에서 첫 명령어를 읽습니다. 이 주소가 NOR에 매핑되어 있습니다.
  2. NOR에 있는 부트 코드가 제자리에서 실행되며 클럭과 DRAM 같은 기본 장치를 초기화합니다.
  3. DRAM이 준비되면 부트 코드가 더 큰 프로그램(운영체제 등)을 저장장치에서 DRAM으로 불러옵니다.
  4. 제어권이 DRAM의 프로그램으로 넘어가고, 이후 NOR는 필요한 코드만 읽는 용도로 남습니다.

낸드로는 이 첫 단계가 어렵습니다. 낸드는 페이지 단위로 읽고 오류 정정이 필요한 구조라서 프로세서가 바이트 단위로 직접 가져다 실행하기 어렵고, 먼저 컨트롤러나 별도 코드가 내용을 RAM에 옮겨 줘야 합니다.

XIP에도 단점은 있습니다. 명령어를 읽을 때마다 NOR의 응답 시간을 거치니 프로세서 속도를 따라가지 못해 캐시를 함께 쓰는 경우가 많고, 코드가 RAM에서 돌 때보다 느릴 수 있습니다.

복사 시간과 소거 횟수를 가상 계산으로 가늠하기

제자리 실행이 얼마나 부담을 줄이는지, 그리고 섹터 소거가 수명에 어떤 의미인지 숫자로 보겠습니다.

가상 계산 예시, 복사 부팅과 XIP실제 제품 값이 아니라 설명을 위한 가정입니다. 펌웨어 크기가 2 MB이고, 저장장치에서 RAM으로 복사하는 속도가 20 MB/s라고 둡니다.

복사하는 방식은 2 MB ÷ 20 MB/s = 0.1초를 부팅마다 쓰고 RAM도 2 MB를 차지합니다. XIP는 복사 시간과 이 RAM이 필요 없고, 대신 명령어를 읽을 때 NOR의 응답 시간이 반영됩니다.

가상 계산 예시, 설정값 저장과 섹터 수명실제 제품 값이 아니라 설명을 위한 가정입니다. 섹터 하나의 소거 한계를 10만 회, 설정값이 한 섹터에 저장된다고 둡니다.

하루에 10번 저장하면 100,000 ÷ 10 = 10,000일, 약 27년을 버팁니다. 하루에 1,000번 저장하면 100,000 ÷ 1,000 = 100일 만에 그 섹터가 한계에 닿습니다.

같은 설정을 섹터 8개에 돌아가며 기록하면 섹터당 소거 횟수가 8분의 1로 줄어, 100일의 8배인 800일(약 2.2년)로 늘어납니다. 낸드 SSD가 웨어 레벨링을 하는 것과 같은 발상을, 작은 기기에서는 펌웨어가 직접 구현하는 경우가 있습니다.

두 번째 계산에서 보듯 NOR에서는 설정값을 자주 바꾸는 방식이 수명을 갉아먹을 수 있어서, 자주 바뀌는 데이터는 RAM에 두거나 저장 간격을 늘려 설계합니다.

병렬 버스에서 직렬 SPI로 바뀐 인터페이스

초기 NOR는 주소선과 데이터선을 별도의 핀으로 모두 빼낸 병렬 인터페이스였습니다. 프로세서가 메모리처럼 직접 읽을 수 있어 편했지만, 핀 수가 많아 기판 배선이 복잡하고 패키지가 커졌습니다.

이를 줄이려고 나온 것이 직렬 방식의 SPI NOR입니다. 핀 수가 크게 줄고, 데이터선을 두 개나 네 개, 여덟 개로 늘리는 Dual, Quad, Octal 모드로 대역폭을 키웁니다.

직렬이어도 제자리 실행은 가능합니다. 프로세서 쪽 컨트롤러가 SPI 읽기를 메모리 주소 공간처럼 보이게 해 주는 방식이 널리 쓰이며, 읽기 속도가 병렬 NOR보다 낮은 점은 캐시와 고속 모드로 보완합니다.

NOR 플래시와 NAND 플래시 비교 표

구분NORNAND
셀 연결셀이 비트 라인에 병렬로 연결셀이 직렬로 이어진 줄
읽기 방식바이트나 워드 단위의 임의 접근페이지 단위
쓰기와 소거프로그램은 바이트나 워드 단위, 소거는 섹터 단위, 상대적으로 느림프로그램은 페이지 단위, 소거는 블록 단위, 상대적으로 빠름
밀도와 비용면적이 커서 용량당 비용이 높음밀도가 높아 용량당 비용이 낮음
주 용도부트 코드와 펌웨어, XIP대용량 저장(SSD, UFS 등)
놓치기 쉬운 점NOR가 모든 면에서 낸드보다 빠르다는 생각에 주의합니다. 빠른 것은 임의 읽기이고, 쓰기와 소거는 오히려 느립니다.

핵심 정리

NOR 플래시는 셀을 병렬로 연결해 원하는 주소를 바로 읽을 수 있게 만든 플래시이고, 이 성질 덕분에 프로세서가 코드를 복사 없이 제자리에서 실행하는 XIP를 지원합니다. 반면 1에서 0으로만 쓸 수 있고 섹터 단위로 지워야 하며 쓰기와 소거가 느려서, 코드를 한 번 넣고 자주 읽는 용도에 잘 맞습니다.

현관 옷걸이처럼 자주 꺼내는 것은 바로 닿는 곳에, 쌓아 두는 것은 창고에 두는 분업이 메모리 계층에도 그대로 적용된 셈입니다. 용량이 필요하면 낸드를, 빠르고 믿을 수 있는 코드 읽기가 필요하면 NOR를 쓰고, 설정값 저장처럼 쓰기가 잦은 곳에서는 섹터 수명을 함께 계산해야 합니다.

면접 대비 질문

면접 대비 질문NOR가 부트 코드 저장에 적합하고 낸드는 그렇지 않은 이유를 셀 구조와 접근 방식으로 설명해 보세요.

[답변 포인트] NOR는 셀이 비트 라인에 병렬로 연결되어 바이트나 워드 단위의 임의 접근이 가능하고 응답이 짧아, 프로세서가 코드를 복사 없이 제자리에서 실행(XIP)할 수 있다는 점으로 시작합니다. 낸드는 직렬 구조에 페이지 단위로 읽고 오류 정정이 필요해서 직접 실행이 어렵고 RAM으로 옮겨야 한다고 대비합니다. NOR의 한계로 면적과 비용, 섹터 단위 소거, 느린 쓰기를 짚고, 1에서 0으로만 프로그램되기 때문에 값을 바꿀 때 섹터를 지워야 한다는 점, 병렬에서 SPI로의 인터페이스 변화까지 덧붙이면 좋습니다.