X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/61bcf0c65dac58d2f29ab40e016489c89ec8eec0..8fdcd1575a97862975fa019f09c00453a2a7d8bb:/lunaix-os/kernel/sched.c diff --git a/lunaix-os/kernel/sched.c b/lunaix-os/kernel/sched.c index a93c9bb..1a9743d 100644 --- a/lunaix-os/kernel/sched.c +++ b/lunaix-os/kernel/sched.c @@ -21,8 +21,6 @@ volatile struct proc_info* __current; struct proc_info dummy; -extern void __proc_table; - struct scheduler sched_ctx; LOG_MODULE("SCHED") @@ -34,10 +32,11 @@ sched_init() for (size_t i = 0; i <= pg_size; i += 4096) { uintptr_t pa = pmm_alloc_page(KERNEL_PID, PP_FGPERSIST); - vmm_set_mapping(PD_REFERENCED, &__proc_table + i, pa, PG_PREM_RW); + vmm_set_mapping( + PD_REFERENCED, PROC_START + i, pa, PG_PREM_RW, VMAP_NULL); } - sched_ctx = (struct scheduler){ ._procs = (struct proc_info*)&__proc_table, + sched_ctx = (struct scheduler){ ._procs = (struct proc_info*)PROC_START, .ptable_len = 0, .procs_index = 0 }; } @@ -50,8 +49,9 @@ run(struct proc_info* proc) } proc->state = PROC_RUNNING; - // FIXME: 这里还是得再考虑一下。 + // XXX: 我们需要这一步吗? // tss_update_esp(__current->intr_ctx.esp); + apic_done_servicing(); asm volatile("pushl %0\n" @@ -169,8 +169,8 @@ done: return destroy_process(proc->pid); } -pid_t -alloc_pid() +struct proc_info* +alloc_process() { pid_t i = 0; for (; @@ -181,29 +181,35 @@ alloc_pid() if (i == MAX_PROCESS) { panick("Panic in Ponyville shimmer!"); } - return i; -} - -void -push_process(struct proc_info* process) -{ - int index = process->pid; - if (index < 0 || index > sched_ctx.ptable_len) { - __current->k_status = LXINVLDPID; - return; - } - if (index == sched_ctx.ptable_len) { + if (i == sched_ctx.ptable_len) { sched_ctx.ptable_len++; } - sched_ctx._procs[index] = *process; + struct proc_info* proc = &sched_ctx._procs[i]; + memset(proc, 0, sizeof(*proc)); + + proc->state = PROC_CREATED; + proc->pid = i; + proc->created = clock_systime(); + proc->pgid = proc->pid; + + llist_init_head(&proc->mm.regions); + llist_init_head(&proc->children); + llist_init_head(&proc->grp_member); - process = &sched_ctx._procs[index]; + return proc; +} - // make sure the reference is relative to process table - llist_init_head(&process->children); - llist_init_head(&process->grp_member); +void +commit_process(struct proc_info* process) +{ + assert(process == &sched_ctx._procs[process->pid]); + + if (process->state != PROC_CREATED) { + __current->k_status = LXINVL; + return; + } // every process is the child of first process (pid=1) if (process->parent) { @@ -231,19 +237,17 @@ destroy_process(pid_t pid) proc->state = PROC_DESTROY; llist_delete(&proc->siblings); - if (proc->mm.regions) { - struct mm_region *pos, *n; - llist_for_each(pos, n, &proc->mm.regions->head, head) - { - lxfree(pos); - } + struct mm_region *pos, *n; + llist_for_each(pos, n, &proc->mm.regions.head, head) + { + lxfree(pos); } - vmm_mount_pd(PD_MOUNT_2, proc->page_table); + vmm_mount_pd(PD_MOUNT_1, proc->page_table); - __del_pagetable(pid, PD_MOUNT_2); + __del_pagetable(pid, PD_MOUNT_1); - vmm_unmount_pd(PD_MOUNT_2); + vmm_unmount_pd(PD_MOUNT_1); return pid; }