您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > ucore-lab3部分实验报告
Lab3实验报告任务一:完成alloc_proc函数alloc_proc是申请一个新进程的函数,主要是申请一个进程结构体并对其中的一些变量进行初始化。首先为其申请一块物理内存:structproc_struct*proc=kmalloc(sizeof(structproc_struct));变量初始化:proc-state=PROC_UNINIT;//未初始化状态proc-pid=-1;//进程idproc-runs=0;//已调度的次数proc-kstack=0;//内核栈指针proc-need_resched=0;//是否需被调度proc-parent=NULL;//父进程指针proc-mm=NULL;//内存管理信息memset(&proc-context,0,sizeof(structcontext));//清零proc-tf=NULL;//中断帧的指针proc-cr3=boot_cr3;//设置CR3为页目录表地址proc-flags=0;//标志位set_proc_name(proc,);//清空list_init(&proc-list_link);//初始化链表list_init(&proc-hash_link);//初始化链表任务二:根据注释,完成do_fork函数判断是否已存在进程数超过给定要求:if(nr_processMAX_PROCESS)gotofork_out;为新进程申请进程块:proc=alloc_proc();设置当前进程为新进程的父进程:proc-parent=current;为进程分配一个内核栈:setup_kstack(proc);复制原进程内存管理信息到新进程:copy_mm(clone_flags,proc);复制原进程上下文到新进程:copy_thread(proc,stack,tf);保存中断符:uint32_tflag;将新进程添加到进程列表:local_intr_save(flag);设置进程:IDproc-pid=get_pid();设置进程hash链信息:hash_proc(proc);将进程加入进程链表:list_add(&proc_list,&(proc-list_link));进程数加:1nr_process++;重载中断符:local_intr_restore(flag);唤醒新进程:wakeup_proc(proc);返回新进程号:ret=proc-pid。任务三:编写sleep系统调用处理函数确定睡眠时间有效:if(time=0)return0;uint32_tflag;关中断:local_intr_save(flag);初始化一个定时器:timer_t*timer=kmalloc(sizeof(timer_t));设置好超时时间:timer=timer_init(timer,current,time);把自己设为睡眠状态,并且正在等待延时:current-state=PROC_SLEEPING;current-wait_state=WT_TIMER;添加定时:add_timer(timer);开中断:local_intr_restore(flag);进入睡眠:schedule();从睡眠中苏醒并删除定时器:del_timer(timer);kfree(timer)。任务四:编写kill系统调用处理函数进程可以被别的进程用kill系统调用并杀死。Kill函数实现很简单:在目标进程中的标志位设置中正在退出标记,并唤醒它就可以了。找到目标进程:structproc_struct*proc=find_proc(pid);将其标志位设置为正在退出:proc-flags|=PF_EXITING;如果它的状态处于被中断状态,则唤醒它:if(proc-wait_state&WT_INTERRUPTED)wakeup_proc(proc);如果找不到,返回错误:return-E_INVAL。
本文标题:ucore-lab3部分实验报告
链接地址:https://www.777doc.com/doc-2864329 .html