void init_multitasking() { printk(KERN_DEBUG, "[sched]: Starting multitasking system...\n"); /* make the kernel task */ task_t *task = task_create(); task->pid = next_pid++; task->pd = (page_dir_t *)kernel_dir; task->stack_end=STACK_LOCATION; task->priority = 1; task->cpu = primary_cpu; task->thread = thread_data_create(); /* alarm_mutex is aquired inside a kernel tick, so we may not schedule. */ alarm_mutex = mutex_create(0, MT_NOSCHED); kill_queue = ll_create(0); primary_queue = tqueue_create(0, 0); primary_cpu->active_queue = tqueue_create(0, 0); tqueue_insert(primary_queue, (void *)task, task->listnode); tqueue_insert(primary_cpu->active_queue, (void *)task, task->activenode); primary_cpu->cur = task; primary_cpu->ktask = task; primary_cpu->numtasks=1; /* make this the "current_task" by assigning a specific location * in the page directory as the pointer to the task. */ arch_specific_set_current_task((addr_t *)kernel_dir, (addr_t)task); kernel_task = task; /* this is the final thing to allow the system to begin scheduling * once interrupts are enabled */ primary_cpu->flags |= CPU_TASK; add_atomic(&running_processes, 1); #if CONFIG_MODULES add_kernel_symbol(delay); add_kernel_symbol(delay_sleep); add_kernel_symbol(schedule); add_kernel_symbol(run_scheduler); add_kernel_symbol(exit); add_kernel_symbol(sys_setsid); add_kernel_symbol(do_fork); add_kernel_symbol(kill_task); add_kernel_symbol(do_send_signal); add_kernel_symbol(dosyscall); add_kernel_symbol(task_pause); add_kernel_symbol(task_resume); add_kernel_symbol(got_signal); #if CONFIG_SMP add_kernel_symbol(get_cpu); #endif _add_kernel_symbol((addr_t)(task_t **)&kernel_task, "kernel_task"); #endif }
int init_kern_task() { kproclist = (struct inode *)kmalloc(sizeof(struct inode)); _strcpy(kproclist->name, "kproclist"); kproclist->mode = S_IFDIR | 0xFFF; kproclist->count=1; kproclist->dev = 256*3; rwlock_create(&kproclist->rwl); #if CONFIG_MODULES _add_kernel_symbol((addr_t)(struct inode **)&kproclist, "kproclist"); #endif return 0; }
void int_sys_init() { for(int i=0;i<MAX_INTERRUPTS;i++) { stage2_count[i] = 0; for(int j=0;j<MAX_HANDLERS;j++) { interrupt_handlers[i][j][0] = interrupt_handlers[i][j][1] = 0; } } maybe_handle_stage_2 = 0; mutex_create(&isr_lock, 0); mutex_create(&s2_lock, 0); #if CONFIG_MODULES add_kernel_symbol(register_interrupt_handler); add_kernel_symbol(unregister_interrupt_handler); _add_kernel_symbol((addr_t)interrupt_handlers, "interrupt_handlers"); #endif }