1010
1111#define MAX_TASKS 64
1212#define KERNEL_STACK_SIZE 0x4000 // 16KB
13- #define USER_STACK_SIZE 0x4000 // 16KB
14- #define TIME_SLICE_DEFAULT 10 // 10 ticks
13+ #define USER_STACK_SIZE 0x4000 // 16KB
14+ #define TIME_SLICE_DEFAULT 10 // 10 ticks
1515
1616static task_t * tasks [MAX_TASKS ];
1717static task_t * current_task = NULL ;
@@ -71,7 +71,6 @@ static uint64_t create_task_page_directory(void) {
7171 pd [i ] = current_pd [i ];
7272 }
7373
74-
7574 // 物理アドレスを返す
7675 uint32_t pd_phys = vmem_virt_to_phys ((uint32_t )(uintptr_t )pd_virt );
7776 return pd_phys ;
@@ -95,8 +94,8 @@ void task_init(void) {
9594 // idle タスクは現在実行中のコンテキスト(kmain)として初期化
9695 idle_task .tid = 0 ;
9796 str_copy (idle_task .name , "idle" , sizeof (idle_task .name ));
98- idle_task .state = TASK_STATE_RUNNING ; // 既に実行中
99- idle_task .kernel_mode = 1 ; // カーネルモード
97+ idle_task .state = TASK_STATE_RUNNING ; // 既に実行中
98+ idle_task .kernel_mode = 1 ; // カーネルモード
10099 idle_task .time_slice = TIME_SLICE_DEFAULT ;
101100 idle_task .total_time = 0 ;
102101 idle_task .next = NULL ;
@@ -113,14 +112,17 @@ void task_init(void) {
113112 uint64_t current_rsp ;
114113 asm volatile ("mov %%rsp, %0" : "=r" (current_rsp ));
115114 idle_task .regs .rsp = current_rsp ;
116- idle_task .regs .rip = 0 ; // task_switch から戻る時に設定される
115+ idle_task .regs .rip = 0 ; // task_switch から戻る時に設定される
117116 idle_task .regs .rflags = 0x202 ; // IF=1 (割り込み有効)
118-
117+
119118 // 他のレジスタをゼロ初期化
120- idle_task .regs .rax = idle_task .regs .rbx = idle_task .regs .rcx = idle_task .regs .rdx = 0 ;
119+ idle_task .regs .rax = idle_task .regs .rbx = idle_task .regs .rcx =
120+ idle_task .regs .rdx = 0 ;
121121 idle_task .regs .rsi = idle_task .regs .rdi = idle_task .regs .rbp = 0 ;
122- idle_task .regs .r8 = idle_task .regs .r9 = idle_task .regs .r10 = idle_task .regs .r11 = 0 ;
123- idle_task .regs .r12 = idle_task .regs .r13 = idle_task .regs .r14 = idle_task .regs .r15 = 0 ;
122+ idle_task .regs .r8 = idle_task .regs .r9 = idle_task .regs .r10 =
123+ idle_task .regs .r11 = 0 ;
124+ idle_task .regs .r12 = idle_task .regs .r13 = idle_task .regs .r14 =
125+ idle_task .regs .r15 = 0 ;
124126
125127 // カーネルスタックは現在のスタックをそのまま使用
126128 idle_task .kernel_stack = current_rsp ;
@@ -167,15 +169,14 @@ task_t *task_create(void (*entry)(void), const char *name, int kernel_mode) {
167169 }
168170
169171 // タスク構造体を仮想アドレスに変換
170- uint32_t task_virt =
171- vmem_phys_to_virt ((uint32_t )(uintptr_t )task );
172+ uint32_t task_virt = vmem_phys_to_virt ((uint32_t )(uintptr_t )task );
172173 task = (task_t * )(uintptr_t )task_virt ;
173174
174175 // タスク構造体を初期化
175176 task -> tid = next_tid ++ ;
176177 str_copy (task -> name , name , sizeof (task -> name ));
177178 task -> state = TASK_STATE_READY ;
178- task -> kernel_mode = kernel_mode ; // カーネルモードフラグを設定
179+ task -> kernel_mode = kernel_mode ; // カーネルモードフラグを設定
179180 task -> time_slice = TIME_SLICE_DEFAULT ;
180181 task -> total_time = 0 ;
181182 task -> next = NULL ;
@@ -200,13 +201,15 @@ task_t *task_create(void (*entry)(void), const char *name, int kernel_mode) {
200201 // スタックの初期化:entry関数が戻る先としてtask_exitをpush
201202 // task_switch は ret 命令で task->regs.rip にジャンプする
202203 // entry 関数が ret で戻る時、スタックの task_exit にジャンプする
203- uint64_t * stack_ptr = (uint64_t * )kstack_virt ; // スタック最上位から開始
204- stack_ptr -- ; // 8バイト下げる
205- * stack_ptr = (uint64_t )task_exit ; // entry から戻る先
204+ uint64_t * stack_ptr =
205+ (uint64_t * )kstack_virt ; // スタック最上位から開始
206+ stack_ptr -- ; // 8バイト下げる
207+ * stack_ptr = (uint64_t )task_exit ; // entry から戻る先
206208
207209 // レジスタを初期化
208210 task -> regs .rsp = (uint64_t )stack_ptr ;
209- task -> regs .rip = (uint64_t )entry ; // task_switch が ret でここにジャンプ
211+ task -> regs .rip =
212+ (uint64_t )entry ; // task_switch が ret でここにジャンプ
210213 task -> regs .rflags = 0x202 ; // IF=1
211214 task -> regs .cr3 = current_cr3_val ;
212215 } else {
@@ -225,8 +228,7 @@ task_t *task_create(void (*entry)(void), const char *name, int kernel_mode) {
225228 return NULL ;
226229 }
227230 uint32_t ustack_virt =
228- vmem_phys_to_virt ((uint32_t )(uintptr_t )ustack ) +
229- 0x1000 ;
231+ vmem_phys_to_virt ((uint32_t )(uintptr_t )ustack ) + 0x1000 ;
230232 task -> user_stack = ustack_virt ;
231233
232234 // レジスタを初期化
@@ -245,8 +247,8 @@ task_t *task_create(void (*entry)(void), const char *name, int kernel_mode) {
245247 tasks [slot ] = task ;
246248
247249#ifdef INIT_MSG
248- printk ("task_create: Created task '%s' (TID=%u)\n" ,
249- name , (unsigned )task -> tid );
250+ printk ("task_create: Created task '%s' (TID=%u)\n" , name ,
251+ (unsigned )task -> tid );
250252#endif
251253
252254 return task ;
@@ -304,7 +306,8 @@ void task_schedule(void) {
304306
305307 // 次のタスクがなければidleタスクに戻る(現在のタスクがDEADまたはidleでない場合)
306308 if (!next_task ) {
307- if (current_task -> state == TASK_STATE_DEAD || current_task != & idle_task ) {
309+ if (current_task -> state == TASK_STATE_DEAD ||
310+ current_task != & idle_task ) {
308311 next_task = & idle_task ;
309312 } else {
310313 // 現在のタスクがidleで、他に実行可能なタスクがない場合は継続
0 commit comments