ucore 内核线程创建

该文章描述了一个操作系统中创建新进程或线程的过程,包括调用alloc_proc分配用户信息块和内核栈,复制原进程的内存管理信息,设置上下文,分配线程号,并将其添加到进程列表和调度链表,最后唤醒新进程使其变为可运行状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序如下:

调用alloc_proc,首先获得一块用户信息块。
为进程分配一个内核栈。
复制原进程的内存管理信息到新进程(但内核线程不必做此事)
复制原进程上下文到新进程
将新进程添加到进程列表
唤醒新进程
返回新进程号

    proc = alloc_proc();//分配线程控制块
    proc->cr3 = boot_cr3;//切换页基址
    setup_kstack(proc);//为线程分配一页空间
    copy_mm(clone_flags,proc);
    copy_thread(proc,stack,tf);//将相关寄存器填到页上
    proc->pid = get_pid();//得到新的线程号pid
    hash_proc(proc);//把线程挂在hash链表上  作用:加速查找线程
    list_add(proc_list.prev,&(proc->list_link));//挂在调度链表上
    wakeup_proc(proc);//唤醒线程(更改线程状态)
    return proc->pid;

相关函数:

setup_kstack(struct proc_struct *proc) {
    struct Page *page = alloc_pages(KSTACKPAGE);
    if (page != NULL) {
        proc->kstack = (uintptr_t)page2kva(page);
        return 0;
    }
    return -E_NO_MEM;
}


copy_thread(struct proc_struct *proc, uintptr_t esp, struct trapframe *tf) {
    proc->tf = (struct trapframe *)(proc->kstack + KSTACKSIZE) - 1;
    *(proc->tf) = *tf;
    proc->tf->tf_regs.reg_eax = 0;
    proc->tf->tf_esp = esp;
    proc->tf->tf_eflags |= FL_IF;

    proc->context.eip = (uintptr_t)forkret;
    proc->context.esp = (uintptr_t)(proc->tf);
}


wakeup_proc(struct proc_struct *proc) {
    assert(proc->state != PROC_ZOMBIE && proc->state != PROC_RUNNABLE);
    proc->state = PROC_RUNNABLE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值