테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

기억장치의 종류: RAM과 ROM

RAM은 전원을 끄면 지워지는 작업대, ROM은 원래 읽기만 하는 칩, 저장장치는 꺼도 남는 창고다. "ROM"이라는 말이 게임 롬, CD-ROM, 사양표의 ROM에서 각각 무엇을 뜻하는지까지 가려낸다.

목차 (8)
  1. 기억장치 지도: 메모리와 저장장치
  2. RAM: 아무 데나 같은 시간에
  3. ROM의 원래 뜻과 계보
  4. 펌웨어: 메인보드의 "BIOS ROM"
  5. "ROM"이라는 말의 여러 쓰임
  6. 게임 롬과 에뮬레이터
  7. 흐려지는 경계: 메모리 같은 저장장치, 저장장치 같은 메모리
  8. 정리와 핵심 자료

기억장치 지도: 메모리와 저장장치

컴퓨터에서 무엇을 "저장"하는 부품은 여럿이다. 한국어로는 RAM도 SSD도 다 저장한다고 말하지만, 하는 일은 다르다. 두 질문으로 나누면 깔끔하다. 첫째, 전원을 끄면 내용이 사라지는가(휘발성, volatile) 남는가(비휘발성, non-volatile). 둘째, CPU가 주소를 대고 바이트 단위로 바로 읽는가(주기억, 메모리) 아니면 운영체제가 입출력 명령으로 블록 단위로 가져오는가(보조기억, 저장장치).

기억장치 지도: 휘발성이면서 CPU가 바로 읽는 주기억은 RAM, 비휘발성 주기억은 ROM과 NOR 플래시, 비휘발성 보조기억은 SSD·HDD 같은 저장장치다휘발성 (전원 끄면 사라짐)비휘발성 (남음)주기억(메모리)CPU가 바로 읽음보조기억(저장장치)입출력으로 읽음RAM: SRAM · DRAM레지스터 · 캐시 · 메인 메모리ROM · NOR 플래시펌웨어 · 부팅 코드 · 게임 롬드물다RAM 디스크 정도저장장치SSD · HDD · 테이프 · CD
기억장치 지도. RAM은 휘발성 주기억, SSD·HDD는 비휘발성 보조기억이다. ROM과 NOR 플래시는 꺼도 남으면서 CPU가 바로 읽는 자리라 부팅 코드가 산다.

그래서 RAM은 저장장치가 아니라 메모리다. 작업대에 펼쳐 놓은 서류와 창고에 넣어 둔 상자의 차이다. 프로그램을 실행하면 운영체제가 저장장치에서 코드와 데이터를 RAM으로 읽어 오고, CPU는 RAM에서만 일한다. 저장장치를 RAM처럼 쓰는 스왑이 느린 것도 이 둘의 거리 때문이다(RAM 노트).

둘의 거리는 자릿수로 잰다. 위층일수록 빠르고 작고 비싸며, 아래층일수록 느리고 크고 싸다. 이 층을 쌓은 것을 메모리 계층(memory hierarchy)이라 한다. 캐시가 DRAM을, DRAM이 SSD를 가려 주기 때문에 컴퓨터는 아래층의 용량과 위층의 속도를 함께 누린다.

메모리 계층: 레지스터, SRAM 캐시, DRAM 메인 메모리, NAND SSD, HDD, 테이프 순으로 지연이 자릿수 단위로 길어지고 용량은 커진다. DRAM까지가 휘발성이고 SSD부터 비휘발성이다한 번 읽는 지연 (로그 눈금)흔한 용량레지스터 (플립플롭)0.3ns2KiB캐시 (SRAM)1ns32MiB메인 메모리 (DRAM)100ns32GiBSSD (NAND 플래시)100µs2TiBHDD (자기 원판)10ms20TiB테이프 (자기 테이프)60s18TiB위: 휘발성 · 아래: 비휘발성DRAM과 SSD는 약 1,000배, SSD와 HDD는 약 100배 차이. 값은 대략의 자릿수다
메모리 계층의 지연(로그 눈금)과 흔한 용량. 한 층 내려갈 때마다 지연이 한두 자릿수씩 늘어난다. DRAM과 SSD 사이에 휘발성의 경계가 있다.
층소자지연흔한 용량1GB당 값
레지스터플립플롭0.3ns2KiBCPU 값에 포함
캐시SRAM1ns32MiBCPU 값에 포함
메인 메모리DRAM100ns32GiB약 $5
SSDNAND 플래시100µs2TiB약 $0.08
HDD자기 원판10ms20TiB약 $0.02
테이프자기 테이프60s18TiB약 $0.005

