OS 커널의 구조와 원리 : 3. Protected Mode로 변환

멀티태스킹 기능으로 여러 프로세스를 동시에 동작시키는 것, 메모리 페이징 시스템을 구현하여 적은 양의 메모리를 효율적으로 관리하는 것 등은 모두 Protected Mode에서 이루어진다. PC에 전원이 들어간 후 CPU의 초기 모드인 Real Mode와는 달리 Protected Mode로는 작성된 프로그램을 통해서 몇몇의 설정을 행한 뒤에 들어가야 한다.

16비트 Real Mode

Real Mode는 PC가 부팅할 때 맨 처음 동작하는 CPU 모드이다. 이 모드는 16비트로 동작하기 때문에 모든 레지스터를 16비트의 형태로 사용한다.

AX, BX, CX, DX 등과 같은 레지스터들은 모두 16비트의 한 개의 WORD로 되어 있고, 최대 저장할 수 있는 수는 64K(10진수 65535, 16진수 0xFFFF)뿐이다.

그리고, 인텔 X86 계열의 CPU에서는 프로그래머가 RAM 상의 어떤 주소에 접근하고 싶을 때 레지스터에 그 수를 바로 넣어 사용할 수 없고, 반드시 세그먼트:오프셋 방식으로 두 개의 레지스터를 사용하여 주소에 접근한다.

16비트 Real Mode에서도 당연히 세그먼트 레지스터, 오프셋 레지스터 모두 16비트 값밖에는 취할 수 없다.

 

Protected Mode

Protected Mode에서 주소 지정을 하기  위해서는 Real Mode ~ Protected Mode 전환 전에 미리 하나의 테이블(GDT : Global Descriptor Table)을 준비해야 한다. 이 테이블은 어떤 형식이 있는 데이터의 나열이고, RAM 영역 중 어디든지 기입해 놓을 수 있다.

이 테이블에는 각 세그먼트 영역에 대해 이것들을 어떻게 사용할 것이지에 대해 설명해 놓는다. 이것은 “커널이 이제부터 메모리를 어떻게 사용하겠다”라고 하는 설계서와 흡사한 것이다.

테이블을 구성하는 각각의 요소들에는 하나의 세그먼트를 표현하기 위해서 Base Address, Limit, 속성의 정보를 넣어둔다. 하나의 요소를 지칭하여 디스크립터(Descriptor)라고  부르고, 여러 개의 디스크립터를 모아두었다고 하여 GDT-디스크립터 테이블이라고 하는 것이다.

Base Address란 Real Mode에서 CS 레지스터에 세그먼트가 시작 주소를 넣어두는 것과 같은 것이며, 이 세그먼트의 시작을 나타낸다. CPU는 프로그래머의 명령에 따라서 테이블에서 Base Address를 찾아내서 CS, DS 등의 레지스터에 넣어둔다.

 

Protected Mode 의 장점

1. Limit 값을 최대 0xFFFFFFFF까지 지정할 수 있으므로 Base Address를 0으로 지정한다면 최대 4GB의 영역을 오프셋을 가지고 마음대로 지정할 수 있다.
Real Mode에서는 오프셋을 16비트로 0x0000 ~ 0xFFFF까지밖에 지정할 수 없었다는 것을 생각하면 오프셋으로 매우 자유롭게 프로그램을 이동시키거나 데이터를 읽어올 수 있다는 편리함이 있다는 것을 알 수 있다.

2. 위에서 오프셋을 마음대로 지정할 수 있다는 설명을 했으나, 때에 따라서는 DPL 값을 조작하여 커널 시스템 영역으로 유저 영역의 어플리케이션 프로그램이 접근하지 못하도록 하거나, 코드/데이터 세그먼트를 분리시켜 코드를 데이터로서 읽거나 쓰지 못하도록 막아놓을 수도 있다.

3. Protected Mode의 GDT의 각 디스크립터에는 각 세그먼트의 시작 주소를 물리 주소롤 지정할 수 있다. GDT에는 상당히 많은 세그먼트를 지정할 수 있고, 시작 주소를 루리 주소 값으로 직접 넣기 때문에 1Byte 단위로 지정할 수 있다.

 

