一、概述
本文通过分析一个简单的时间片轮转多道程序的内核 mykernel,来理解操作系统是如何工作的。
mykernel 是孟宁老师的一个开源项目,借助 Linux 内核部分源代码模拟存储程序计算机工作模型及时钟中断,添加与修改部分代码实现的(详情点 此处)。未加入进程管理功能的 mykernel,会在初始化后,周期性地执行时间中断处理程序。在实验楼虚拟机的终端输入以下指令(图形模式下),即可运行 mykernel 。运行时效果如下:
可以看出,这个系统目前只是简单地不停输出“my_timer_handler here ”、“my_start_kernel here”等字样。通过查看源码,可以发现这些输出字符串分别位于 mymain.c 和 myinterrupt.c 中。只要在此基础上,再加入进程描述 PCB 和进程链表管理、进程切换等代码,一个可运行的小OS kernel 就完成了。下面便开始逐步实现这些功能(本文所有代码均由孟宁老师提供,笔者只分析其功能与实现原理)。
二、添加 PCB 描述信息
为了实现进程管理,需要先引入进程块描述信息,我们将其放入一个新的头文件 mypcb.h 中。
/*
* linux/mykernel/mypcb.h
*
* Kernel internal PCB types
*
* Copyright (C) 2013 Mengning
*
*/
#define MAX_TASK_NUM 4
#define KERNEL_STACK_SIZE 1024*8
/* CPU-specific state of this task */
struct Thread
{
unsigned long ip;
unsigned long sp;
};
/* Processing Control Block */
typedef struct PCB
{
int pid;
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
char stack[KERNEL_STACK_SIZE];
struct Thread thread;
unsigned long task_entry;
struct PCB *next;