표의 값은 2020년대 PC를 기준으로 한 대략의 자릿수다. 지연은 세대와 제품에 따라 몇 배씩 다르고 메모리 값은 시세에 따라 크게 출렁이지만, 층 사이가 수십~수천 배 벌어진다는 모양은 그대로다. 자릿수 감각은 Latency Numbers Every Programmer Should Know에서 연도별로 볼 수 있다.

RAM: 아무 데나 같은 시간에

RAM은 Random Access Memory, 곧 임의 접근 메모리다. "임의"는 아무렇게나가 아니라 "어느 주소든 골라서"라는 뜻이다. 주소 0을 읽든 주소 10억을 읽든 걸리는 시간이 거의 같다. 이 이름은 처음부터 끝까지 감아야 하는 테이프나 회전을 기다려야 하는 드럼·디스크와 견주어 붙었다. 지금은 ROM과 플래시도 임의 접근이 되니, 실제로 RAM이라는 말은 "읽고 쓰는 휘발성 메모리"라는 뜻으로 쓰인다.

RAM에는 두 갈래가 있다. SRAM(static RAM)은 인버터 두 개가 서로의 출력을 입력으로 받아 0이나 1을 붙들고, 접근 트랜지스터 두 개를 더해 한 비트에 트랜지스터 6개를 쓴다. 전원만 있으면 값이 유지되고 아주 빠르지만 자리를 많이 차지해 CPU 캐시처럼 작은 곳에 쓴다. DRAM(dynamic RAM)은 트랜지스터 1개와 커패시터 1개로 한 비트를 만든다. 작아서 기가바이트를 싸게 담지만, 커패시터의 전하가 조금씩 새므로 주기적으로 읽어서 다시 써야 한다. 이것이 리프레시(refresh)이고, DDR 메모리는 보통 64ms 안에 모든 줄을 한 번씩 리프레시한다.

SRAM 셀은 서로 맞물린 인버터 두 개와 접근 트랜지스터 두 개, 모두 트랜지스터 6개로 값을 붙든다. DRAM 셀은 트랜지스터 1개와 커패시터 1개로 전하를 담고, 전하가 새므로 주기적으로 다시 써야 한다SRAMCPU 캐시에 쓴다워드선비트선비트선트랜지스터 6개전원이 있는 동안 값을 스스로 붙든다DRAM메인 메모리에 쓴다워드선비트선커패시터전하가 샌다커패시터 1개 + 트랜지스터 1개64ms 안에 다시 읽고 써야 한다(리프레시)
SRAM 셀과 DRAM 셀. SRAM은 맞물린 인버터가 값을 스스로 붙들고, DRAM은 커패시터에 담은 전하가 값이라 새기 전에 다시 채워야 한다. 둘 다 전원을 끄면 값이 사라진다.

둘 다 전원을 끄면 내용이 사라진다. SRAM은 붙들어 줄 전류가 끊기고, DRAM은 리프레시가 멈추면서 전하가 빠진다. DDR 세대, 클럭과 타이밍, 듀얼 채널처럼 메모리를 고를 때 보는 점은 RAM 노트에, 캐시가 CPU 안에서 어떻게 쓰이는지는 CPU 노트에 있다.

ROM의 원래 뜻과 계보

ROM은 Read-Only Memory, 읽기 전용 메모리다. 처음의 ROM은 정말 고칠 수 없었다. 마스크 ROM(mask ROM)은 반도체를 만드는 포토마스크에 0과 1을 새겨, 내용이 회로 배선 그 자체다. 같은 칩을 많이 찍을수록 가장 싸지만 한 글자를 고치려면 칩을 다시 만들어야 한다. 그 뒤로 사용자가 직접 쓰고, 지우고, 고쳐 쓰는 방법이 차례로 나왔다.

