void schedule(void) { struct task_struct *task_next = NULL; struct list_head *le = NULL, *last = NULL; bool intr_flag = false; local_intr_store(intr_flag); { current->need_resched = false; // 如果当前是内核调度线程在执行,就从任务链起始开始,否则从当前任务开始 le = last = (current == glb_idle_task) ? &task_list : &(current->list); for (le = le->next; le != last; le = le->next) { if (le != &task_list) { task_next = le_to_task(le); if (task_next->state == TASK_RUNNABLE) { break; } } } // 未找到可运行的任务 if (!task_next || task_next->state != TASK_RUNNABLE) { task_next = glb_idle_task; } // 时间片递增 task_next->runs_time++; if (task_next != current) { task_run(task_next); } } local_intr_restore(intr_flag); }
void free_pages(uint32_t addr, uint32_t n) { uint32_t eflag; local_intr_store(eflag); pmm_manager->free_pages(addr, n); local_intr_restore(eflag); }
uint32_t alloc_pages(uint32_t n) { uint32_t page; uint32_t eflag; local_intr_store(eflag); page = pmm_manager->alloc_pages(n); local_intr_restore(eflag); return page; }
// 屏幕打印一个以 \0 结尾的字符串(带颜色) void console_write_color(char *cstr, real_color_t back, real_color_t fore) { bool intr_flag = false; local_intr_store(intr_flag); { while (*cstr) { console_putc_color(*cstr++, back, fore); } _flush_console_current(); } local_intr_restore(intr_flag); }
// 屏幕打印一个以 \0 结尾的字符串(默认黑底白字) void console_write(char *cstr) { bool intr_flag = false; local_intr_store(intr_flag); { while (*cstr) { console_putc_color(*cstr++, rc_black, rc_white); } _flush_console_current(); } local_intr_restore(intr_flag); }