本实验是在linux环境下进行的,大家可以在实验楼的实验二来看到一个简单的时间片轮转多道程序内核代码
https://www.shiyanlou.com/courses/195
如果是自己的linux环境,可以按照以下步骤
- sudo apt-get install qemu # install QEMU
- sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
- wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz # download Linux Kernel 3.9.4 source code
- wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # downloadmykernel_for_linux3.9.4sc.patch
- xz -d linux-3.9.4.tar.xz
- tar -xvf linux-3.9.4.tar
- cd linux-3.9.4
- patch -p1 < ../mykernel_for_linux3.9.4sc.patch
- make allnoconfig
- make
- qemu -kernel arch/x86/boot/bzImage 从qemu窗口中您可以看到my_start_kernel在执行,同时my_timer_handler时钟中断处理程序周期性执行。
- cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c
完成mykernel的运行以后,在其同名目录下,会有myinterrupt和mymain 两个c程序文件
首先打开mymain.c
里面只有一个函数,其他都是相关头文件,完成的工作就是初始化。
这个函数操作系统的入口,这里面是一个无限循环,每隔10万次(由于现在cpu执行太快,所以将这个值设置偏大),执行一次print "my_start_kernel here"
打开myinterrupt.c
myinterrupt.c 也是类似,前面有许多头文件,这里面的函数更容易,即每次时钟中断产生一个print。中断处理,怎么样获取时钟中断,进入时钟中断入口等行为操作系统内核已经帮我们处理好了,所以我们只需要做一些,中断发生时的动作即可。
这样,当前有一个CPU执行C代码的上下文环境,同时具有中断处理程序的上下文环境模拟一个硬件平台,以及初始化的任务完成,
之后我会在mymain.c基础上继续写进程描述PCB和进程链表管理等代码,在myinterrupt.c的基础上完成进程切换代码,讲解一个可运行的小OS kernel。
张何灿+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000