ROM의 계보 단계 그림: 마스크 ROM, PROM, EPROM, EEPROM, 플래시 다섯 세대를 차례로 짚으며 각 세대가 어떻게 쓰고 지우는지 보여 준다마스크 ROM공장에서 새김PROM1950년대 말EPROM1971년EEPROM1970년대 말플래시1980년대쓰기칩을 만들 때 포토마스크로 0과 1을 새긴다지우기못 지운다. 틀리면 칩을 다시 만든다쓰임패미컴·게임보이 카트리지, 대량 생산품쓰기프로그래머 장치로 퓨즈를 끊어 한 번 쓴다지우기못 지운다. 끊은 퓨즈는 되돌릴 수 없다쓰임소량 생산, 시제품(OTP 칩)쓰기높은 전압으로 플로팅 게이트에 전자를 가둔다지우기칩 위 석영 창에 자외선을 쬐어 통째로 지운다쓰임개발용 보드, 옛 PC BIOS와 아케이드 기판쓰기기판에 꽂힌 채 전기로 쓴다지우기바이트 단위로 전기로 지운다쓰임설정값, 작은 세이브, 메모리 모듈의 SPD쓰기EEPROM 원리로 셀을 촘촘히, 페이지 단위로 쓴다지우기큰 블록 단위로 한꺼번에 지운다쓰임NOR: 펌웨어 · NAND: SSD·USB·SD 카드
1 / 5

마스크 ROM: 내용이 회로 배선 자체다. 많이 찍으면 가장 싸지만, 주문부터 납품까지 몇 주가 걸리고 한 글자만 틀려도 다시 찍어야 한다.

ROM의 계보. 처음엔 정말 '읽기만' 했지만, 세대마다 지우는 방법이 생기고 쉬워졌다. 오늘날 'ROM'이라 부르는 칩은 대개 고쳐 쓸 수 있는 플래시다.
  • PROM(programmable ROM): 빈 칩의 퓨즈를 높은 전압으로 끊어 한 번 쓴다. 한 번 쓰면 끝이라 OTP(one-time programmable)라고도 부른다.
  • EPROM(erasable PROM): 1971년 인텔이 내놓았다. 플로팅 게이트에 전자를 가둬 값을 담고, 칩 위의 석영 창으로 자외선을 쬐면 통째로 지워진다. 옛 PC 메인보드나 아케이드 기판에서 창에 스티커를 붙인 칩이 이것이다.
  • EEPROM(electrically erasable PROM): 기판에 꽂힌 채 전기로 바이트 단위로 지우고 쓴다. 셀이 커서 작은 데이터에 쓴다. 메모리 모듈의 용량·타이밍 정보를 담은 SPD 칩이 대표적이다.
  • 플래시 메모리(flash memory): 1980년대 도시바의 마스오카 후지오가 발표했다. EEPROM의 원리에서 지우는 단위를 큰 블록으로 키워 셀을 작고 싸게 만들었다. CPU가 바이트 단위로 바로 읽고 코드를 그 자리에서 실행할 수 있는 NOR와, 페이지 단위로 읽는 대신 훨씬 촘촘한 NAND로 나뉜다. NOR는 펌웨어 칩에, NAND는 SSD·USB 메모리·SD 카드에 쓴다.

그래서 이름이 꼬였다. "읽기 전용"이라는 말은 남았지만, 지금 "ROM"이라 부르는 칩 대부분은 고쳐 쓸 수 있는 플래시다. 다만 아무 때나 쓰는 RAM과 달리 쓰기가 느리고, 블록을 지운 뒤에야 다시 쓸 수 있으며, 셀마다 지우고 쓸 수 있는 횟수가 정해져 있다. 그러니 "평소에는 읽기만 하고 가끔 고쳐 쓰는 비휘발성 메모리"가 오늘날 ROM의 실제 뜻에 가깝다.

펌웨어: 메인보드의 "BIOS ROM"

전원을 켠 순간 RAM은 비어 있고, 운영체제는 아직 SSD 안에 있다. CPU가 맨 처음 실행할 코드는 꺼져도 남고 CPU가 바로 읽을 수 있는 곳에 있어야 한다. 그 자리가 메인보드의 펌웨어 칩이다. PC에서는 이 칩을 메모리 주소 공간에 비춰 두어, CPU가 리셋되면 정해진 주소에서 첫 명령을 읽는다.

