실제 모드와 보호 모드
이는 메모리 변환 방법의 종류로, 실제 모드는 예전 모델에서 사용한 보호 기능이 거의 없는 주소 변환 방법이다. 메모리 주소를 20비트로 계산하여 최대 1MB의 메모리를 접근할 수 있고 주소 변환 방식은 세그먼트:오프셋 방식이다. 즉, 세그먼트 레지스터와 오프셋을 조합하여 물리적 주소를 계산한다.
반면 보호모드는 인텔 마이크로프로세서 80386 모델부터 도입된 모드로, 32비트 주소 지정이 가능하며 최대 4GB 메모리에 접근 가능하다. 보호모드의 핵심은 메모리 보호와 멀티태스킹 지원이다. 아래 내용은 보호모드와 관련된 포스팅이다.
세그먼테이션 레지스터
논리 주소는 세그먼트 식별자와 세그먼트 내 상대적인 주소를 나타내는 오프셋으로 이뤄진다. 세그먼트 식별자는 세그먼트 셀렉터라 하는 16비트 필드이고 오프셋은 32비트 필드이다.
세그먼트 셀렉터를 빨리 가져올 수 있도록 프로세서는 세그먼테이션 레지스터를 제공한다. 총 6개의 레지스터를 사용하며, 프로그램은 레지스터의 내용을 저장하고 다시 복구하는 방법을 사용해 똑같은 세그먼테이션 레지스터를 다른 용도로 재활용할 수 있다. 세그먼테이션 레지스터 중 세 가지는 특별한 용도로 사용된다.
cs | 코드 세그먼트 레지스터, 프로그램 명령어를 포함한 세그먼트를 가리킴 또, CPU의 권한 수준을 나타내는 2비트 값이 포함됨. 리눅스에서 0은 커널 모드, 3은 사용자 모드 |
ss | 스택 세그먼트 레지스터, 현재 프로그램 스택을 포함한 세그먼트를 가리킴 |
ds | 데이터 세그먼트 레지스터, 정적인 데이터와 전역 데이터를 포함한 세그먼트를 가리킴 |
세그먼트 디스크립터
세그먼트의 특징을 기술하는 8바이트의 세그먼트 디스크립터로 각 세그먼트를 표현한다. 세그먼트 디스크립터는 전역 디스크립터 테이블(GDT)나 지역 디스크립터 테이블(LDT)에 저장된다.
보통 GDT는 하나, LDT는 프로세스별 한 개씩 존재한다. gdtr 프로세서 레지스터에 주 메모리에 GDT가 위치한 주소가 들어가고, ldtr 프로세서 레지스터에는 현재 사용하는 LDT의 주소가 들어간다.
각 세그먼트 디스크립터는 다음 필드로 이뤄진다.
- Base 필드, 세그먼트가 시작하는 선형 주소를 포함한 32비트 필드
- G 플래그, 과립도를 나타내며 이 플래그가 0이면 세그먼트 크기가 바이트 단위이고 1이면 4KB 단위가 된다.
- Limit 필드, 세그먼트 길이를 바이트 단위로 나타내는 20비트 크기 필드. G가 0이면 세그먼트 크기가 1B ~ 1MB, G가 1이면 4KB ~ 4GB가 될 수 있음
- S 플래그, 0이면 세그먼트가 커널 자료 구조를 포함하는 시스템 세그먼트이고, 1이면 일반 코드나 데이터를 포함하는 세그먼트이다.
- Type 필드, 세그먼트의 종류와 접근 권한을 나타내는 4비트 필드, 코드 세그먼트, 데이터 세그먼트, 작업 상태 세그먼트, 지역 디스크립터 테이블에 관련된 디스크립터가 자주 쓰인다.
- DPL(디스크립터 권한 수준) 필드, 해당 세그먼트에 접근하는 데 필요한 최소한의 CPU 권한 수준
- 세그먼트-프레젠트 플래그, 세그먼트가 현재 주 메모리에 존재하지 않으면 0으로 설정, 리눅스에서는 세그먼트 전체를 디스크에 스왑 아웃 하지 않아 이 필드를 1로 고정함
- 세그먼트가 코드를 포함하는지, 데이터를 포함하는지에 따라 D와 B 플래그를 추가함.
- 예약된 비트 (53번 비트)는 항상 0으로 설정
'현생 > 리눅스 커널' 카테고리의 다른 글
하드웨어 세그먼테이션 - 2 (0) | 2024.08.26 |
---|---|
세 종류의 메모리 주소 (0) | 2024.08.24 |
유닉스 커널 개요 - 3. 메모리 관리 (0) | 2024.08.23 |
유닉스 커널 개요 - 2. 시그널, 프로세스 간 통신, 프로세스 관리 (0) | 2024.08.22 |
유닉스 커널 개요 - 1. 커널, 프로세스와 동기화 (0) | 2024.08.21 |