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)으로 켜서 보호모드로 진입하게 된다