基于微内核的多核操作系统设计V0.1
概要
这是一个基于微内核的能体现多核调度的试验性质操作系统。以“一切为消息”为一致性理念。希望将消息传递模块抽象出来成为一个单独的进程。将调度和消息传递分来。整个操作系统由进程管理模块,消息传递模块,内存管理模块,信息调度模块,文件系统模块组成。每一个模块相当于是自己功能的封装。模块之间相互独立。在MINIX中它的内核就是我们所描述的消息传递模块。可以说它就是一个类MINIX的操作系统。
开发环境
硬件环境 I386 系统开发环境 开发语言: C语言,X86 32位汇编语言 编译器: GCC 汇编器: nasm 连接器: ld 调试器: gdb 运行环境:qemu 引导方式 将系统镜像制作成ISO镜像格式以GRUB引导方式启动。
一切皆消息
希望贯彻“一切皆消息”的一致性概念,一个操作系统如果没有一个一致性的概念,就会在设计与开发的时候变的混乱,没有目标。例如LINUX、UNIX的一致性理念是“一切皆文件”,IBM 设计的OS一致性理念是“一切皆批处理”。MINIX确实是使用消息机制,但是消息的发送接收是在一个函数里的,执行的,每次调用send后立即调用recv 可以理解为两个操作被打包成一个“原子”的操作了。他使用了“消息沟通”但是没有实现“一切皆消息”,我们尝试将所有的“沟通过程”抽象成消息的传递。 将发送和接受消息分离开,将消息作为调度对象。 每个模块的功能性例程作为调度实体。根据调度的结果分配CPU资源。 以创建一个进程为例:
Fork :
Fork(){
Send_to (MM); /*发送请求内存消息*/
Send_to (exec); /*发送请求加载执行映像消息*/
Send_to (sched); /*发送请求就参加进调度消息*/
Ready_OK(); /*等待所有组成部分就位*/
}
创建一个进程,我们需要从内存管理模块获取内存,从进程管理模块加载进程映像,将自己加入到进程的调度队列中。在这里发送消息是非阻塞的,如上图代码,Send_to()只负责将消息发送进调度队列,Ready_OK()函数会阻塞这个函数,因为需要保证进程所需要的操作都完成后才能从fork()返回。 当消息都发送到消息队列中后,调度模块周期性得到CPU,处理消息队列,安排相应模块例程被调用。每个例程完成操作后,都会对这个进程设置相应的标志位。当调度消息最终被处理后。函数返回,进程进入就绪状态。 当然并不打算将消息调度和进程调度分开来做。进程管理程序会将会变成消息的一种被添加进消息队列中。我们也肯定不可能只有一条队列。如果需要调度某个进程只需要将执行流切换到相应进程就行。当这个进程在放弃CPU之前需要将自己的状态做成消息发送到消息队列。 一种最简单实现方式,也是计划第一版最初级代码: 调度程序写进时钟中断处理程序,保证每次时钟产生中断时调度程序会跑一次。创建一个内核线程,创建这个线程只需要两步:分配内存,指定相应任务函数。创建时将分配内存和指定任务函数作为两个消息写进全局消息队列,时钟产生中断运行调度程序处理这两条消息。处理完成后,进程的状态被制成可调度的消息发送到消息队列。等下次调度程序发起调度时,就可以执行这个线程了。