같은 x86 프로세서가 서로 다른 규칙으로 일할 수 있다. 한 규칙에서는 프로그램 하나가 집 전체를 혼자 쓰는 것처럼 메모리 어디든 손댈 수 있다. 다른 규칙에서는 프로그램마다 방을 하나씩 받고 남의 방에는 못 들어간다. 앞의 것은 단순하지만 메모리가 작고 프로그램 하나가 잘못하면 전체가 무너진다. 뒤의 것은 여러 프로그램을 함께 안전하게 돌리지만, 프로그램이 하드웨어를 마음대로 만질 수 없다.
예시로 보기
요즘 컴퓨터에서는 웹 브라우저가 멈춰도 음악 프로그램은 계속 돈다. 옛 MS-DOS에서는 프로그램 하나가 잘못된 주소에 값을 쓰면 컴퓨터를 껐다 켜야 했다. 프로세서는 같은 계열인데 왜 다를까? 프로세서가 일하는 규칙, 곧 모드가 다르기 때문이다.
| 실주소 모드 | 보호 모드 | |
|---|---|---|
| 이 모드를 쓰는 운영체제 | MS-DOS | 윈도우, 리눅스 |
| 주소의 길이 | 20비트 | 32비트 |
| 쓸 수 있는 메모리 | 1MB | 4GB |
| 함께 도는 프로그램 | 하나 | 여럿 |
| 남의 메모리에 손대기 | 막지 않는다 | 막는다 |
1MB와 4GB는 주소의 길이에서 나온다. 주소가 20비트면 주소가 \(2^{20} = 1{,}048{,}576\)가지라서 1MB다. 32비트면 \(2^{32}\)가지, 곧 약 43억 바이트라서 4GB다. 4GB는 1MB의 4,096배다1.
FFFFFh), \(2^{32}\)바이트 = 4GB(끝 주소 FFFFFFFFh), 4,096배, 4GB를 4,096바이트로 나눈 쪽 수, 카드의 값 — 05_x86-operating-modes_verify.py세 가지 모드
실주소 모드 (real-address mode). MS-DOS가 원래 쓰던 모드다. 16비트 모드라고도 부른다.
- 쓸 수 있는 메모리는 많아야 1MB다.
- 응용 프로그램이 메모리의 어느 곳이든 읽고 쓸 수 있다. 프로그램 사이에 메모리를 지키는 경계가 없다.
- 한 번에 프로그램 하나만 돈다(single tasking).
- 주소의 한 부분인 오프셋이 16비트다: 실주소 모드의 세그먼트 주소.
보호 모드 (protected mode). 윈도우와 리눅스가 원래 쓰는 모드다.
- 쓸 수 있는 메모리는 4GB다. 주소로는
00000000h부터FFFFFFFFh까지다. - 프로그램마다 메모리 구역을 하나씩 받고, 그 구역은 다른 프로그램이 손대지 못하게 지켜진다. 그래서 이름이 보호 모드다.
- 여러 프로그램을 함께 돌리도록(multitasking) 만들어졌다.
보호 모드에서는 프로세서가 메모리를 4,096바이트짜리 토막으로 나눠 다루는 일을 직접 돕는다. 이 토막을 페이지라 부른다. 그 덕에 프로그램들이 쓰는 메모리의 합이 실제 메모리보다 커도 된다. 돌고 있는 프로그램의 일부는 메모리에, 나머지는 디스크에 둔다. 필요한 페이지가 메모리에 없으면 프로세서가 페이지 부재(page fault)를 알리고, 운영체제의 가상 메모리 관리자가 그 페이지를 디스크에서 올린다. 자세한 것은 페이징과 가상 메모리에 있다.
가상 8086 모드 (virtual-8086 mode). 보호 모드에 섞어 넣은 모드다. 프로그램마다 자기만의 8086 컴퓨터를 가진 것처럼 돈다. 메모리는 실주소 모드처럼 1MB, 주소는 20비트다. 8086은 실주소 모드만 있던 옛 16비트 프로세서다. 보호 모드 운영체제 위에서 옛 MS-DOS 프로그램을 돌리려고 쓴다1.
활용
- 이 과목 앞부분의 프로그램은 보호 모드의 32비트 프로그램이다. 레지스터도 주소도 32비트다: 프로그램 틀. 뒷부분의 MS-DOS·BIOS 문서들(MS-DOS 메모리 배치부터)은 실주소 모드의 16비트 프로그램을 다룬다.
- 최초의 실주소 모드 운영체제는 IBM PC용 IBM PC-DOS였다. 디지털 리서치의 CP/M에 뿌리를 두었고, 나중에 MS-DOS라는 이름으로 마이크로소프트가 가졌다.
- 보호 모드에서는 운영체제가 막기 때문에 응용 프로그램이 하드웨어를 직접 만지는 코드를 쓸 수 없는 경우가 많다: 입출력 접근 수준.
연결
- 선수: x86 레지스터
- 실주소 모드의 1MB가 어떻게 나뉘어 쓰이는가: MS-DOS 메모리 배치
- 보호 모드 안에서 운영체제와 응용 프로그램을 또 가르는 것: 사용자 모드와 커널 모드
확인 문제
C1 다음은 각각 어느 모드의 이야기인가? (가) 프로그램 하나가 다른 프로그램의 메모리에 값을 쓰려 하면 막힌다. (나) 주소가 20비트이고 한 번에 프로그램 하나만 돈다. (다) 윈도우 위에서 옛 MS-DOS 프로그램이 자기 혼자 1MB짜리 컴퓨터를 쓰는 것처럼 돈다.
답: (가) 보호 모드. (나) 실주소 모드. (다) 가상 8086 모드.
이유: (나)와 (다)는 둘 다 1MB, 20비트다. 가르는 것은 “혼자 진짜 컴퓨터 전체를 쓰는가(실주소), 보호 모드 운영체제가 그렇게 보이게 해 주는가(가상 8086)”다.
C2 실주소 모드에서는 프로그램 하나의 잘못이 왜 컴퓨터 전체를 멈추게 할 수 있는가? 보호 모드는 이것을 어떻게 막는가?
답: 실주소 모드의 응용 프로그램은 메모리 어디든 쓸 수 있고 경계를 지키는 장치가 없다. 그래서 잘못된 주소에 값을 쓰면 운영체제가 쓰는 자리까지 덮어쓸 수 있다. 보호 모드는 프로그램마다 구역을 따로 주고, 남의 구역에 손대는 것을 프로세서가 막는다.
C3 주소가 20비트, 24비트, 32비트일 때 가리킬 수 있는 메모리는 각각 얼마인가?
답: \(2^{20}\)바이트 = 1MB, \(2^{24}\)바이트 = 16MB, \(2^{32}\)바이트 = 4GB.
이유: 주소가 \(b\)비트면 서로 다른 주소가 \(2^b\)가지다. \(2^{10} = 1{,}024\)가 1K이므로 \(2^{20}\)은 1M, \(2^{30}\)은 1G다1.