一、实验过程:
实验内容为完成一个简单的时间片轮转多道程序内核代码
1.根据老师指导按照实验步骤,在实验楼环境下打开shell:
cd LinuxKernel/linux-3.9.4
rm -rf mykernel
patch -p1 < ../mykernel_for_linux3.9.4sc.patch
make allnoconfig
make
qemu -kernel arch/x86/boot/bzImage
然后 cd mykernel
看到mymain.c和myinterrupt.c.
2.将老师github的mypcb.h/mymain.c/myinterrupt.c拷贝到实验楼环境的mykernel下,再按照实验步骤进行,即可看到实验的调度过程.修改这三个文件:
mypcb.h:
mymain.c:
myinterrupt.c:
3.重新make编译一下,然后执行会看到结果:
二、分析该精简内核的源代码。
1.mypcb.h对结构体和函数进行了定义.定义了线程的ip与sp 线程的结构,其中SP寄存器指向当前线程栈的栈顶,这样通过SP就能完成出入栈的操作;IP指向当前操作指令,一开始指向线程启动函数,后面按照代码的一层层调用,执行相应指令,接下来定义了进程控制块PCB的初始信息。
2.mymain.c中__init my_start_kernel 函数是内核的入口,它完成了初始化进程并启动进程的工作。 进程创建完毕后,将my_current_task指针指向0号进程,通过嵌入式汇编代码,开始执行。这个嵌入式代码实际上是开辟了新的栈帧空间,类似于上一课,也与myinterrupt.c的进程切换类似。 每个进程都执行my_process(void),i000000 == 0,打印进程号,略小于1s的时间。
3.myinterrupt.c中my_timer_handler被内核的定时器周期性调用,当计数到1000时执行进程切换。
4.其中的内嵌汇编代码为核心:
“pushl %