기억장치의 종류: RAM과 ROM
RAM은 전원을 끄면 지워지는 작업대, ROM은 원래 읽기만 하는 칩, 저장장치는 꺼도 남는 창고다. "ROM"이라는 말이 게임 롬, CD-ROM, 사양표의 ROM에서 각각 무엇을 뜻하는지까지 가려낸다.
목차 (8)
기억장치 지도: 메모리와 저장장치
컴퓨터에서 무엇을 "저장"하는 부품은 여럿이다. 한국어로는 RAM도 SSD도 다 저장한다고 말하지만, 하는 일은 다르다. 두 질문으로 나누면 깔끔하다. 첫째, 전원을 끄면 내용이 사라지는가(휘발성, volatile) 남는가(비휘발성, non-volatile). 둘째, CPU가 주소를 대고 바이트 단위로 바로 읽는가(주기억, 메모리) 아니면 운영체제가 입출력 명령으로 블록 단위로 가져오는가(보조기억, 저장장치).
그래서 RAM은 저장장치가 아니라 메모리다. 작업대에 펼쳐 놓은 서류와 창고에 넣어 둔 상자의 차이다. 프로그램을 실행하면 운영체제가 저장장치에서 코드와 데이터를 RAM으로 읽어 오고, CPU는 RAM에서만 일한다. 저장장치를 RAM처럼 쓰는 스왑이 느린 것도 이 둘의 거리 때문이다(RAM 노트).
둘의 거리는 자릿수로 잰다. 위층일수록 빠르고 작고 비싸며, 아래층일수록 느리고 크고 싸다. 이 층을 쌓은 것을 메모리 계층(memory hierarchy)이라 한다. 캐시가 DRAM을, DRAM이 SSD를 가려 주기 때문에 컴퓨터는 아래층의 용량과 위층의 속도를 함께 누린다.
| 층 | 소자 | 지연 | 흔한 용량 | 1GB당 값 |
|---|---|---|---|---|
| 레지스터 | 플립플롭 | 0.3ns | 2KiB | CPU 값에 포함 |
| 캐시 | SRAM | 1ns | 32MiB | CPU 값에 포함 |
| 메인 메모리 | DRAM | 100ns | 32GiB | 약 $5 |
| SSD | NAND 플래시 | 100µs | 2TiB | 약 $0.08 |
| HDD | 자기 원판 | 10ms | 20TiB | 약 $0.02 |
| 테이프 | 자기 테이프 | 60s | 18TiB | 약 $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은 붙들어 줄 전류가 끊기고, DRAM은 리프레시가 멈추면서 전하가 빠진다. DDR 세대, 클럭과 타이밍, 듀얼 채널처럼 메모리를 고를 때 보는 점은 RAM 노트에, 캐시가 CPU 안에서 어떻게 쓰이는지는 CPU 노트에 있다.
ROM의 원래 뜻과 계보
ROM은 Read-Only Memory, 읽기 전용 메모리다. 처음의 ROM은 정말 고칠 수 없었다. 마스크 ROM(mask ROM)은 반도체를 만드는 포토마스크에 0과 1을 새겨, 내용이 회로 배선 그 자체다. 같은 칩을 많이 찍을수록 가장 싸지만 한 글자를 고치려면 칩을 다시 만들어야 한다. 그 뒤로 사용자가 직접 쓰고, 지우고, 고쳐 쓰는 방법이 차례로 나왔다.
마스크 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가 리셋되면 정해진 주소에서 첫 명령을 읽는다.
옛 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, 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이나 플래시에 세이브했다.
문제는 주소 공간이다. NES의 CPU는 16비트 주소로 64KiB만 볼 수 있고, 그중 카트리지 ROM에 내준 창은 $8000부터 $FFFF까지 32KiB다(CPU 메모리 맵). 게임이 커지자 카트리지에 매퍼(mapper)라는 칩을 넣어 뱅크 전환(bank switching)을 했다. ROM을 같은 크기의 뱅크로 나누고, CPU가 매퍼의 레지스터에 번호를 쓰면 창에 보이는 뱅크가 바뀐다(NESdev 매퍼). 가장 단순한 UxROM은 $8000–$BFFF에 고른 16KiB 뱅크를, $C000–$FFFF에 마지막 뱅크를 늘 보인다. 리셋 직후 실행할 코드와 뱅크를 바꾸는 코드가 늘 보여야 하기 때문이다.
ROM $1C010는 뱅크 7, 늘 보이는 고정 뱅크라 바꾸지 않고 CPU 주소 $C010에서 읽는다.
게임보이도 같은 방법을 쓴다. 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과 세이브·설정용 메모리가 더해진다.
나뉘어 있다는 것이 실제로 차이를 만든 이야기가 있다. 캡콤의 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).
- MRAM·FeRAM: 자기 터널 접합(MRAM)이나 강유전체(FeRAM)로 비트를 담아, RAM처럼 바이트 단위로 빨리 쓰면서 꺼도 남는다. 용량이 작고 비싸 마이크로컨트롤러, 산업 장비, 자주 기록하는 로그 같은 곳에 쓴다.
- CXL 메모리: PCIe의 물리 계층 위에 캐시 일관성을 얹은 CXL로 서버에 DRAM을 더 붙이거나 여러 서버가 메모리를 나눠 쓴다. 휘발성 DRAM이지만 메인보드 슬롯 밖, 카드나 별도 장치에 있어 로컬 DRAM보다 조금 느린 한 층이 더 생긴다.
그래도 두 질문은 여전히 유효하다. 꺼도 남는가, 그리고 CPU가 바이트 단위로 바로 읽는가. 새 기술은 이 둘의 조합을 새로 고르는 시도로 보면 이해하기 쉽다.
정리와 핵심 자료
처음 보는 기억장치는 세 질문으로 자리를 찾는다. 전원을 끄면 사라지면 RAM이다. 남으면서 만든 뒤 고칠 수 없으면 진짜 ROM이다. 고쳐 쓸 수 있으면 CPU가 바이트 단위로 바로 읽는지(펌웨어 칩), 블록 단위로 가져오는지(저장장치)를 본다. 이름에 붙은 "ROM"보다 이 답이 그 부품의 실체다.
- 계층과 RAM: Memory hierarchy, DRAM, Memory refresh
- ROM의 계보: Read-only memory, EPROM, Flash memory
- 게임 하드웨어: NESdev Wiki, Pan Docs, The World Warrier
저장장치 쪽의 이야기는 저장장치 노트와 블록·파일·오브젝트 스토리지로 이어진다.
- Random-access memory — Wikipedia
- Memory hierarchy — Wikipedia
- Latency Numbers Every Programmer Should Know — Colin Scott
- Static random-access memory — Wikipedia
- Dynamic random-access memory — Wikipedia
- Memory refresh — Wikipedia
- Read-only memory — Wikipedia
- Mask ROM — Wikipedia
- Programmable ROM — Wikipedia
- EPROM — Wikipedia
- EEPROM — Wikipedia
- Flash memory — Wikipedia
- UEFI — Wikipedia
- Option ROM — Wikipedia
- coreboot Documentation — coreboot
- Serial presence detect — Wikipedia
- CD-ROM — Wikipedia
- ROM image — Wikipedia
- Partitions overview — Android Open Source Project
- Mapper — NESdev Wiki
- CPU memory map — NESdev Wiki
- UxROM — NESdev Wiki
- iNES — NESdev Wiki
- Memory Map — Pan Docs
- MBCs — Pan Docs
- The Cartridge Header — Pan Docs
- Street Fighter II, The World Warrier — Fabien Sanglard
- CP System — Wikipedia
- Video game console emulator — Wikipedia
- 3D XPoint — Wikipedia
- Magnetoresistive RAM — Wikipedia
- Ferroelectric RAM — Wikipedia
- Compute Express Link — CXL Consortium