Skip to content

x86 real mode

KVM으로 직접 vCPU를 real mode로 부팅하면서 이해한 것들

kvm을 다루기 위해서는 ioctl을 이용하여 레지스터,vCpu 관련된 것들을 직접 조작하여 사용할 수 있다.
그러던 와중 vCpu를 실행하기 위해 레지스터를 설정하면서 알게된 내용들을 정리해본다

Real Mode

리얼모드는 호환 모드라고도 한다 이유는 1978년도에 만들어진 8086 프로세서의 동작방식을 호환하기 위해서이다

특징:

  • 물리적 메모리에 직접 접근 (가상 메모리 x )
  • 16비트 레지스터

8086은 최대 1MB(20비트) 메모리를 사용할 수 있는데, 이는 물리적으로 연결된 핀의 개수가 20 이었기 때문임

당시 레지스터는 16비트였음 -> 단독으로는 64kb 밖에 못쓴다

이를 해결하기 위해 레지스터 2개를 이용하여 20bit 를 커버 한다

  • 물리주소 = 세그먼트 레지스터 << 4 + 오프셋 레지스터
text
세그먼트 16비트 << 4 → 20비트
오프셋   16비트       → 16비트
더하기                → 최대 20비트 (주소선 20개에 딱 맞음)

여기서 사소한 문제가 있는데
같은 물리주소를 여러 세그먼트:오프셋 조합으로 표현 가능하다

text
세그먼트=0x1000, 오프셋=0x0100 → 0x10100
세그먼트=0x1001, 오프셋=0x00F0 → 0x10100 (같음)

하드웨어는 신경안쓰고 그냥 더해서 나온 20비트로 접근할 뿐이다.
이러한 메모리 주소 중첩문제는 소프트웨어 관점에서는 쉽지않다

  • 특정 세그먼트를 보호하려고 해도 다른 세그먼트 조합으로 접근 가능하기 때문

CR0 레지스터

CR0(Control Register 0)는 CPU 동작 모드를 제어하는 특수 레지스터이다

여기서 bit 0은 PE(Protection Enable) 상태를 나타내는 비트인데
이 값을 0으로하면 real mode를 사용하게 된다.

그래서 현대 컴퓨터에서는 초기에는 real mode로 부트로더가 돌고 커널을 올린 뒤 CR0의 PE 비트를 1(Protection)으로 켜서 보호모드로 진입하게 된다