반응형
세그먼트 셀렉터
논리 주소를 선형 주소로 빠르게 변환하기 위해 인텔 프로세서는 여섯 개의 프로그래밍 가능한 세그먼테이션 레지스터 각각에 프로그래머가 설정할 수 없는 레지스터를 추가로 제공한다.
이 레지스터는 각각 자신과 연계된 세그먼테이션 레지스터에 들어 있는 세그먼트 셀렉터가 지정한 8바이트 크기의 세그먼트 디스크립터를 포함한다. 세그먼트 셀렉터를 세그먼테이션 레지스터로 로드할 때마다 해당 세그먼트 디스크립터를 메모리에서 대응하는 프로그래밍 불가능한 CPU 레지스터로 로드한다. 이때부터 이 세그먼트를 참조하는 논리 주소 변환은 주 메모리에 저장된 GDT나 LDT에 접근하지 않고도 수행할 수 있게 된다. 프로세서는 세그먼트 디스크립터를 포함한 CPU 레지스터를 직접 참조하면 된다. GDT나 LDT에 직접 접근하는 것은 세그먼테이션 레지스터의 내용이 바뀌었을 때에만 필요하다.
각 세그먼트 셀렉터는 아래 필드를 포함한다.
- GDT나 LDT에 들어 있는 세그먼트 디스크립터 엔트리를 구별하는 13비트 크기의 인덱스
- TI 플래그, 세그먼트 디스크립터가 GDT에 있는지 LDT에 있는지 나타낸다
- 2비트의 RPL 필드, 해당 세그먼트 셀렉터를 cs 레지스터로 로드했을 때 현재 권한 수준이 되는 값
세그먼트 디스크립터는 8바이트 크기기에 GDT나 LDT에 있는 상대 주소는 세그먼트 셀렉터의 상위 13비트 인덱스에 8을 곱하면 된다.
GDT의 첫째 엔트리는 항상 0으로 설정한다. 빈 세그먼트 셀렉터에 해당하는 논리 주소를 무효로 취급해 프로세서 예외를 발생시킨다. GDT에 저장할 수 있는 최대 세그먼트 개수는 8191개이다.
세그먼테이션 유닛
세그먼테이션 유닛은 아래 일을 한다.
- 세그먼트 셀렉터의 TI 필드를 검사하여 세그먼트 디스크립터가 어떤 디스크립터 테이블에 들어있는지 확인한다. TI 필드는 디스크립터가 GDT에 있는지, 아니면 현재 활성화된 LDT에 있는지를 나타낸다.
- 세그먼트 셀렉터의 index 필드로 세그먼트 디스크립터 주소를 계산한다. index 필드에 세그먼트 디스크립터의 크기인 8을 곱하고, 이 결과를 gdtr이나 ldtr 레지스터 내용에 더한다.
- 세그먼트 디스크립터의 Base 필드에 논리 주소의 오프셋을 더하여 선형 주소를 얻는다.
세그먼테이션 레지스터와 연계된 프로그래밍 불가능한 레지스터 덕에 위 두 작업은 세그먼테이션 레지스터가 바뀐 경우에만 수행한다.
반응형
'현생 > 리눅스 커널' 카테고리의 다른 글
하드웨어 세그먼테이션 - 1 (0) | 2024.08.25 |
---|---|
세 종류의 메모리 주소 (0) | 2024.08.24 |
유닉스 커널 개요 - 3. 메모리 관리 (0) | 2024.08.23 |
유닉스 커널 개요 - 2. 시그널, 프로세스 간 통신, 프로세스 관리 (0) | 2024.08.22 |
유닉스 커널 개요 - 1. 커널, 프로세스와 동기화 (0) | 2024.08.21 |