[OS 개발 8] 32비트 커널 로더(2) - 리얼 모드와 보호 모드


32비트 보호모드로의 전환


전 포스팅에서 마지막에 16비트 모드에서 32비트의 전송 체계로 바꿔줘야 한다고 했습니다. 이게 무슨 의미 일까요?

 

부트로더의 개념 및 제작, 실행, 분석 포스팅에서 제작했던 부트 로더 프로그램은 사실 16비트 단위로 데이터가 처리되는 리얼 모드(Real Mode)에서 동작되고 있었습니다. 리얼 모드는 80286 이후의 x86 호환 CPU의 운영 방식입니다. 그런데 리얼 모드의 여러가지 한계, 혹은 문제로 인해 우리는 이후 커널 프로그램을 구동할 때에는 운영 모드를 바꿔줘야 합니다. 여기에서 우리는 32비트 보호 모드(Protected Mode)로 운영 모드를 전환할 것이다. 이렇게 운영 모드를 전환해줘야 하는 이유에는 여러가지가 있습니다.

 

 

 1. 앞서 레지스터 세그먼트와 오프셋 개념 포스팅으로 잠시 돌아가보면, CPU가 20비트 단위로 처리되기 때문에, 16비트 레지스터를 사용하여 처리한다고 했습니다. 그런데 여기에서 문제가 있습니다. 세그먼트:오프셋 단위의 논리주소를 사용하게 되면, 해당 세그먼트 주소 내의 주소 밖에 점프할 수 없습니다.

2. 16비트에서는 램의 물리주소를 0x100000(1MB)까지 밖에 사용할 수 없습니다. 즉 하위 메모리에서만 사용 가능합니다(예외 경우 있음).

3. 해당 세그먼트 내에서는 어떠한 메모리 주소로도 이동이 가능한데, 이에 따라 민감한 데이터를 건드릴 수 있다는 위험을 가지고 있습니다.

4. CPU가 자동으로 세그먼트와 오프셋을 물리주소로 계산해버리기 때문에 어떤 경우에는 프로그래머가 세그먼트의 시작 주소를 지정하고 싶어도 불가능한 경우가 있습니다.

5. 따라서 EAX 같은 확장 레지스터를 사용할 수 없다.

 

 

 

위 내용에서 2번의 경우를 메모리 맵을 통해 살펴보면, 메모리는 물리주소는 0x100000(1MB)을 중심으로 그 이하는 하위주소, 이상은 상위주소로 나뉩니다. 리얼 모드는 이 하위 주소에 국한되어 사용될 수 밖에 없게 됩니다. 즉, 2GB, 4GB 등의 대용량 메모리가 나오는 요즘, 1MB도 사용하지 못하는 안타까운 상황에 놓이게 되는 것이죠. 엎친데 덮친 격으로, 여기에서 실제 개발자의 프로그램을 사용할 수 있는 공간은 더욱 좁아집니다. 다음 그림을 보시죠.


 

32비트 커널 로더 메모리 맵 구조메모리 맵을 통한 리얼 모드와 보호 모드의 사용 가능 구간

 

 

 

이와 같은 이유로 커널부터 OS는 32비트 단위로 데이터를 처리하는 보호 모드를 적용해야 합니다.

그렇다면, 커널을 32비트 보호 모드에서 구동시킴으로써 어떤 효과가 있을까요?

 

 

 1. 32비트 모드에서는 메모리를 1MB를 초과해서 사용할 수 있다.

 2. 32비트 모드에서는 잘못된 기계어 명령을 접해도 오동작 하지 않도록 하는 보호 기능을 사용할 수 있다.

 3. 16비트와 32비트의 기계어 해석 방법이 달라서 16비트 모드 기계어는 32비트 모드에서 호환되지 않는다.

 4. 32비트 모드에서는 BIOS를 이용할 수 없다.

 

 

이제 32비트 보호 모드를 사용해야 하는 이유는 알았지만, 이에 앞서 나중에 구현할 커널을 메모리에서 32비트 단위로 사용하겠다 라는 명령이 필요합니다. 바로 여기에서 다음 포스팅 주제인 GDT가 사용됩니다. 다음 포스트에서 이에 대해 좀 더 구체적으로 살펴보도록 하겠습니다.

 



TAGS.

Comments