부팅 순서: CPU가 리셋되면 메인보드 SPI 플래시의 UEFI 펌웨어를 실행하고, 확장 카드의 옵션 ROM을 부른 뒤, SSD의 부트로더를 읽어 운영체제를 DRAM에 올린다CPU 리셋첫 명령 주소—UEFI 펌웨어메인보드SPI NOR 플래시옵션 ROM그래픽·네트워크카드 위 플래시부트로더SSD 파티션NAND 플래시운영체제메모리에 올림DRAM흔히 "ROM"이라 부르는 펌웨어 칩둘 다 고쳐 쓸 수 있는 플래시다. 펌웨어 업데이트는 이 칩을 다시 쓰는 일이다
PC가 켜질 때 거치는 기억장치. 펌웨어(UEFI)와 확장 카드의 옵션 ROM은 흔히 ROM이라 부르지만 실제로는 고쳐 쓸 수 있는 플래시다. 부트로더와 운영체제는 SSD에서 DRAM으로 올라온다.

옛 PC의 펌웨어는 BIOS였고, 지금은 그 뒤를 이은 UEFI(위키백과)다. 처음에는 정말 마스크 ROM이나 EPROM에 담았기 때문에 지금도 "BIOS ROM"이라 부른다. 요즘 메인보드에서는 몇 MB~수십 MB짜리 SPI NOR 플래시 칩 하나에 들어 있다. 펌웨어는 메모리를 점검하고 장치를 초기화한 뒤, 그래픽·네트워크 카드에 실린 옵션 ROM(Option ROM)을 불러 카드를 깨우고, SSD의 부트로더에 넘긴다. 펌웨어를 오픈 소스로 다시 짠 예로 coreboot가 있다.

펌웨어 업데이트는 이 플래시를 다시 쓰는 일이다. 버그와 보안 구멍을 고치고 새 CPU를 지원하지만, 쓰는 도중 전원이 끊기면 부팅할 코드가 망가진다. 그래서 펌웨어 영역을 두 벌 두거나 따로 복구 기능을 둔 메인보드가 많다. 키보드·마우스·SSD·공유기 같은 작은 기기도 저마다 펌웨어를 품는다. 마이크로컨트롤러는 칩 안의 플래시에 프로그램을, SRAM에 변수를 두고 플래시에서 코드를 바로 실행한다(임베디드 노트).

흔히 말하는 CMOS 초기화는 펌웨어 자체가 아니라 BIOS 설정값을 지우는 일이다. 옛 PC는 설정을 동전 전지로 버티는 작은 CMOS 메모리에 담아서 이 이름이 남았고, 지금 보드는 설정 대부분을 펌웨어 플래시의 별도 영역에 두고 전지는 주로 시계(RTC)를 지킨다. XMP/EXPO·오버클럭 설정 뒤 부팅이 안 될 때 점퍼나 버튼으로 설정을 되돌리는 것이고, 펌웨어 버전은 그대로다. 전원을 꺼 둘 때마다 시계가 틀어지면 전지가 다 된 것이다.

"ROM"이라는 말의 여러 쓰임

칩의 이름이던 ROM은 쓰이면서 뜻이 여러 갈래로 퍼졌다. 일부는 여전히 정말 읽기 전용이고, 일부는 이름만 남았다. 가려내는 기준은 하나다. 그것이 만든 뒤 고칠 수 없는 매체인가, 아니면 고쳐 쓰는 플래시에 붙은 옛 이름인가.

