2020-2021-1 20209301《Linux内核原理与分析》第三周作业

实验二

1. 实验步骤

1.搭建一个虚拟的硬件平台

2.进入kernel文件夹添加mypcb.h并修改另外两个文件

3.修改代码后需要 make 重新编译之后才能生效

4.使用qemu -kernel arch/x86/boot/bzImage运行内核结果

2.实验分析

1.执行进程0的关键汇编代码分析如下:

asm volatile(
    	"movl %1,%%esp\n\t" 	/* 将进程原堆栈栈顶的地址存入ESP寄存器 */
    	"pushl %1\n\t" 	        /* 将当前EBP寄存器值入栈 */
    	"pushl %0\n\t" 	        /* 将当前进程的EIP入栈 */
    	"ret\n\t" 	            /* 此命令正好可以让入栈的进程EIP保存到EIP寄存器中 */
    	: 
    	: "c" (task[pid].thread.ip),"d" (task[pid].thread.sp)	/* 输入值c或d意味着放入寄存器ecx/edx*/
	);

2.进程0启动,开始执行my_process(void)函数代码

 if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */
    {        
    	my_current_task = next; 
    	printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);  
    	/* switch to next process */
    	asm volatile(	
        	"pushl %%ebp\n\t" 	    /* save rbp of prev */
        	"movl %%esp,%0\n\t" 	/* save rsp of prev */
        	"movl %2,%%esp\n\t"     /* restore  rsp of next */
        	"movl $1f,%1\n\t"       /* save rip of prev */	
        	"pushl %3\n\t" 
        	"ret\n\t" 	            /* restore  rip of next */
        	"1:\t"                  /* next process start here */
        	"popl %%ebp\n\t"
        	: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        	: "m" (next->thread.sp),"m" (next->thread.ip)
    	); 
    }  

3.实验总结

操作系统的正常工作需要用到计算机的三个法宝,即存储程序计算机、函数调用堆栈以及中断机制。首先得有存储程序的机制,才能自由实现进程的切换。进程在执行过程中,当时间片用完需要进行进程切换时,需要先保存当前的进程执行的上下文环境,下次进程被 调度时,需要恢复进程的上下文环境,这里堆栈就起到了关键作用。而保存环境到堆栈这个任务就是由中断机制完成的。当一个中断信号发生时,CPU把当前正在执行的程序的CS:EIP寄存器和ESP寄存器等都压到了一个叫内核堆栈的地方,然后把CS:EIP指向一个中断处理程序的入口,做保存现场的工作,之后执行其他程序,等回来时再恢复现场,恢复CS:EIP寄存器和ESP寄存器等,继续执行程序。这就实现了多道程序的并发执行。

posted @ 2020-10-25 11:05  20209301黄宇欣  阅读(97)  评论(0编辑  收藏  举报