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 */; }
void start(void) { const char *s; int whichprocess; pid_t i; // 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; } // The first process has process ID 1. current = &proc_array[1]; // Set up x86 hardware, and initialize the first process's // special registers. This only needs to be done once, at boot time. // All other processes' special registers can be copied from the // first process. segments_init(); special_registers_init(current); // Erase the console, and initialize the cursor-position shared // variable to point to its upper left. console_clear(); // Figure out which program to run. cursorpos = console_printf(cursorpos, 0x0700, "Type '1' to run mpos-app, or '2' to run mpos-app2."); do { whichprocess = console_read_digit(); } while (whichprocess != 1 && whichprocess != 2); console_clear(); // Load the process application code and data into memory. // Store its entry point into the first process's EIP // (instruction pointer). program_loader(whichprocess - 1, ¤t->p_registers.reg_eip); // Set the main process's stack pointer, ESP. current->p_registers.reg_esp = PROC1_STACK_ADDR + PROC_STACK_SIZE; // Mark the process as runnable! current->p_state = P_RUNNABLE; // Switch to the main process using run(). run(current); }