ROM이라는 말의 여섯 쓰임: 정말 읽기 전용인 ROM 칩, CD-ROM, 게임 롬과, 이름만 ROM이고 실제로는 플래시인 커스텀 롬, 스마트폰 사양표의 ROM, 옵션 ROM정말 읽기 전용: 만든 뒤 못 고친다ROM 칩마스크 ROM · PROM만들 때 내용이 정해짐CD-ROM · DVD-ROM눌러 찍은 홈(피트)읽기만 하는 광디스크게임 롬카트리지 안 마스크 ROM떠낸 파일은 롬 덤프이름만 ROM: 실제로는 다시 쓰는 플래시커스텀 롬안드로이드 시스템 이미지플래시 파티션에 쓴다사양표 'ROM 128GB'실은 플래시 저장 공간RAM과 짝 맞춘 오용옵션 ROM확장 카드의 펌웨어지금은 대개 플래시
'ROM'의 여섯 쓰임. 위 줄은 정말 만든 뒤 고칠 수 없고, 아래 줄은 이름만 ROM이고 실제로는 다시 쓰는 플래시를 가리킨다.
쓰임실제로 가리키는 것정말 읽기 전용?덧붙임
ROM 칩만들 때 내용을 정한 반도체(마스크 ROM, PROM)그렇다원래 뜻
CD-ROM · DVD-ROM공장에서 홈을 눌러 찍은 광디스크그렇다CD-R·RW는 따로 굽는 디스크
게임 롬카트리지 안의 ROM 칩, 또는 그 내용을 떠낸 파일(롬 덤프)칩은 그렇다파일은 칩의 이미지
커스텀 롬안드로이드 기기의 플래시에 새로 쓰는 시스템 이미지아니다실제로는 펌웨어 이미지
사양표의 'ROM 128GB'스마트폰의 플래시 저장 공간(UFS 등)아니다흔한 오용, 저장 용량이 맞는 말
옵션 ROM그래픽·네트워크 카드에 실린 펌웨어대개 아니다요즘은 플래시에 담는다
  • CD-ROM·DVD-ROM: 공장에서 원판을 찍어 낼 때 홈(피트)을 눌러 새긴 디스크라 정말 읽기만 한다(CD-ROM). 반도체가 아닌 매체에 "ROM"이 붙은 예다. 사용자가 굽는 CD-R은 한 번, CD-RW는 여러 번 쓸 수 있다.
  • 게임 롬: 패미컴·게임보이 같은 카트리지 게임기의 게임은 카트리지 안의 마스크 ROM 칩에 들어 있었다. 그 칩의 내용을 바이트 그대로 떠낸 파일을 ROM 파일 또는 롬 덤프라 한다(ROM image). 칩을 본뜬 것이니 포렌식 노트의 디스크 이미지·메모리 이미지와 같은 뜻의 "이미지"다.
  • 커스텀 롬: 안드로이드에서 제조사 대신 다른 사람이 만든 운영체제를 기기에 올리는 것을 말한다. 실제로는 기기의 플래시 파티션(system, vendor, boot 등)에 쓰는 시스템 이미지다(안드로이드 파티션). 펌웨어를 "ROM"이라 부르던 습관이 남은 이름이다.
  • 사양표의 "ROM 128GB": 일부 스마트폰 사양표나 판매 글이 "RAM 8GB / ROM 128GB"처럼 쓰는데, 여기서 ROM은 사진과 앱을 담는 플래시 저장 공간이다. RAM과 짝을 맞추려다 생긴 흔한 오용이고, "저장 용량"이 맞는 말이다.
  • 옵션 ROM: 확장 카드가 자기 초기화 코드를 펌웨어에 건네는 영역이다. 이름은 옛 칩에서 왔고 지금은 카드의 플래시에 담긴다.

게임 롬과 에뮬레이터

카트리지는 게임기의 버스를 바깥으로 꺼낸 기판이다. 꽂는 순간 카트리지의 칩이 게임기 CPU의 주소 공간 일부가 된다. 패미컴(NES) 카트리지에는 보통 게임 코드가 든 PRG ROM과, 화면 칩(PPU)이 읽는 타일 그림이 든 CHR ROM(또는 CHR RAM)이 따로 있다. 세이브가 되는 게임은 작은 SRAM과 리튬 코인 전지를 넣어 전원을 꺼도 SRAM이 지워지지 않게 했고, 뒤의 게임은 EEPROM이나 플래시에 세이브했다.

