OSDev Tutorial

一个简单的操作系统实现教程

作者:吴锡

本文是一个简单的操作系统的实现教程。

课堂里教的《操作系统》和本教程有什么区别和联系?
《操作系统》课程是站在一个较高的层次上来向我们介绍操作系统各个部分研究和解决的核心内容。如内存那章,主要介绍了内存管理的几种方法(段式、页式以及段页式)、常用的页面置换算法,但没有介绍底层要实现这些应该如何做;又如进程那章,主要讲进程调度,也是重点在调度算法,底层具体实现没有介绍。
而本教程是站在较底层向大家自己写一个简单的操作系统的知识,不管是页面置换算法还是进程调度算法都用的是最简单的算法,因为我们的重点在底层实现细节。
所以,本教程可以算是《操作系统》课程的一个补充吧,一方面将《操作系统》课上没涉及到的底层细节作了大致的介绍,另一方面站在底层将操作系统各个部分的联系(如进程调度和内存管理的联系)给大家进行了介绍,最终让读者都能自己完成一个简单的操作系统。

国内已经有一本《自己动手写操作系统》的书了,我为什么还要写这个教程?
首先,国内的那本《自己动手写操作系统》确实写得很好,我自己在动手写操作系统的时候那本书也是我的参考资料之一!但是,因为操作系统的各个部分是一个联系紧密的有机体(或者说操作系统内部就像一锅粥),实现一个操作系统的步骤可以有很大不同,我在参考了很多资料后,选择了一条和《自己动手写操作系统》作者不同的、我认为更复合人们通常思考逻辑的实现路径。
其次,《自己动手写操作系统》是一本很“厚”的书,介绍得很全面,我个人认为其作者是希望大家用上几个月的时间进行学习并完成自己的操作系统。而我不同于他的是,希望的是像《UNIX编程艺术》里面说的那样“先求运行、然后求快”,快速的(1个月内)完成一个操作系统“内核”(不是完整的操作系统),这样对整体有了一个把握后再会头来看各个部分的细节或者完善成为一个完整的操作系统。
最后,这个教程也算是我自己写完操作系统内核以后的一个总结,给大家提供另一条实现操作系统的参考路径。

我用了17天(每天投入10─14小时)基本完成了my mini Operating System的内核,更具体的,17天里,我完成了:系统引导VGA显示分段中断分页键盘驱动多任务(进程),还未完成的是:用户态(目态)以及 动态内存分配(malloc/free,现在内核里用的是伪malloc),主要由于时间关系,不得不将这两个内容暂时放下,但是这个不影响大局,实现这两个应该也就是2、3天的时间。
当然,我用这么短的时间写一个操作系统不可能对其各个部分都了解得很透、都能举一反三,很多地方都是“囫囵吞枣”的学习,但是这样才能使我们对整个操作系统有了一个全局的、整体的认识,而不过多的将精力放到细节上。等我们以后有时间了(或者对某些部分特别感兴趣)再回头来细致研究。相信我,操作系统的任何“局部”都够你研究几个月甚至几年!

从我写这个操作系统的经验看来,读者只需要具备:一点点汇编知识(能读懂汇编程序、写出比hello world稍难点的汇编程序)、较好的C语言编程功底、对计算机体系结构有一定的了解以及对大学《操作系统》课程所教过的内容有印象,跟着本文一步一步来,应该就能在15天~1个月的时间内快速的写出一个简单地操作系统内核,在其过程中去快速学习所涉及到的知识(基本上等于把大学4年学过的东西在1个月内回顾了一遍)。

主要内容:

0. 做一个操作系统的准备工作
0.1 Mac OS X下编译安装带debugger的bochs

1. “Hello world” ── 引导程序(Boot loader)

2. _print ── 屏幕输出(VGA)

3. ASM to C ── 从汇编转向C

4. GDT ── 段式内存管理

5. IDT and ISR ── 中断和中断服务程序

6. IRQs and PIT ── 中断请求和可编程计时器

7. Paging ── 页式存储(段页式)

8. Keyboard ── 键盘

9. Multitasking ── 多任务(进程)

10. Reload our GDT ── 为多任务做准备

11. Fork ── 创建子进程

12. What’s else?

  1. 做计划和行动,信仰是一定可以做到,前提是有足够的预备。等你的新书出版。

  2. 关注中! 我也希望自己能写个自己的操作系统,哪怕是最简单的。相信能从你这里学习到很多东西。

  3. 向师哥学习,正在考虑写一个微型os

  4. googlecode上的代码,我编译后,运行停在booting那了,我是在linux上编译的!

  5. good to see this.

Leave a Comment


*


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>