GDT

디스크립터의 모습

 

 

 

OS 커널의 구조와 원리 : 2. 커널을 로드한다.

PC에 전원이 들어오고 POST 과정이 끝난 후에는 OS 커널을 로드하는 과정이 실행된다. 커널의 로드는 모든 OS에서 비슷한 과정을 수행한다. 디스크의 MBR 이라는 좁은 곳에 커널 전체를 넣을 수는 없다. 따라서 모든 OS에서는 MBR에 있는 프로그램으로 하여금 디스크의 뒷부분을 RAM으로 더 읽어들이게 한 후 그 읽어들인 곳을 부터 프로그램을 점프시키는 방법을 사용한다.

 

 

 

OS 커널의 구조와 원리 : 1. 부트 스트랩

Real Mode 와 Protected Mode

Real Mode란 머퓨터에 전원이 들어온 후 CPU가 처음 움직이기 시작하면서 활동하는 모드. 리얼모드에서는 프로그램이 한 번에 한 개씩밖에 동작하지 못한다. 그리고, 한 프로그램은 현재 컴퓨터가 가지고 있는 램의 모든 영영ㄱ을 자기 마음대로 사용할 수 있다.

프로그램이 C 언어 함수 while(); 등으로 무한루프를 돌리면 도중에 사람이 인터럽트를 걸어서 멈추기 전에는 어느 다른 프로그램도 실행시킬 수 없기도 하고, 램 영역의 모든 부분에 접근할 수 있었기 때문에 DOS의 중요한 시스템 영역을 실수로든 악의로든 망쳐놓아 컴퓨터가 제대로 작동을 못하게 되는 경우도 허다했다. 현재는 하드웨어의 제어가 간단하다는 이유 등으로 제어용으로 사용하거나 하는 특별한 경우를 제외하고는 DOS는 거의 사용되지 않는다.

그런데 이 Real Mode를 아직까지 사용하고 있는 이유는 예전에 사용되던 8086 CPU용의 DOS 프로그램을 현재에도 계속 사용할 수 있도록 하는 호환성 문제 때문이다. 486을 사용하든지 Pentium을 사용하든지 리얼 모드가 동작하고 있을 때에는 CPU가 모두 하드웨어적으로 8086이 되어 있다고 생각하고 프로그램을 작성해야 한다. 따라서 모든 커널은 컴퓨터에 전원이 들어온 후 리얼 모드에서 여러 가지 하드웨어적인 세팅을 마친 후 프로텍티드 모드로 CPU를 전환한다.

Protected Mode란 현재 많이 사용되고 있는 Microsoft Windows나 Linux가 CPU에서 동작되고 있는 모드이다. 이 모드에서는 모든 프로그램이 한꺼번에 동작한다. 정확히 얘기하면 Protected Mode에서는 유저모드와 커널 모드의 두 가지 모드로 다시 나뉘어지는데, 프로그램들은 실행하는 도중 아직 끝나지 않은 상태에서 CPU가 갑자기(정해진 루틴에 의하여) 커널 모드로 들어가면서 커널의 루틴에 의해 멈추어지게 되고, 다른 프로그램이 이 커널의 루틴에 의해 길행되는 식으로 순서대로 조금씩 조금씩 실행된다. 그리고 각 프로그램이 사용할 수 있는 램의 영역도 커널의 루틴에 의해 정해지게 되고, 더 필요하면 커널 모드로 들어가서 요청하여 허락을 받고 얻어오는 방식을 취한다. 당연히 커널 모드의 영역은 유저 모드 프로그램에서는 정해진 루트 외에는 접근을 할 수 없다.

말하자면 모든 프로그램이 CPU를 공평히 사용하여 CPU시간이라는 소중한 자원의 낭비를 없애고 메모리를 아무렇게나 사용하지 않도록 해서 메모리 낭비를 없애는 관리를 커널 루틴이 해주는 효율적인 것이 Protected Mode이다.

현재 사용되는 대부분의 OS는 Protected Mode에서 동작한다.