태스크 상태 세그먼트
Task state segmentTSS(Task State Segment)는 태스크에 대한 정보를 저장하는 x86 기반 시스템의 구조다.운영 체제 커널에서 태스크 관리를 위해 사용한다.특히, TSS에는 다음과 같은 정보가 저장되어 있다.
- 프로세서 레지스터 상태
- I/O 포트 권한
- 내부 레벨 스택 포인터
- 이전 TSS 링크
이 모든 정보는 IA-32 설명서에 명시된 TSS 내의 특정 위치에 저장해야 한다.
TSS 위치
TSS는 메모리의 어느 곳에나 존재할 수 있다.작업 레지스터(TR)라는 세그먼트 레지스터에는 GDT(TSS 설명자가 LDT에 존재하지 않을 수 있음)에 있는 유효한 TSS 세그먼트 설명자를 가리키는 세그먼트 선택기가 있다.따라서 TSS를 사용하려면 운영 체제 커널에서 다음 작업을 수행해야 한다.
- GDT에 TSS 설명자 항목 만들기
- 해당 세그먼트에 대한 세그먼트 선택기와 함께 TR 로드
- 필요에 따라 메모리의 TSS에 정보 추가
보안을 위해 TSS는 커널에서만 액세스할 수 있는 메모리에 배치해야 한다.
작업 레지스터
TR 레지스터는 TSS용 세그먼트 선택기를 고정하는 16비트 레지스터다.LTR 지침을 통해 로드할 수 있다.LTR은 특권적인 지침이며 다른 세그먼트 레지스터 부하와 유사한 방식으로 작용한다.작업 레지스터는 프로그래머가 볼 수 있고 접근할 수 있는 부분과 TSS 설명자로부터 자동으로 로드되는 보이지 않는 부분 두 부분으로 구성되어 있다.
상태 등록
TSS는 모든 x86 레지스터의 저장된 값을 포함할 수 있다.이것은 작업 전환에 사용된다.운영 체제는 새 태스크가 필요로 하는 레지스터 값을 TSS에 로드할 수 있으며 하드웨어 태스크 스위치(예: IRET 명령)를 실행한 후 x86 CPU는 TSS에서 저장된 값을 적절한 레지스터에 로드할 수 있다.Windows 및 Linux와[1] 같은 일부 최신 운영 체제는 소프트웨어 태스크 스위칭을 구현할 때 TSS에서 이러한 필드를 사용하지 않는다는 점에 유의하십시오.
하드웨어 작업 스위치 중에 새 TSS의 값을 읽기 전에 이전 TSS의 특정 필드가 CPU의 현재 레지스터 내용으로 업데이트된다는 점에 유의하십시오.따라서 일부 TSS 필드는 읽기/쓰기인 반면 다른 필드는 읽기 전용이다.
- 읽기/쓰기 필드: 하드웨어 작업 스위치 중에 읽고 쓰는 필드.
- 모든 범용 레지스터(모든 범용 레지스터)
EAX
,EBX
,ECX
,EDX
,ESI
,EDI
,EBP
,ESP
); - 모든 세그먼트 레지스터 (
CS
,DS
,ES
,FS
,GS
,SS
); - 현재 실행 상태(
EIP
,EFlags
); - 그
Link
새 TSS의 필드(작업 스위치가 다음 작업으로 인해 발생한 경우)CALL
또는INT
a보다는JMP
.
- 모든 범용 레지스터(모든 범용 레지스터)
- 읽기 전용 필드: 그림과 같이 필요한 경우에만 읽으십시오.
- 제어 레지스터 3 (
CR3
(), 페이지 디렉토리 기본 레지스터라고도 함 (PDBR
).- 하드웨어 작업 스위치 중에 읽으십시오.
- Local Descriptor Table 레지스터(로컬 설명자 테이블 레지스터)
LDTR
);- 하드웨어 작업 스위치 중에 읽으십시오.
- 세 가지 권한 수준 스택 쌍(
SS0:ESP0
,SS1:ESP1
,SS2:ESP2
);- 단계 간 읽기
CALL
또는INT
새로운 스택을 구축하기 위해
- 단계 간 읽기
- IO 포트 비트맵 포인터 (
IOPB
) 및 I/O 포트 비트맵 자체;
- 제어 레지스터 3 (
그PDBR
필드는 사실 새로운 TSS에서 가장 먼저 읽은 것이다: 하드웨어 작업 스위치는 또한 완전히 다른 페이지 테이블 매핑으로 전환될 수 있기 때문에, 다른 모든 필드(특히,LDTR
)는 새로운 매핑에 상대적이다.
I/O 포트 권한
TSS에는 현재 작업에 대한 I/O 포트 권한 비트맵에 대한 16비트 포인터가 포함되어 있다.이 비트맵은 일반적으로 작업이 시작될 때 운영 체제에서 설정하는 것으로 프로그램이 액세스할 수 있는 개별 포트를 지정한다.I/O 비트맵은 포트 액세스 권한의 비트 배열로, 프로그램에 포트에 대한 액세스 권한이 있으면 해당 비트 색인에 "0"이 저장되고 프로그램에 권한이 없으면 "1"이 저장된다.TSS의 세그먼트 한계가 전체 비트맵보다 작을 경우 모든 누락 비트는 "1"로 가정한다.
이 기능은 다음과 같이 작동한다. 프로그램이 IN 또는 OUT와 같은 x86 I/O 포트 명령을 발행할 때(x86 명령 목록 참조 - 그리고 바이트, 워드 및 워드 길이 버전이 있다는 점에 유의), 하드웨어는 프로그램이 모든 I/O 포트에 액세스할 수 있는지 확인하기 위해 I/O 권한 수준(IOPL)을 검사한다.프로그램의 현재 권한 수준(CPL)이 I/O 권한 수준(IOPL이 지정하는 것보다 권한이 적은 프로그램)보다 숫자적으로 큰 경우, 프로그램에 모든 포트에 대한 I/O 포트 액세스가 없는 경우.그런 다음 하드웨어는 TSS의 I/O 권한 비트맵을 점검하여 프로그램이 IN 또는 OUT 명령의 특정 포트에 액세스할 수 있는지 확인한다.I/O 포트 권한 비트맵의 (모든) 관련 비트가 명확하면 프로그램에 포트에 대한 액세스가 허용되고 명령이 실행될 수 있다.관련 비트가 설정/설정된 경우(들 중 하나) 또는 (들 중 하나) 비트가 TSS의 세그먼트 제한을 초과한 경우 - 프로그램에 액세스할 수 없고 프로세서가 일반 보호 장애를 생성한다.이 기능은 운영 체제가 사용자 프로그램에 선택적 포트 액세스를 허용할 수 있도록 한다.
내부 레벨 스택 포인터
TSS에는 권한 수준 변경이 발생할 때 새 스택 포인터를 지정하기 위한 6개의 필드가 포함되어 있다.SS0 필드에는 CPL=0의 스택 세그먼트 선택기가 포함되고 ESP0/RSP0 필드에는 CPL=0의 새로운 ESP/RSP 값이 포함되어 있다.보호(32비트) 모드에서 인터럽트가 발생하면 x86 CPU는 TSS에서 SS0과 ESP0을 찾아 각각 SS와 ESP로 값을 로드한다.이를 통해 커널은 사용자 프로그램과 다른 스택을 사용할 수 있으며, 또한 이 스택이 각 사용자 프로그램에 대해 고유하도록 할 수 있다.
AMD64 확장에 도입된 새로운 기능을 IST(Interrupt Stack Table)라고 하는데, 이 기능은 TSS에도 상주하며 논리적(세그먼트+오프셋) 스택 포인터를 포함하고 있다.인터럽트 설명자 테이블이 사용할 IST 항목을 지정하는 경우(8개) 프로세서는 대신 IST에서 새 스택을 로드한다.이를 통해 심각한 오류(예: NMI 또는 이중 결함) 발생 시 알려진 양호한 상태의 스택을 사용할 수 있다.이전에는 IDT의 예외 또는 인터럽트에 대한 항목이 작업 게이트를 가리키면서 프로세서가 작업 게이트가 가리키는 작업으로 전환되었다.원래의 레지스터 값은 인터럽트 또는 예외 발생 시 TSS 전류에 저장되었다.그런 다음 프로세서가 SS를 포함한 레지스터를 설정하십시오.ESP, TSS에 지정된 알려진 값으로, 선택기를 이전 TSS에 저장했다.여기서 문제는 하드웨어 작업 스위칭이 AMD64에서 지원되지 않는다는 것이다.
이전 TSS 링크
이 TSS를 이전 TSS와 연결할 수 있는 16비트 선택기 입니다.이것은 하드웨어 작업 스위칭에만 사용된다.자세한 내용은 IA-32 설명서를 참조하십시오.
Linux에서 TSS 사용
시스템에서 실행되는 각 태스크에 대해 TSS를 생성할 수 있지만 리눅스 커널은 CPU당 하나의 TSS만 생성하고 이를 모든 태스크에 사용한다.이 접근방식은 다른 아키텍처(예: AMD64 아키텍처는 하드웨어 작업 스위치를 지원하지 않음)에 대한 이식성과 성능 및 유연성 향상을 제공하기 때문에 선택되었다.리눅스는 TSS의 I/O 포트 권한 비트맵과 내부 스택 기능만 사용한다. 다른 기능은 리눅스 커널이 사용하지 않는 하드웨어 작업 스위치에만 필요하다.[2]
x86 예외 벡터 10을 유효하지 않은 TSS 예외(#TS)라고 한다.TSS 액세스에 문제가 발생할 때마다 프로세서에 의해 발급된다.예를 들어 CPL=3에서 인터럽트가 발생하고 CPL=0으로 제어권을 이전하는 경우 TSS는 스택 스위치에 대한 SS0과 ESP0/RSP0을 추출하는 데 사용된다.작업 레지스터에 불량 TSS 선택기가 있으면 #TS 결함이 발생한다.유효하지 않은 TSS 예외는 정상적인 운영 체제 운영 중에 발생해서는 안 되며 커널 버그 또는 하드웨어 장애와 항상 관련된다.
TSS 예외에 대한 자세한 내용은 IA-32 매뉴얼의 볼륨 3a 6장을 참조하십시오.[3]
x86-64 모드의 TSS
x86-64 아키텍처는 하드웨어 작업 스위치를 지원하지 않는다.그러나 TSS는 64비트 확장 모드로 실행되는 기계에서 여전히 사용될 수 있다.이러한 모드에서 TSS는 다음과 같이 저장할 때 여전히 유용하다.
- 각 권한 수준에 대한 스택 포인터 주소.
- 인터럽트 스택 테이블에 대한 포인터 주소(위의 내부 수준 스택 포인터 섹션에서는 이러한 필요성에 대해 설명).
- IO 권한 비트맵의 오프셋 주소.
또한 이러한 모드에서 태스크 레지스터는 64비트 기본 주소를 보유할 수 있도록 확장된다.
참조
- ^ Bovet, Daniel Pierre; Cesatí, Marco (2006). Understanding the Linux Kernel, Third Edition. O'Reilly Media. p. 104. ISBN 978-0-596-00565-8. Retrieved 2009-11-23.
- ^ Daniel P. Bovet; Marco Cesati (2006). Understanding the Linux Kernel. books.google.com. O'Reilly. p. 104. ISBN 9780596554910. Retrieved 2014-02-25.
- ^ "Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3a". Retrieved 21 May 2012.