카트리지 구조: 게임기의 CPU 버스에는 프로그램 ROM, 매퍼, 전지로 지키는 세이브 SRAM이, 그림을 그리는 PPU 버스에는 타일 그림이 든 CHR ROM이 붙는다. 매퍼는 어느 뱅크를 보일지 고른다게임기CPU프로그램 실행PPU화면 그리기카트리지PRG ROM게임 코드·데이터SRAM + 전지세이브(일부 게임)매퍼뱅크 고르기CHR ROM타일 그림CPU 버스PPU 버스뱅크선택CPU는 주소 64KiB만 본다. 그보다 큰 ROM은 매퍼가 창을 바꿔 가며 보인다
패미컴(NES) 카트리지의 구조. CPU 버스에는 프로그램 ROM·매퍼·세이브 SRAM이, PPU 버스에는 그림 ROM이 붙는다. 매퍼가 어느 뱅크를 보일지 고른다.

문제는 주소 공간이다. NES의 CPU는 16비트 주소로 64KiB만 볼 수 있고, 그중 카트리지 ROM에 내준 창은 $8000부터 $FFFF까지 32KiB다(CPU 메모리 맵). 게임이 커지자 카트리지에 매퍼(mapper)라는 칩을 넣어 뱅크 전환(bank switching)을 했다. ROM을 같은 크기의 뱅크로 나누고, CPU가 매퍼의 레지스터에 번호를 쓰면 창에 보이는 뱅크가 바뀐다(NESdev 매퍼). 가장 단순한 UxROM은 $8000–$BFFF에 고른 16KiB 뱅크를, $C000–$FFFF에 마지막 뱅크를 늘 보인다. 리셋 직후 실행할 코드와 뱅크를 바꾸는 코드가 늘 보여야 하기 때문이다.

뱅크 전환 단계 그림: 왼쪽은 뱅크 0부터 7까지의 ROM, 오른쪽은 CPU 주소의 두 창이다. 고정 창은 늘 뱅크 7을, 고르는 창은 매퍼가 고른 뱅크를 보인다ROM 128KiBCPU 주소 공간뱅크 0뱅크 1뱅크 2뱅크 3뱅크 4뱅크 5뱅크 6뱅크 7 (고정)$8000–$BFFF 고르는 창$C000–$FFFF 고정 창뱅크 7뱅크 7 (고정)뱅크 0읽기: ROM $1C010 → CPU $C010매퍼에 쓰지 않는다뱅크 2뱅크 2읽기: ROM $0A345 → CPU $A345매퍼 레지스터에 2를 쓴다뱅크 2뱅크 2읽기: ROM $0B000 → CPU $B000매퍼에 쓰지 않는다뱅크 5뱅크 5읽기: ROM $14020 → CPU $8020매퍼 레지스터에 5를 쓴다뱅크 7 (고정)뱅크 5읽기: ROM $1FFFC → CPU $FFFC매퍼에 쓰지 않는다
1 / 5

ROM $1C010는 뱅크 7, 늘 보이는 고정 뱅크라 바꾸지 않고 CPU 주소 $C010에서 읽는다.

뱅크 전환(NES UxROM 방식). 128KiB ROM을 16KiB 뱅크 8개로 나눠, 마지막 뱅크는 $C000에 늘 두고 나머지는 $8000 창에 골라 끼운다. ROM 주소 몇 곳을 차례로 읽는다.

게임보이도 같은 방법을 쓴다. ROM의 $0000–$3FFF에 뱅크 0을 고정하고 $4000–$7FFF를 고르는 창으로 쓰며, 카트리지 RAM은 $A000–$BFFF에 보인다(Pan Docs 메모리 맵). 이 일을 하는 칩을 MBC(memory bank controller)라 부르고, MBC1은 ROM을 최대 2MiB까지 다룬다(Pan Docs MBC).

역할별 ROM

카트리지나 아케이드 기판 하나에 ROM이 한 개만 있는 것은 아니다. 읽는 칩마다 따로 둔다. CPU가 실행할 코드는 프로그램 ROM에, 타일과 스프라이트 그림은 그래픽 칩이 읽는 그래픽 ROM에, 사운드 CPU의 프로그램과 효과음·목소리 샘플(ADPCM)은 사운드 ROM에 담는다. 각 ROM은 그것을 읽는 칩의 버스와 주소 공간에 붙으므로, 같은 주소 $0000이라도 CPU가 보는 것과 그래픽 칩이 보는 것이 다르다. 여기에 작업용 RAM과 세이브·설정용 메모리가 더해진다.

