태스크 제어 블록 ( TCB, Task Control Block )
생성된 태스크와 TCB는 반드시 하나씩만 연결되어야 한다.
TCB 자료구조 정의
// 태스크의 상태를 관리하는 자료구조
typedef struct kTaskControlBlcokStruct
{
// 콘텍스트
CONTEXT stContext;
// ID와 플래그
QWORD qwID;
QWORD qwFlags;
// 스택의 어드레스와 크기
void* pvStackAddress;
QWORD qwStackSize;
} TCB;
콘텍스트 자료구조와 레지스터 오프셋 매크로
// SS, RSP, RFLAGS, CS, RIP + ISR에서 저장하는 19개의 레지스터
// 인터럽트나 예외 발생시, 프로세서가 저장하는 5개의 레지스터
#define TASK_REGISTERCOUNT ( 5 + 19 )
#define TASK_REGISTERSIZE 8
// Context 자료구조의 레지스터 오프셋
#define TASK_GSOFFSET 0
#define TASK_FSOFFSET 1
#define TASK_ESOFFSET 2
#define TASK_DSOFFSET 3
#define TASK_R15OFFSET 4
#define TASK_R14OFFSET 5
#define TASK_R13OFFSET 6
#define TASK_R12OFFSET 7
#define TASK_R11OFFSET 8
#define TASK_R10OFFSET 9
#define TASK_R9OFFSET 10
#define TASK_R8OFFSET 11
#define TASK_RSIOFFSET 12
#define TASK_RDIOFFSET 13
#define TASK_RDXOFFSET 14
#define TASK_RCXOFFSET 15
#define TASK_RBXOFFSET 16
#define TASK_RAXOFFSET 17
#define TASK_RBPOFFSET 18
#define TASK_RIPOFFSET 19
#define TASK_CSOFFSET 20
#define TASK_RFLAGSOFFSET 21
#define TASK_RSPOFFSET 22
#define TASK_SSOFFSET 23
// 콘텍스트에 관련된 자료구조
typedef struct kContextStruct{
QWORD vqRegister[ TASK_REGISTERCOUNT ];
} CONTEXT;