Ⅰ. 개요
- 리얼 모드에서 보호모드로 전환하려면, 크게 6단계를 거쳐야 한다.
- 상위 2단계는 보호 모드 전환에 필요한 자료구조를 생성하는 단계이다.
- 나머지 4단계는 생성된 자료구조를 프로세서에 설정하는 단계이다.
- 세그먼트 디스크립터 생성 → GDT 정보 생성 → 프로세서에 GDT 정보 설정 → CR0 컨트롤 레지스터 설정 → jmp 명령으로 CS 세그먼트 셀렉터 변경과 보호 모드로 전환 → 각종 세그먼트 셀렉터 및 스택 초기화 (32bit 보호 모드) → 보호 모드 커널 실행
- 보호 모드에서 반드시 생성해야 하는 자료구조는 세그먼트 디스크립터와 GDT이다.
Ⅱ. 세그먼트 디스크립터 생성
1. 개요
- 세그먼테이션 기법에서 세그먼트의 정보를 나타내는 자료구조를 의미한다.
- 세그먼트: 메모리 공간을 임의의 크기로 나눈 영역을 의미한다.
- 세그먼트를 복잡하게 구성할수록 세그먼트 디스크립트의 수도 증가한다.
- 보호 모드의 세그먼트 디스크립터는 8byte로, 다양한 필드가 존재한다.
2. 개발 시, 설정하고자 하는 세그먼트
- 커널 코드와 데이터용 세그먼트 디스크립터 각 1개씩 생성한다.
- 커널 코드와 데이터용 세그먼트는 0~4GB까지 모든 영역에 접근할 수 있어야 한다.
- 보호 모드용 코드와 데이터에 사용할 기본 오퍼랜드 크기는 32bit여야 한다.
- 보호 기능은 사용하지 않으며, 프로세서의 명령을 사용하는데 제약이 없어야 하므로 최상위 권한(0)이어야 한다.
3. 코드 세그먼트 디스크립터와 데이터 세그먼트 디스크립터 타입 설정
- 코드 & 데이터 세그먼트를 설정하려면, S필드와 타입 필드를 조합해야 한다.
- S필드
- 코드 세그먼트와 데이터 세그먼트는 세그먼트 디스크립터이므로, S필드의 값을 1로 설정한다.
- 세그먼트 타입
- 4bit 크기의 타입 필드를 이용해서 설정한다.
- 해당 실습에서는 기본적인 세그먼트 타입만 사용하고, 코드 세그먼트는 실행/읽기 타입으로 설정한다.
- 코드 세그먼트 타입: 0x0A (Execute/Read)
- 데이터 세그먼트 타입: 0x02 (Read/Write)
4. 세그먼트의 영역 설정
- MINT64 OS의 커널 세그먼트 디스크립터는 4GB 전체 영역에 접근할 수 있어야 한다.
- 커널용 세그먼트 디스크립터의 기준 주소는 0으로 설정한다.
- 세그먼트의 크기
- 크기 필드만으로는 4GB영역을 표현할 수 없으므로 20bit의 크기를 4GB로 확장할 것이 필요한데, 이 때 사용되는 것이 “G 필드”이다.
- G필드의 값을 1로 설정하면, 크기 필드에 4KB 곱한 것이 실제 세그먼트의 크기가 된다.
- 1MB에 4KB를 곱하면, 4GB가 되므로 크기 필드와 G필드를 사용하면 메모리 전체 영역을 세그먼트 영역으로 설정할 수 있다.
5. 기본 오퍼랜드 크기와 권한 설정