示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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;
}
示例#4
0
// 屏幕打印一个以 \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);
}
示例#5
0
// 屏幕打印一个以 \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);
}