역할별 ROM: 프로그램 ROM은 메인 CPU가, 그래픽 ROM은 그래픽 칩이, 사운드 ROM은 사운드 CPU와 칩이 읽는다. 스트리트 파이터 II에서는 그래픽 ROM을 이미 구운 뒤 오타를 발견해, 프로그램 코드만 바꿔 다른 타일을 빌리고 점 하나를 덧그려 Warrier를 Warrior처럼 보이게 했다프로그램 ROMCPU가 실행할 코드아직 고칠 수 있었다메인 CPU그래픽 ROM타일·스프라이트 그림이미 구워 두었다그래픽 칩사운드 ROM사운드 프로그램·샘플사운드 CPU·칩World Warrier구운 그래픽 그대로World Warrlor'World'의 or 타일 빌림World Warrior점 하나 타일로 l을 i로스트리트 파이터 II: 프로그램만 바꿔 오타 가리기그림은 고칠 수 없으니, 어떤 타일을 어디에 그릴지 정하는 코드를 바꿨다
역할별 ROM. 위는 칩마다 따로 둔 ROM과 그것을 읽는 칩, 아래는 스트리트 파이터 II에서 그래픽 ROM은 둔 채 프로그램만 바꿔 오타를 가린 순서다.

나뉘어 있다는 것이 실제로 차이를 만든 이야기가 있다. 캡콤의 CPS-1 기판으로 나온 스트리트 파이터 II의 부제 "The World Warrior"가 그림에 "Warrier"로 찍혀 있었는데, 리드 그래픽 디자이너 아키맨(Akiman)이 마감 사흘 전에야 이것을 발견했다. 그래픽 ROM은 이미 구운 뒤라 그림을 고칠 수 없었고, 68000 CPU의 프로그램 ROM은 아직 고칠 수 있었다. CPS-1은 ROM의 타일을 고치지 못하고 어디에 어떤 팔레트로 놓을지만 정하는 기계라, 그는 코드만 바꿨다. "World"의 "or" 타일을 빌려 "Warrlor"를 만들고, 가일 스프라이트에 있던 점 하나짜리 타일을 로고 팔레트로 연필처럼 세 번 덧그려 l의 윗부분을 끊어 i처럼 보이게 했다(Fabien Sanglard의 글).

칩마다 마감이 달랐던 데에는 업계의 일반적인 사정이 있다. 마스크 ROM은 많이 찍으면 싸지만 공장에 몇 주 앞서 주문해야 하고, EPROM은 비싼 대신 마지막 순간에 직접 구울 수 있다. 그래서 내용이 일찍 굳는 부분과 끝까지 고칠 부분의 일정이 갈렸다. 다만 CPS-1의 각 ROM이 어느 종류였는지는 그 글에 나오지 않는다. 같은 까닭으로 에뮬레이터가 읽는 아케이드 롬 덤프는 파일 하나가 아니라 칩마다 하나씩, 여러 파일의 묶음으로 되어 있다.

에뮬레이터는 롬 이미지를 어떻게 돌리나

에뮬레이터는 게임기의 CPU·그래픽 칩·사운드 칩을 소프트웨어로 흉내 낸다(게임기 에뮬레이터). 롬 이미지는 카트리지 칩의 바이트 그대로이므로, 에뮬레이터는 그 파일을 메모리에 읽어 두고 흉내 낸 CPU가 주소 $8000을 읽으면 지금 고른 뱅크의 해당 바이트를 돌려준다. 매퍼도 흉내 내야 하므로 롬 파일에는 어떤 매퍼를 쓰는지 적어 둔다. NES 롬 파일의 흔한 형식인 iNES는 앞 16바이트 머리에 PRG·CHR 크기와 매퍼 번호를 담고, 게임보이는 ROM 안의 $0100–$014F 카트리지 헤더에 MBC 종류와 ROM·RAM 크기가 들어 있다.

법적인 면: 게임 롬은 저작물이다. 남이 올린 롬 파일을 내려받거나 배포하는 것은 대부분의 나라에서 저작권 침해다. 자기가 산 카트리지를 직접 떠서 백업하는 것이 허용되는지는 나라마다 다르고, 복제 방지 장치를 우회하는 일을 따로 금지하는 법도 많다. 에뮬레이터 프로그램 자체와 롬 파일은 흔히 법적으로 따로 다뤄진다. 이 절은 개요일 뿐 법률 조언이 아니며, 실제 판단은 사는 나라의 법을 따라야 한다.

