void start(void) { int i; // Set up hardware (schedos-x86.c) segments_init(); interrupt_controller_init(0); console_clear(); // Initialize process descriptors as empty memset(proc_array, 0, sizeof(proc_array)); for (i = 0; i < NPROCS; i++) { proc_array[i].p_pid = i; proc_array[i].p_state = P_EMPTY; } // Set up process descriptors (the proc_array[]) queue_t frontground = initQueue(); queue_t background = initQueue(); for (i = 1; i < NPROCS; i++) { process_t *proc = &proc_array[i]; uint32_t stack_ptr = PROC1_START + i * PROC_SIZE; // Initialize the process descriptor special_registers_init(proc); // Set ESP proc->p_registers.reg_esp = stack_ptr; // Load process and set EIP, based on ELF image program_loader(i - 1, &proc->p_registers.reg_eip); // Mark the process as runnable! proc->p_state = P_RUNNABLE; } // Initialize the cursor-position shared variable to point to the // console's first character (the upper left). cursorpos = (uint16_t *) 0xB8000; // Initialize the scheduling algorithm. // USE THE FOLLOWING VALUES: // 0 = the initial algorithm // 2 = strict priority scheduling (exercise 2) // 41 = p_priority algorithm (exercise 4.a) // 42 = p_share algorithm (exercise 4.b) // 7 = any algorithm that you may implement for exercise 7 scheduling_algorithm = 7; // Switch to the first process. run(&proc_array[1]); // Should never get here! while (1) /* do nothing */; }
void start(void) { int i; // Set up hardware (schedos-x86.c) segments_init(); interrupt_controller_init(1); console_clear(); // Initialize process descriptors as empty memset(proc_array, 0, sizeof(proc_array)); for (i = 0; i < NPROCS; i++) { proc_array[i].p_pid = i; proc_array[i].p_state = P_EMPTY; } // Set up process descriptors (the proc_array[]) for (i = 1; i < NPROCS; i++) { process_t *proc = &proc_array[i]; uint32_t stack_ptr = PROC1_START + i * PROC_SIZE; // Initialize proportional scheduling vars proc->p_share = 1; proc->p_run_t = 0; // Initialize the process descriptor special_registers_init(proc); // Set ESP proc->p_registers.reg_esp = stack_ptr; // Load process and set EIP, based on ELF image program_loader(i - 1, &proc->p_registers.reg_eip); // Mark the process as runnable! proc->p_state = P_RUNNABLE; } // Initialize the cursor-position shared variable to point to the // console's first character (the upper left). cursorpos = (uint16_t *) 0xB8000; // Initialize the scheduling algorithm. scheduling_algorithm = 0; // Switch to the first process. run(&proc_array[1]); // Should never get here! while (1) /* do nothing */; }