CMOS Memory Map
CMOS는 IBM PC/AT 계열 호환기종에서 실시간 시계(RTC)와 BIOS 설정값을 저장하기 위해 사용되는 배터리 백업 RAM이다. 일반적으로 64바이트 또는 128바이트 크기를 가지며, RTC 칩 내부의 RAM 영역으로 존재한다.
PC/AT 이후에는 Motorola MC146818 또는 호환 RTC 칩이 메인보드에 탑재되면서 CMOS RAM이 시스템 구성 정보 저장용으로 널리 사용되었다. RTC 자체는 시간 유지에 일부 바이트만 사용하고, 나머지 영역은 플로피 드라이브 종류, 하드디스크 타입, 메모리 크기, 부팅 옵션, 체크섬, BIOS 제조사별 확장 설정 등에 사용된다.
개요
| 항목 |
내용
|
| 명칭 |
CMOS RAM
|
| 용도 |
RTC 시간 정보 및 BIOS 설정 저장
|
| 일반 크기 |
64바이트 또는 128바이트
|
| 접근 방식 |
I/O 포트 70h, 71h
|
| 대표 칩 |
Motorola MC146818 및 호환 RTC
|
| 배터리 |
메인보드 배터리로 내용 유지
|
접근 방법
CMOS RAM은 일반 메모리 주소 공간에 직접 매핑되어 있지 않으며, I/O 포트를 통해 접근한다.
| 포트 |
용도
|
| 70h |
CMOS 주소 선택
|
| 71h |
선택한 CMOS 주소의 데이터 읽기/쓰기
|
CMOS 값을 읽을 때는 먼저 포트 70h에 읽고 싶은 CMOS 주소를 출력한 뒤, 포트 71h에서 값을 읽는다.
10 CLS
20 FOR I = 0 TO &H7F
30 OUT &H70, I
40 PRINT USING "\ \"; HEX$(INP(&H71));
50 NEXT I
60 PRINT " "
포트 70h의 bit 7은 NMI(Non-Maskable Interrupt) 제어에 사용된다. 따라서 일부 BIOS나 프로그램은 CMOS 접근 시 bit 7 처리에 주의한다.
주소 영역 요약
| CMOS 주소 |
용도
|
| 00h-09h |
RTC 시간 및 날짜 데이터
|
| 0Ah-0Dh |
RTC 상태 레지스터
|
| 0Eh-0Fh |
진단 상태 / 리셋 코드
|
| 10h-2Dh |
PC/AT 표준 및 BIOS 제조사별 시스템 설정
|
| 2Eh-2Fh |
표준 CMOS 체크섬
|
| 30h-33h |
확장 메모리, 세기 바이트, 정보 플래그
|
| 34h-3Fh |
AMI/AWARD/Phoenix 등 BIOS별 확장 설정
|
| 40h-7Fh |
확장 CMOS 영역 또는 00h-3Fh 미러
|
RTC 영역
CMOS의 00h-0Dh 영역은 RTC 하드웨어에 의해 정의된다.
| 주소 |
이름 |
설명
|
| 00h |
Seconds |
초
|
| 01h |
Second Alarm |
초 알람
|
| 02h |
Minutes |
분
|
| 03h |
Minute Alarm |
분 알람
|
| 04h |
Hours |
시
|
| 05h |
Hour Alarm |
시 알람
|
| 06h |
Day of Week |
요일
|
| 07h |
Date of Month |
일
|
| 08h |
Month |
월
|
| 09h |
Year |
연도
|
| 0Ah |
Status Register A |
RTC 상태 레지스터 A
|
| 0Bh |
Status Register B |
RTC 상태 레지스터 B
|
| 0Ch |
Status Register C |
RTC 상태 레지스터 C
|
| 0Dh |
Status Register D |
RTC 상태 레지스터 D
|
시간 데이터 형식
시간 값은 RTC 설정에 따라 BCD 또는 바이너리 형식으로 저장된다. 이 설정은 CMOS 0Bh, 즉 RTC Status Register B의 bit 2에 의해 결정된다.
| 항목 |
설명
|
| BCD 모드 |
00-59 등의 값을 BCD 형식으로 저장
|
| Binary 모드 |
값을 일반 16진수/바이너리 값으로 저장
|
| 12/24시간 모드 |
CMOS 0Bh bit 1에 의해 결정
|
RTC 상태 레지스터
CMOS 0Ah - Status Register A
| 비트 |
설명
|
| 7 |
시간 갱신 진행 중
|
| 6-4 |
22단 분주기 설정
|
| 3-0 |
주기 인터럽트 속도 선택
|
CMOS 0Bh - Status Register B
| 비트 |
설명
|
| 7 |
갱신 사이클 제어
|
| 6 |
주기 인터럽트 활성화
|
| 5 |
알람 인터럽트 활성화
|
| 4 |
갱신 완료 인터럽트 활성화
|
| 3 |
Square wave 출력 활성화
|
| 2 |
데이터 모드. 0=BCD, 1=Binary
|
| 1 |
시간 모드. 1=24시간
|
| 0 |
일광절약시간제 활성화
|
CMOS 0Ch - Status Register C
| 비트 |
설명
|
| 7 |
인터럽트 요청 플래그
|
| 6 |
주기 인터럽트 플래그
|
| 5 |
알람 인터럽트 플래그
|
| 4 |
갱신 완료 인터럽트 플래그
|
CMOS 0Dh - Status Register D
| 비트 |
설명
|
| 7 |
Valid RAM. 배터리 전원 정상 여부
|
| 6-0 |
미사용
|
PC/AT 표준 CMOS 영역
CMOS 10h - 플로피 드라이브 타입
CMOS 10h는 A:와 B: 플로피 드라이브의 종류를 저장한다.
| 비트 |
설명
|
| 7-4 |
첫 번째 플로피 드라이브 A:
|
| 3-0 |
두 번째 플로피 드라이브 B:
|
| 값 |
드라이브 종류
|
| 00h |
없음
|
| 01h |
360KB 5.25인치
|
| 02h |
1.2MB 5.25인치
|
| 03h |
720KB 3.5인치
|
| 04h |
1.44MB 3.5인치
|
| 05h |
2.88MB 3.5인치
|
예를 들어 A:가 1.2MB 5.25인치이고 B:가 1.44MB 3.5인치이면 CMOS 10h 값은 24h가 된다.
CMOS 12h - 하드디스크 타입
| 비트 |
설명
|
| 7-4 |
첫 번째 하드디스크 타입
|
| 3-0 |
두 번째 하드디스크 타입
|
값이 0Fh인 경우 실제 확장 하드디스크 타입은 CMOS 19h 또는 1Ah에 저장된다.
CMOS 14h - Equipment Byte
CMOS 14h는 장착된 기본 장치 정보를 나타낸다.
| 비트 |
설명
|
| 7-6 |
플로피 드라이브 수
|
| 5-4 |
모니터 종류
|
| 3 |
디스플레이 활성화
|
| 2 |
키보드 활성화
|
| 1 |
수학 보조프로세서 장착 여부
|
| 0 |
플로피 드라이브 장착 여부
|
모니터 종류는 다음과 같이 해석된다.
| 값 |
설명
|
| 00b |
CGA/MDA 아님. EGA/VGA 등
|
| 01b |
40x25 CGA
|
| 10b |
80x25 CGA
|
| 11b |
MDA
|
CMOS 15h-16h - 기본 메모리 크기
| 주소 |
설명
|
| 15h |
기본 메모리 KB 단위, Low Byte
|
| 16h |
기본 메모리 KB 단위, High Byte
|
640KB 기본 메모리는 0280h로 저장되므로, CMOS 15h는 80h, 16h는 02h가 된다.
CMOS 17h-18h - 확장 메모리 크기
| 주소 |
설명
|
| 17h |
확장 메모리 KB 단위, Low Byte
|
| 18h |
확장 메모리 KB 단위, High Byte
|
하드디스크 확장 타입
| 주소 |
설명
|
| 19h |
첫 번째 확장 하드디스크 타입
|
| 1Ah |
두 번째 확장 하드디스크 타입
|
PC/AT 표준 타입 1-14를 넘어서는 하드디스크 타입은 이 영역에 저장된다. 많은 BIOS에서 마지막 타입, 예를 들어 Type 47 또는 Type 49는 사용자 정의 하드디스크로 사용된다.
체크섬 영역
| 주소 |
설명
|
| 2Eh |
표준 CMOS 체크섬 High Byte
|
| 2Fh |
표준 CMOS 체크섬 Low Byte
|
IBM PC/AT 표준에서는 CMOS 10h-2Dh 영역의 바이트 합을 2Eh-2Fh에 저장한다. 많은 호환 BIOS는 이 체크섬이 맞지 않으면 CMOS Checksum Error를 표시한다.
확장 메모리 및 세기 바이트
| 주소 |
설명
|
| 30h |
확장 메모리 KB 단위, Low Byte
|
| 31h |
확장 메모리 KB 단위, High Byte
|
| 32h |
Century Byte
|
| 33h |
Information Flag
|
CMOS 32h는 세기 값을 BCD로 저장하는 용도로 사용된다. 예를 들어 1900년대는 19h로 저장된다. 단, IBM PS/2에서는 32h-33h가 구성 CRC 용도로 사용된다.
BIOS 제조사별 차이
CMOS 10h-3Fh 영역은 IBM PC/AT 표준을 기반으로 하지만, 실제 호환기종에서는 BIOS 제조사에 따라 의미가 달라질 수 있다.
| 제조사/기종 |
특징
|
| IBM PC/AT |
표준 CMOS 배치의 기준
|
| IBM PS/2 |
일부 영역이 PC/AT 표준과 다름
|
| AMI / AMI Hi-Flex |
키보드 반복속도, 고급 설정, 캐시, 섀도우 RAM 등 저장
|
| AMI WinBIOS |
부팅 옵션, IDE/LBA, 캐시, 패스워드 관련 플래그 저장
|
| AWARD |
NumLock, IDE Block Mode, BIOS Shadow, 패스워드, 부팅 옵션 등 저장
|
| Phoenix |
하드디스크 사용자 정의 정보 및 섀도우 관련 설정 저장
|
| AMSTRAD |
PC/XT급 8086/8088 시스템에서 자체 정의 사용
|
| HP Vectra |
별도 체크섬 및 예약 영역 존재
|
64바이트 CMOS와 128바이트 CMOS
초기 시스템은 64바이트 CMOS를 사용하는 경우가 많다. 이 경우 40h-7Fh 주소를 읽으면 실제 별도 영역이 아니라 00h-3Fh가 반복되어 보일 수 있다.
일부 후기 RTC 칩과 BIOS는 128바이트 CMOS를 사용하며, 40h 이후 영역을 칩셋 설정, PCI 설정, 전원 관리, 캐시 설정 등에 사용한다.
주의사항
- CMOS 값은 시스템 설정과 직접 연결되므로 임의로 변경하면 부팅 오류가 발생할 수 있다.
- CMOS 체크섬이 맞지 않으면 BIOS에서 CMOS Checksum Error를 표시할 수 있다.
- RTC 시간 영역은 갱신 중일 수 있으므로 Status Register A의 update-in-progress bit를 확인하는 것이 안전하다.
- IBM PS/2, AMSTRAD, 일부 OEM 기종은 일반 PC/AT 호환기와 CMOS 배치가 다를 수 있다.
- 배터리가 방전되면 CMOS 값이 손상되거나 초기화된다.
관련 오류
| 오류 |
의미
|
| CMOS Checksum Error |
CMOS 설정값과 체크섬이 맞지 않음
|
| CMOS Battery Low |
배터리 전압 저하
|
| Time and Date Not Set |
RTC 시간 정보 손실
|
| Equipment Configuration Error |
장착 장치 정보와 CMOS 설정 불일치
|
관련 항목
참고