Clubcos  0.0.0
Clubcos - Clubc Operating System
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 페이지들
task.h
이 파일의 문서화 페이지로 가기
1 // Copyright (c) 2014, 임경현 (dlarudgus20)
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright notice, this
8 // list of conditions and the following disclaimer.
9 //
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 //
14 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 
32 #ifndef TASK_H_
33 #define TASK_H_
34 
35 #include <stddef.h>
36 #include <stdint.h>
37 #include <stdbool.h>
38 #include "linkedlist.h"
39 #include "memory_map.h"
40 
41 enum
42 {
43  TASK_QUANTUM = 20, //<! 태스크가 한번에 할당받는 CPU 시간입니다.
44 
45  MAX_TASK = 2048, //<! 태스크의 최대 갯수입니다.
46 
47  TASK_GDT_0 = 3, //<! 태스크 디스크럽터의 시작 번호입니다.
48 
49  // 1비트를 0으로 남겨둠
50  TASK_IDMASK_UNIT = MAX_TASK << 1, //<! 태스크 id 중복 방지를 위해 사용되는 시작 비트입니다.
51  // 따라서 모든 비트가 1이 될 수 없음
52  TASK_INVALID_ID = 0xffffffff, //<! 무효한 태스크 ID입니다.
53  TASK_ID_IDX_MASK = MAX_TASK - 1, //<! 태스크 ID에서 태스크 인덱스를 얻어올 때 사용되는 마스크 비트입니다.
54 
55  KERNEL_TASK_ID = 0, //<! 커널 태스크 ID입니다.
56  IDLE_TASK_ID = 1, //<! idle 태스크 ID입니다.
57 };
58 enum
59 {
60  MAX_PROCESS = 512, //<! 프로세스의 최대 갯수입니다.
61 
62  PROCESS_IDMASK_UNIT = MAX_PROCESS << 1, //<! 프로세스 id 중복 방지를 위해 사용되는 시작 비트입니다.
63  PROCESS_INVALID_ID = 0xffffffff, //<! 무효한 프로세스 ID입니다.
64  PROCESS_ID_IDX_MASK = MAX_PROCESS - 1, //<! 프로세스 ID에서 태스크 인덱스를 얻어올 때 사용되는 마스크 비트입니다.
65 
66  KERNEL_PROCESS_ID = 0, //<! 커널 프로세스 ID입니다.
67 };
68 
70 typedef enum tagTaskPriority
71 {
81 
84 
86 } TaskPriority;
87 
89 typedef struct tagTss
90 {
91  uint32_t backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
92  uint32_t eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
93  uint32_t es, cs, ss, ds, fs, gs;
94  uint32_t ldtr, iomap;
95 } Tss;
96 
100 typedef enum tagTaskFlag
101 {
106 } TaskFlag;
107 
109 typedef struct tagFpuContext
110 {
111  uint8_t data[512];
112 } __attribute__((aligned(16))) FpuContext;
113 
115 typedef struct tagProcessData
116 {
117  uint16_t *TermBuffer;
118 } ProcessData;
119 
120 // forward declaration
121 struct tagProcess;
122 
124 typedef struct tagTask
125 {
127 
129 
131  struct tagTask *WaitObj;
132 
133  uint32_t selector;
134 
137 
139 
140  FpuContext fpu_context;
141  int bFpuUsed;
142 
144  volatile uint32_t UsedCpuTime;
145 
148 
149  void *stack;
150  uint32_t stacksize;
151 
152  uint32_t id;
153 } __attribute__((aligned(16))) Task;
154 
156 typedef struct tagProcess
157 {
159 
161  Task *pMainThread;
162 
163  struct tagProcess *pParentProcess;
165 
167 
168  uint32_t **PageDirectory;
169 
174  uint32_t PageDirSize;
175 
176  uint32_t cr3;
177 
178  volatile uint32_t UsedCpuTime;
179 
180  uint32_t id;
181 
183 } Process;
184 
186 typedef struct tagTaskStruct
187 {
188  Task tasks[MAX_TASK];
189  uint32_t TaskIdMask;
190 
193  uint32_t ProcessIdMask;
194 
197 
200 
202 
203  Task *pNow;
205 
206  volatile uint32_t ProcessorLoad;
207 
208  uint32_t RemainQuantum;
209 
211 
212  bool bSSEIsExist;
213 
214  uint8_t _padding[3];
215 } TaskStruct;
216 
218 static TaskStruct * const g_pTaskStruct = (TaskStruct *)TASKSTRUCT_ADDRESS;
219 
221 void ckTaskStructInitialize(void);
222 
234 uint32_t ckTaskCreate(uint32_t eip, uint32_t esp,
235  void *stack, uint32_t stacksize,
236  uint32_t ProcessId, TaskPriority priority);
237 
243 bool ckTaskTerminate(uint32_t TaskId);
245 static inline void ckTaskExit(void) { ckTaskTerminate(g_pTaskStruct->pNow->id); }
246 
262 uint32_t ckProcessCreate(uint32_t eip, uint32_t esp,
263  void *stack, uint32_t stacksize, TaskPriority priority,
264  uint32_t **PageDirectory, uint32_t PageDirSize,
265  uint32_t cr3, ProcessData ProcData, uint32_t ParentProcessId);
266 
272 bool ckProcessTerminate(uint32_t ProcessId);
274 static inline void ckProcessExit(void) { ckProcessTerminate(g_pTaskStruct->pNow->pProcess->id); }
275 
282 bool ckTaskChangePriority(uint32_t TaskId, TaskPriority priority);
283 
289 bool ckTaskSuspend(uint32_t TaskId);
295 bool ckTaskResume(uint32_t TaskId);
296 
298 bool ckTaskSuspend_byptr(Task *pTask);
300 bool ckTaskResume_byptr(Task *pTask);
301 
306 void ckTaskJoin(uint32_t TaskId);
311 void ckProcessJoin(uint32_t ProcId);
312 
314 void ckTaskSchedule(void);
319 void ckTaskScheduleOnTimerInt(void);
320 
322 static inline Task *ckTaskGetCurrent(void) { return g_pTaskStruct->pNow; }
324 static inline uint32_t ckTaskGetCurrentId(void) { return g_pTaskStruct->pNow->id; }
325 
327 static inline Process *ckProcessGetCurrent(void) { return g_pTaskStruct->pNow->pProcess; }
329 static inline uint32_t ckProcessGetCurrentId(void) { return g_pTaskStruct->pNow->pProcess->id; }
331 static inline ProcessData *ckProcessGetData(void) { return g_pTaskStruct->pProcData; }
332 
334 static inline Task *ckTaskGetKernel(void) { return g_pTaskStruct->tasks + 0; }
336 static inline Task *ckTaskGetIdle(void) { return g_pTaskStruct->tasks + 1; }
338 static inline Process *ckProcessGetKernel(void) { return g_pTaskStruct->processes + 0; }
339 
346 static inline void ckTaskSetInitParam(void **pStackTop, void *param)
347 {
348  *pStackTop -= sizeof(void *);
349  *(void **)(*pStackTop) = param;
350  *pStackTop -= sizeof(void *);
351  *(void **)(*pStackTop) = ckTaskExit;
352 }
353 
355 static inline void ckLoadTr(uint32_t tr)
356 {
357  __asm__ __volatile__ ( "ltr (%0)" : : "r"(&tr) );
358 }
359 
360 
361 // fpu assembly function
362 
364 static inline void ckFpuFinit()
365 {
366  __asm__ __volatile__ ( "finit" );
367 }
368 
370 static inline void ckFpuFxsave(FpuContext *pFpuContext)
371 {
372  __asm__ __volatile__ ( "fxsave %0" : "=m"(*pFpuContext) );
373 }
374 
376 static inline void ckFpuFxrstor(const FpuContext *pFpuContext)
377 {
378  __asm__ __volatile__ ( "fxrstor %0" : : "m"(*pFpuContext) );
379 }
380 
381 #endif /* TASK_H_ */
LinkedListNode ChildNode
부모 프로세스가 이 프로세스를 관리하기 위해 사용하는 노드입니다.
Definition: task.h:164
bool bSSEIsExist
SSE의 사용 가능 여부입니다.
Definition: task.h:212
ProcessData * pProcData
현재 실행중인 프로세스의 data입니다. pNow->pProcess->ProcData와 동일합니다.
Definition: task.h:204
uint32_t PageDirSize
PageDirectory 의 크기입니다.
Definition: task.h:174
프로세스를 나타내는 구조체입니다.
Definition: task.h:156
uint32_t ebx
Definition: task.h:92
enum tagTaskPriority TaskPriority
태스크의 스케쥴 우선순위를 나타내는 열거형입니다.
uint32_t stacksize
이 태스크의 스택의 크기입니다. 동적으로 할당된 스택이 아닐 경우 무효한 값입니다.
Definition: task.h:150
uint32_t esp1
Definition: task.h:91
void ckProcessJoin(uint32_t ProcId)
지정된 프로세스가 종료될 때까지 기다립니다.
Definition: task.c:577
uint32_t id
이 태스크의 id입니다.
Definition: task.h:152
Task * pLastTaskUsedFPU
마지막으로 FPU를 사용한 태스크입니다.
Definition: task.h:210
LinkedListNode _node
Definition: task.h:158
uint32_t ss
Definition: task.h:93
uint8_t data[512]
Definition: task.h:111
Definition: task.h:73
bool ckTaskTerminate(uint32_t TaskId)
태스크를 종료시킵니다.
Definition: task.c:304
Definition: task.h:66
FPU 콘텍스트를 나타내는 구조체입니다.
Definition: task.h:109
이중 환형 연결 리스트의 한 노드를 나타내는 구조체입니다.
Definition: linkedlist.h:42
uint32_t stacksize
이 태스크의 스택의 크기입니다. 동적으로 할당된 스택이 아닐 경우 무효한 값입니다.
Definition: task.h:843
uint32_t ckProcessCreate(uint32_t eip, uint32_t esp, void *stack, uint32_t stacksize, TaskPriority priority, uint32_t **PageDirectory, uint32_t PageDirSize, uint32_t cr3, ProcessData ProcData, uint32_t ParentProcessId)
프로세스를 생성합니다.
Definition: task.c:257
TSS를 나타내는 구조체입니다.
Definition: task.h:89
LinkedList ReadyList[COUNT_TASK_PRIORITY]
TASK_FLAG_RUNNING 상태의 태스크의 우선순위 큐입니다.
Definition: task.h:196
TaskPriority priority
태스크의 우선순위입니다.
Definition: task.h:829
uint32_t ss2
Definition: task.h:91
태스크가 다른 작업이 완료되기를 기다리고 있습니다.
Definition: task.h:104
uint32_t fs
Definition: task.h:93
uint32_t backlink
Definition: task.h:91
Definition: task.h:55
bool ckTaskSuspend(uint32_t TaskId)
태스크를 TASK_FLAG_WAIT 상태로 만듭니다.
Definition: task.c:469
uint32_t ebp
Definition: task.h:92
uint32_t id
이 프로세스의 id입니다.
Definition: task.h:180
uint32_t ExecuteCount[COUNT_TASK_PRIORITY]
각 우선순위별로 실행된 횟수를 기록하는 배열입니다.
Definition: task.h:201
void * stack
동적으로 할당된 이 태스크의 스택입니다. NULL일 경우 정적 할당된 스택을 사용합니다.
Definition: task.h:842
Definition: task.h:75
void ckTaskScheduleOnTimerInt(void)
타이머 인터럽트가 발생했을 때 호출해 태스크를 스위칭합니다.
Definition: task.c:604
TaskPriority priority
태스크의 우선순위입니다.
Definition: task.h:136
uint32_t selector
태스크 디스크럽터 셀렉터입니다. 0이면 사용되지 않은 Task 구조체입니다.
Definition: task.h:133
Definition: task.h:74
void ckTaskStructInitialize(void)
멀티태스킹을 초기화합니다.
Definition: task.c:88
ProcessData ProcData
이 프로세스의 data입니다.
Definition: task.h:182
Definition: task.h:82
uint32_t ckTaskCreate(uint32_t eip, uint32_t esp, void *stack, uint32_t stacksize, uint32_t ProcessId, TaskPriority priority)
태스크를 생성합니다.
Definition: task.c:189
uint32_t gs
Definition: task.h:93
tagTaskPriority
태스크의 스케쥴 우선순위를 나타내는 열거형입니다.
Definition: task.h:70
struct tagProcess * pProcess
이 태스크를 가지는 프로세스입니다.
Definition: task.h:146
void ckTaskJoin(uint32_t TaskId)
지정된 태스크가 종료될 때까지 기다립니다.
Definition: task.c:554
Definition: task.h:80
Definition: task.h:64
uint32_t cs
Definition: task.h:93
uint32_t edi
Definition: task.h:92
uint32_t ss1
Definition: task.h:91
태스크를 나타내는 구조체입니다.
Definition: task.h:124
bool ckTaskSuspend_byptr(Task *pTask)
tagTask 에 대한 포인터로 ckTaskSuspend 함수를 호출합니다.
Definition: task.c:486
Definition: task.h:45
tagTaskFlag
태스크의 현재 상태를 나타내는 열거형입니다.
Definition: task.h:100
struct tagProcessData ProcessData
프로세스 별로 가지는 데이터입니다.
Definition: task.h:77
Definition: task.h:47
LinkedListNode ThreadNode
프로세스가 이 태스크를 관리하기 위해 사용하는 노드입니다.
Definition: task.h:147
Definition: task.h:63
uint32_t ss0
Definition: task.h:91
uint32_t ProcessIdMask
프로세스 id 중복 방지를 위해 사용되는 비트 마스크입니다.
Definition: task.h:193
uint32_t cr3
페이지 디렉토리의 물리 주소입니다.
Definition: task.h:176
struct tagProcess Process
프로세스를 나타내는 구조체입니다.
Task * pNow
현재 실행중인 태스크입니다.
Definition: task.h:203
int bFpuUsed
이 태스크가 최근 FPU를 사용했는지 나타내는 진위형입니다.
Definition: task.h:141
프로세스 별로 가지는 데이터입니다.
Definition: task.h:115
LinkedList ThreadList
이 프로세스가 가지는 태스크의 리스트입니다.
Definition: task.h:160
태스크가 종료된 후 idle 태스크에 의해 정리되기를 기다리고 있습니다.
Definition: task.h:105
struct tagTss Tss
TSS를 나타내는 구조체입니다.
volatile uint32_t UsedCpuTime
이 프로세스가 사용한 CPU 시간입니다.
Definition: task.h:178
uint32_t es
Definition: task.h:93
uint32_t esp0
Definition: task.h:91
LinkedList WaitList
TASK_FLAG_WAIT 상태의 태스크의 목록입니다.
Definition: task.h:198
uint32_t cr3
Definition: task.h:91
uint32_t esp
Definition: task.h:92
uint32_t esi
Definition: task.h:92
Definition: task.h:62
Definition: task.h:83
uint16_t * TermBuffer
터미널 버퍼의 linear address입니다.
Definition: task.h:117
uint32_t eip
Definition: task.h:92
LinkedListNode _node
Definition: task.h:126
uint8_t _padding[3]
Definition: task.h:214
태스크 관리 구조체입니다.
Definition: task.h:186
이중 환형 연결 리스트 구조체입니다.
Definition: linkedlist.h:51
void * stack
동적으로 할당된 이 태스크의 스택입니다. NULL일 경우 정적 할당된 스택을 사용합니다.
Definition: task.h:149
uint32_t eflags
Definition: task.h:92
uint32_t ds
Definition: task.h:93
uint32_t RemainQuantum
태스크 스위칭까지 남은 CPU 시간입니다.
Definition: task.h:208
enum tagTaskFlag TaskFlag
태스크의 현재 상태를 나타내는 열거형입니다.
태스크가 현재 실행 중입니다.
Definition: task.h:102
Process processes[MAX_PROCESS]
프로세스의 배열입니다.
Definition: task.h:192
TaskFlag flag
태스크의 상태 flag입니다.
Definition: task.h:135
struct tagTask * WaitObj
이 값이 NULL이 아닐 경우 현재 태스크는 WaitObj 태스크가 종료되기를 기다리고 있습니다.
Definition: task.h:131
Definition: task.h:52
bool ckProcessTerminate(uint32_t ProcessId)
프로세스를 종료시킵니다.
Definition: task.c:388
struct tagProcess * pParentProcess
부모 프로세스입니다. 최상위 부모 프로세스이면 NULL입니다.
Definition: task.h:163
uint32_t esp2
Definition: task.h:91
void ckTaskSchedule(void)
CPU 시간을 양보하고 다른 태스크로 스위칭합니다.
Definition: task.c:597
Definition: task.h:43
Task * pMainThread
이 프로세스의 메인 태스크입니다. NULL이면 idle에서 정리해주기를 기다리고 있습니다.
Definition: task.h:161
volatile uint32_t ProcessorLoad
현재 프로세스 점유율입니다. 단위는 입니다.
Definition: task.h:206
#define TASKSTRUCT_ADDRESS
TaskStruct 구조체의 선형 주소입니다.
Definition: memory_map.h:67
Task tasks[MAX_TASK]
태스크의 배열입니다.
Definition: task.h:188
bool ckTaskChangePriority(uint32_t TaskId, TaskPriority priority)
태스크의 스케쥴 우선순위를 변경합니다.
Definition: task.c:443
LinkedList ChildProcessList
자식 프로세스의 리스트입니다.
Definition: task.h:166
uint32_t edx
Definition: task.h:92
volatile uint32_t UsedCpuTime
이 태스크가 사용한 CPU 시간입니다.
Definition: task.h:144
struct tagFpuContext __attribute__((aligned(16))) FpuContext
FPU 콘텍스트를 나타내는 구조체입니다.
Definition: task.h:79
uint32_t eax
Definition: task.h:92
Definition: task.h:72
Definition: task.h:78
FpuContext fpu_context
태스크의 FPU 콘텍스트입니다.
Definition: task.h:140
uint32_t TaskIdMask
태스크 id 중복 방지를 위해 사용되는 비트 마스크입니다.
Definition: task.h:189
Tss tss
태스크의 TSS입니다.
Definition: task.h:138
bool ckTaskResume_byptr(Task *pTask)
tagTask 에 대한 포인터로 ckTaskResume 함수를 호출합니다.
Definition: task.c:534
Definition: task.h:60
Definition: task.h:56
bool ckTaskResume(uint32_t TaskId)
TASK_FLAG_WAIT 상태의 태스크를 재개시킵니다.
Definition: task.c:518
uint32_t ldtr
Definition: task.h:94
uint32_t ** PageDirectory
이 프로세스의 페이지 디렉토리의 커널 프로세스의 선형 주소입니다.
Definition: task.h:168
uint32_t iomap
Definition: task.h:94
태스크가 실행을 기다리고 있습니다.
Definition: task.h:103
Definition: task.h:76
Definition: task.h:85
uint32_t ecx
Definition: task.h:92
LinkedList WaitForExitList
TASK_FLAG_WAITFOREXIT 상태의 태스크의 목록입니다.
Definition: task.h:199
struct tagTaskStruct TaskStruct
태스크 관리 구조체입니다.
Definition: task.h:50
Definition: task.h:53
LinkedListNode WaitNode
다른 태스크가 종료되기를 기다릴 때 사용되는 노드입니다.
Definition: task.h:130
LinkedList WaitMeList
자신이 종료되기를 기다리는 태스크들의 목록입니다.
Definition: task.h:128