实验二
1. 实验步骤
1.搭建一个虚拟的硬件平台
2.进入kernel文件夹添加mypcb.h并修改另外两个文件
3.修改代码后需要 make 重新编译之后才能生效
4.使用qemu -kernel arch/x86/boot/bzImage
运行内核结果
2.实验分析
1.执行进程0的关键汇编代码分析如下:
asm volatile(
"movl %1,%%esp
" /* 将进程原堆栈栈顶的地址存入ESP寄存器 */
"pushl %1
" /* 将当前EBP寄存器值入栈 */
"pushl %0
" /* 将当前进程的EIP入栈 */
"ret
" /* 此命令正好可以让入栈的进程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<<<
",prev->pid,next->pid);
/* switch to next process */
asm volatile(
"pushl %%ebp
" /* save rbp of prev */
"movl %%esp,%0
" /* save rsp of prev */
"movl %2,%%esp
" /* restore rsp of next */
"movl $1f,%1
" /* save rip of prev */
"pushl %3
"
"ret
" /* restore rip of next */
"1: " /* next process start here */
"popl %%ebp
"
: "=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寄存器等,继续执行程序。这就实现了多道程序的并发执行。