흐려지는 경계: 메모리 같은 저장장치, 저장장치 같은 메모리

"빠르고 휘발성인 메모리, 느리고 비휘발성인 저장장치"라는 나눔도 조금씩 흐려진다. NVMe SSD는 플래시를 위해 새로 짠 인터페이스로 지연을 수십 µs까지 줄였지만, 여전히 블록 단위 입출력이라 저장장치 쪽이다. 반대로 인텔 옵테인(3D XPoint)의 영구 메모리(persistent memory) 모듈은 DRAM 슬롯에 꽂혀 CPU가 바이트 단위로 읽고 쓰면서도 전원을 꺼도 남았다. 그러나 인텔은 2022년 옵테인 사업을 접었다(3D XPoint).

경계가 흐려지는 기억장치: DRAM 약 100나노초, CXL로 붙인 메모리와 옵테인 영구 메모리는 수백 나노초로 바이트 단위로 읽히고, 옵테인 SSD 약 10마이크로초와 NAND NVMe SSD 약 100마이크로초는 블록 단위 입출력이다10ns100ns1µs10µs100µsDRAMCXL 메모리옵테인 영구 메모리옵테인 SSDNAND NVMe SSD바이트 단위로 CPU가 바로 읽음 (메모리)블록 단위 입출력 (저장장치)대략의 읽기 지연, 로그 눈금
대략의 읽기 지연으로 놓은 메모리와 저장장치. 바이트 단위로 CPU가 바로 읽는 쪽과 블록 단위 입출력 쪽 사이에 옵테인이 다리를 놓으려 했다. 값은 제품마다 다른 대략의 자릿수다.
  • MRAM·FeRAM: 자기 터널 접합(MRAM)이나 강유전체(FeRAM)로 비트를 담아, RAM처럼 바이트 단위로 빨리 쓰면서 꺼도 남는다. 용량이 작고 비싸 마이크로컨트롤러, 산업 장비, 자주 기록하는 로그 같은 곳에 쓴다.
  • CXL 메모리: PCIe의 물리 계층 위에 캐시 일관성을 얹은 CXL로 서버에 DRAM을 더 붙이거나 여러 서버가 메모리를 나눠 쓴다. 휘발성 DRAM이지만 메인보드 슬롯 밖, 카드나 별도 장치에 있어 로컬 DRAM보다 조금 느린 한 층이 더 생긴다.

그래도 두 질문은 여전히 유효하다. 꺼도 남는가, 그리고 CPU가 바이트 단위로 바로 읽는가. 새 기술은 이 둘의 조합을 새로 고르는 시도로 보면 이해하기 쉽다.

정리와 핵심 자료

처음 보는 기억장치는 세 질문으로 자리를 찾는다. 전원을 끄면 사라지면 RAM이다. 남으면서 만든 뒤 고칠 수 없으면 진짜 ROM이다. 고쳐 쓸 수 있으면 CPU가 바이트 단위로 바로 읽는지(펌웨어 칩), 블록 단위로 가져오는지(저장장치)를 본다. 이름에 붙은 "ROM"보다 이 답이 그 부품의 실체다.

기억장치 가려내기: 전원을 끄면 사라지면 RAM이다. 남으면서 만든 뒤 못 고치면 진짜 ROM이다. 고쳐 쓰면서 CPU가 바이트 단위로 바로 읽으면 NOR 플래시나 EEPROM 같은 펌웨어 칩이고, 블록 단위로 읽으면 저장장치다전원을 끄면?사라진다RAMSRAM · DRAM남는다만든 뒤 고쳐 쓰나?못 고친다진짜 ROM마스크 ROM · CD-ROM고친다바이트 단위로 바로?예NOR 플래시 · EEPROM펌웨어, 흔히 "ROM"아니오저장장치NAND SSD · HDD
기억장치 가려내기. 이름보다 성질을 묻는다: 꺼도 남는가, 고쳐 쓰는가, CPU가 바이트 단위로 바로 읽는가.

저장장치 쪽의 이야기는 저장장치 노트와 블록·파일·오브젝트 스토리지로 이어진다.