본문 바로가기

운영체제 정리/64비트 OS 만들기 실습

[64비트 멀티코어 OS 원리와 구조] 6장 - 32비트 보호모드로 전환하자

6.1 세그먼트 디스크립터 생성

- 세그먼트 디스크립터란, 세그먼테이션 기법에서 세그먼트 (메모리 공간을 임의의 크기로 나눈 영역)의 정보를 나타내는 자료구조.

- 리얼 모드의 세그먼트 레지스터라는 명칭이 보호 모드에서 세그먼트 셀렉터라는 이름으로 바뀜.

 

세그먼트 디스크립터

- 코드 세그먼트 디스크립터: 실행 가능한 코드가 포함된 세그먼트에 대한 정보. CS 세그먼트 셀렉터에 사용됨

- 데이터 세그먼트 디스크립터: 데이터가 포함된 세그먼트에 대한 정보. CS 세그먼트 셀렉터 제외 나머지 셀렉터에 사용 가능

 

- 우리 OS에서 필요한 세그먼트

  ㄴ 커널 코드와 데이터용 세그먼트 디스크립터 각 1개

  ㄴ 커널 코드와 데이터용 세그먼트 디스크립터는 0 ~ 4GB까지 모든 영역에 접근할 수 있어야 함

  ㄴ 보호 모드용 코드와 데이터에 사용할 기본 오퍼랜드 크기는 32비트여야 함

  ㄴ 보호 기능은 사용하지 않고, 프로세서의 명령 제약이 없어야 해서 최상위로 전환 (0)

 

보호 모드의 세그먼트 디스크립터 필드와 타입 설정

- 추후 추가 예정

 

내가 궁금해서 찾은 내용들

1. 왜 세그먼트 레지스터라는 명칭이 보호 모드에서 세그먼트 셀렉터라는 이름으로 바뀌었나?

더보기

리얼모드(Real Mode)와 보호모드(Protected Mode)는 x86 아키텍처에서 사용되는 두 가지 중요한 운영 모드입니다. 이들 모드는 주로 인텔 80386 프로세서 이후부터 사용되기 시작한 모드들입니다.

1. 리얼모드(Real Mode):
리얼모드는 초기 x86 아키텍처의 실행 모드로, 인텔 8086과 8088 프로세서부터 시작하여 80386 프로세서 이후까지 사용되었습니다. 이 모드에서는 시스템이 16비트 주소 버스를 사용하며, 최대 1MB의 메모리만 직접 접근할 수 있습니다. 주소 버스가 16비트이므로 주소 공간은 2^16(64KB)로 제한됩니다. 이러한 제약 때문에 메모리 관리가 비교적 간단하며, 코드와 데이터를 함께 사용하는 세그먼테이션(segmentation) 메모리 모델이 사용됩니다.

2. 보호모드(Protected Mode):
보호모드는 인텔 80386 프로세서 이후부터 사용되기 시작한 모드로, 현대적인 운영체제들이 사용하는 모드입니다. 이 모드에서는 32비트 주소 버스를 사용하여 최대 4GB의 메모리를 직접 접근할 수 있습니다. 보호모드에서는 세그먼테이션(segmentation)과 페이징(paging) 기능을 사용하여 메모리 관리를 보다 유연하고 안전하게 수행할 수 있습니다. 또한, 다중 사용자 및 다중 작업 환경에서 각각의 프로세스를 보호하고 격리시킬 수 있습니다.

이제 "세그먼트 셀렉터(Segment Selector)"라는 용어에 대해 설명해보겠습니다.

보호모드에서는 메모리를 관리하기 위해 각각의 메모리 세그먼트에 대해 세그먼트 디스크립터(Segment Descriptor)라는 특별한 데이터 구조를 사용합니다. 이 세그먼트 디스크립터에는 해당 세그먼트의 범위와 접근 권한 등의 정보가 포함되어 있습니다. 세그먼트 디스크립터의 정보를 사용하여 운영체제는 보호모드에서 프로세스의 메모리 접근을 제어합니다.

세그먼트 디스크립터를 선택하려면 세그먼트 셀렉터를 사용합니다. 세그먼트 셀렉터는 인덱스 값으로 특정 세그먼트 디스크립터를 가리키며, 이를 통해 프로세스가 접근할 수 있는 메모리 영역을 지정합니다. 즉, 세그먼트 셀렉터는 특정 메모리 세그먼트를 선택하는데 사용되므로 "세그먼트 셀렉터"라고 불립니다.

따라서, 보호모드에서 세그먼트 디스크립터를 선택하기 위해 사용되기 때문에 세그먼트 셀렉터라고 불리는 것입니다. 리얼모드에서도 세그먼트 레지스터가 사용되지만, 보호모드에서의 의미와 기능이 다르기 때문에 이를 명확히 구분하여 부르는 것입니다.

 

6.2 GDT 정보 생성

- GDT: 연속된 디스크립터의 집합. 맨 앞에 널 디스크립터 (모든 필드가 0으로 초기화된 디스크립터)

- GDT 정보를 저장하는 자료 구조의 기준 주소는 32비트. 어드레스 0을 기준으로 하는 실행 주소. GDT의 시작 어드레스를 실제 메모리 공간상의 어드레스로 변환할 필요가 있음

 

6.3 보호 모드로 전환

- 보호 모드로 전환하기 위해서는 아래 3가지 단계를 따르면 됨

  1. GDTR 레지스터 설정

  2. CR0 컨트롤 레지스터 설정

  3. jmp 명령 수행

 

6.4 보호 모드용 커널 이미지 빌드와 가상 OS 이미지 교체

- 위 1,2,3의 내용을 합쳐서 어셈블리 코드를 짜면 됨 (책 내용 참고)

 

 

 

참고:

https://product.kyobobook.co.kr/detail/S000001223755

 

64비트 멀티코어 OS 원리와 구조 1 | 한승훈 - 교보문고

64비트 멀티코어 OS 원리와 구조 1 | 부트 로더에서 GUI까지, 운영체제의 모든 것을 직접 제작한다!OS 개발 60일 프로젝트『64비트 멀티코어 OS 원리와 구조』제1권. 이 책은 저자가 직접 OS를 개발하

product.kyobobook.co.kr

저자 깃허브:

https://github.com/kkamagui/mint64os-examples

 

GitHub - kkamagui/mint64os-examples: "64비트 멀티코어 OS 원리와 구조" 의 예제 소스 코드

"64비트 멀티코어 OS 원리와 구조" 의 예제 소스 코드. Contribute to kkamagui/mint64os-examples development by creating an account on GitHub.

github.com