原创作品转载请注明出处
原创作者 ShenYue(沈乐)
实验日期 20160306
实验名称 完成一个简单的时间片轮转多道程序内核代码
实验来源 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000
操作系统单程序的函数调用使用的是堆栈机制, 通过ebp esp eip指针的进栈出栈来切换不同的栈帧(执行上下文), 然而单CPU只能有唯一的执行流,多进程环境中不可能让单一进程”独占”, 如何实现多进程并行工作,在其他进程使用CPU的时候可以”抢占”执行资源?
答案就是interrupt(中断机制).
下面是一个关于时间片轮转的操作系统内核实验,由于Linux内核代码本身提供了预留的接口用于开发者定义自己的系统启动函数和时钟中断处理函数,所以简单地实际这样的函数来进行中断处理动作就可以模拟周期性地时间中断”抢占”系统启动进程的过程.
登录实验楼的环境, 其中已经事先安装好了GCC的运行环境,QEMU硬件模拟环境和Linux内核编译源码.
定义my_start_kernel, 周期性地在内核态打印my_start_kernel here的字符串.
定义timer interrupt的回调函数my_timer_handler(), 当时钟中断发生时候,L inux内核就会调用该函数同样是打印my_timer_handler here的字符串.
然后就是执行修改过的内核镜像文件
$qemu -kernel arch/x86/boot/bzImage
可以看到来回切换地打印my_start_kernel here和my_timer_handler here,实际执行过程就是执行进程my_start_kernel 的时候周期性地接收到时钟信号,接收到需要程序被打断(interrupt)的请求后,内核会把当前执行的进程的ebp esp压栈进入内核堆栈(保存现场), 同时eip指向中断处理程序入口, 调用自定义的回调函数my_timer_handler执行,执行结束后回复内核堆栈中保存的ebp esp指针(恢复现场)
来源:oschina
链接:https://my.oschina.net/u/66133/blog/631863