分类:
2010-09-07 19:14:38
本系列旨在展示和教授如何从最底层开始开发一个操作系统。
操作系统是一个复杂深奥的话题。学习操作系统是如何工作的将会是一个非常棒的学习体验。
本系列的目的是传授从零开始开发操作系统的黑色艺术(black art)。无论你是想开发你自己的操作系统还是仅仅学习它是如何工作的,本系列都是非常适合你的。
一个操作系统为一台计算机提供了基本的功能,外观和感觉。它最初的目的是为用户创造一个可使用的操作环境。操作系统的例子有Windows,Linux,Macintosh。
计算机编程就是设计与编写出能够让计算机加载和执行的软件或者程序。然而,操作系统就需要设计成带有该功能。一个操作系统不是单个程序,而是一个相互协作工作和交流的软件的集合。这就是我所说的“操作环境”。
因为操作系统是软件的集合,所以为了开发一个操作系统,你必须知道如何开发软件。这就是说你必须了解计算机编程。
如果你从来没有编写过程序,请看看下面的要求部分,接着就不用再看后面的了。这一部分会有一些能够帮助你学习c++编程和80×86汇编语言的优秀教程和文章的链接。
使用一个高级语言如C语言,可以使操作系统开发更容易一些。最常用在操作系统开发中的语言是C,C++和Perl。不要认为这是仅仅能使用的几种语 言;其他的语言也可以。我曾经看到过用FreeBASIC的!然而,从长远看来,使用更高级的语言使其正常工作也是非常困难的。
C和C++是最常用的,其中C用的最多。C作为一个中级语言,不但提供了高级的结构,而且还提供了低级的接近于汇编的特性。因此,在操作系统开发中使用C是相当容易的。这也是为什么它被使用的最多的主要原因:因为C语言最初就是被设计为用在系统级和嵌入式软件开发中的。
因此,我们将在操作系统的绝大部分中使用C语言。
C是一个复杂的编程语言,它能用一本书来描述。如果你不懂C语言,下面的资料对你会有帮助:
我个人最初学的是“The C++ Programming language”,但是现在已经过时了。
80×80汇编语言是一个低级编程语言。由于汇编语言与处理器机器指令一一相对应 ,使汇编语言非常适合硬件编程。
汇编语言由于比较低级,所以相比于C这样的高级语言,开发起来会更加复杂和艰难。因此,为了简单,我们将仅仅在需要的时候使用汇编语言。
汇编语言也是一门能够装满一本书的复杂语言。如果你不懂x86汇编语言,下面的资料对你会有帮助:
我个人开始学的是Assembly Language:Step by Step(非常好的入门书籍)和Art of Assembly Language。这两本都是非常好的书。
这就是你目前所需要知道的知识——其他的东西我会随后教你们。预先声明:从现在开始,我将不会再解释C或者x86汇编语言的概念。然而,我将仍然会解释一些新的你不太熟悉的指令,如lgdt,sti、cli、bt、cpuid的使用以及一些其他的。
因为开发底层代码,所以我们需要特别的底层软件来帮助我们。有些工具不需要,但我们强烈推荐,因为它可以显著地帮助你开发。
NASM能够产生平坦二进制的16位程序,而大多数的其他汇编器(TASM,MASM)却不行。
在开发操作系统的过程中,有些程序必须是纯粹的二进制可执行文件,因此,NASM对我们来说是一个比较好的选择。
因为考虑到可移植性,我们操作系统的大部分代码会用C开发。
然而,在我们的操作系统开发期间,有一些并非所有的编译器都支持的东西我们必须控制。例如,对所有的运行时编译器所支持的(如模板,异常)和良好的 旧标准库说拜拜!依赖于你系统的设计,你也许仍然需要支持或改变更多的详细属性:比如加载到一个特定的地址,在你的程序二进制中增加你自己的内部段等等。 基本的思想就是并非所有的编译器能够胜任开发操作系统代码。
我将会使用微软Visual C++来开发系统。然而,同样也可以用其他的编译器如DJGPP,GCC甚至Cygwin来开发。Cygwin是一个命令shell程序用来模拟Linux命令shell。有一个移植到Cygwin的GCC。
正如前面所述,用其他的编译器来开发操作系统也是可以的。由于我们最初使用的将是Visual C++,所以我将说明如何设置工作环境,这样你就可以使用你自己最喜欢的编译器。
目前,我计划描述如何设置下面编译器的工作环境:
如果可能,我将会试着支持下面的编译器:
如果你想在这个列表中增加更多的选项,请。
引导程序(Bootloader)是一个存储在单个512字节扇区的纯二进制程序。它是一个非常重要的程序,如果没有它,我们将不可能创建一个操作系统。这是你操作系统的第一个程序,它将直接被BIOS加载,然后直接被处理器执行。
我们可以用NASM来汇编程序,但是我们如何把它放入一个软盘呢?我们不能仅仅复制文件,相反,我们必须覆盖引导记录,这是windows放置(格 式化之后)我们的引导程序的地方。我们为什么需要做这个呢?记住,BIOS在寻找一个可引导磁盘时仅仅查看引导扇区。引导扇区和“引导记录”在同一个扇 区!因此,我们必须覆盖它。
我们有很多种方法可以实现它,在这里,我将展示两种。如果其中的一个方法在里的系统上无法工作,读者可以尝试另一种方法。
警告:在我解释如何使用它之前,不要试图运行下面的软件。不正确地使用软件可能完全毁坏你的磁盘。下载它,把它放在一个安全的地方直到我们使用它。再次警告!
PartCopy允许从一个分区复制扇区到另外一个扇区。PartCopy代表“部分复制”。它的功能就是把一定数量的扇区从一个地方或地址复制到另一个地方或地址。
Windows提供了一个小的命令行调试器,它可以通过命令行来使用。可以使用它来做很多不同的事情,但是我们所需要的只是把我们的引导程序复制到磁盘的第一个512字节。
打开命令提示符,然后输入debug,你将看到一个小的提示符(-):
1 | C:\Documents and Settings\Michael>debug |
2 | - |
这就是你输入命令的地方。h是帮助命令,q是推出命令,w(写)命令是对我们来说最重要的命令。
你可以让debug加载一个文件到内存,比如说我们的引导程序:
1 | C:\Documents and Settings\Michael>debug boot_loader.bin |
2 | - |
这允许我们在上面执行操作。(我们同样可以使用debug的L(加载)命令加载文件到我们希望的地方)。在上面的例子中boot_loader.bin将被加载到地址0×100。
为了把文件写到磁盘的第一个扇区,我们需要使用W(写)命令,就像下面的形式:
1 | W [address] [drive] [firstsector] [number] |
好,让我们看看:文件在地址0×100,我们要用的是软盘(Drive 0),firstsector就是磁盘的第一个扇区(sector 0)然后扇区号是1。
把这些放在一起就是把boot_loader.bin写到软盘的第一个扇区的命令:
1 | C:\Documents and Settings\Michael>debug boot_loader.bin |
2 | -w 100 0 0 1 |
3 | -q |
如果你想深入学习此命令,看看这个。
不管你是否有一个软盘驱动器,这个程序都是非常有用的。它可以从一个储存着的软盘镜像模拟一个真实的软盘驱动器,甚至是从RAM来模拟。这个程序创建一个虚拟的磁盘镜像,允许直接用windows资源管理器格式化磁盘和复制文件(比如说你的内核)。
你插入一张软盘到电脑上,满怀希望它会工作。你启动你的计算机并满怀期待,直到你的软驱马达停止工作,因为你忘了在你的bootloader中发送命令给控制器。
当工作在底层代码中时,如果你不小心是有可能毁坏硬件的。同样,为了测试你的操作系统,你必须在开发期间数百次地重启你的计算机。
此外,如果计算机只是重启你将怎么做?如果内核崩溃你又会怎么做?因为没有可以用在你的操作系统上的调试器,所以事实上根本无法调试。
解决方案?一个PC模拟器。这里有很多可用的,其中两个是VMWare和Bochs模拟器,我们将会使用Bochs。
你不需要知道如何使用我所列的软件,我会在开始使用它们的时候解释如何使用它们。
如果你想在一个真实的没有软盘驱动器的计算机上运行你的操作系统,可以从CD启动,即使它是一个软盘镜像。这是通过大多数BIOS支持的软盘模拟(Floppy Emulation)实现的。
上面列出了很多工具。为了更好地理解他们的用处,我们可以看看操作系统的整个创建过程。
这里所列的很多术语或者概念你可能比较陌生。不用担心——所有的东西将会在随后的几章解释。
本章的目的是为其余系列创造一个基石,它提供了一个基本的介绍以及列举了一些我们将会使用到的工具。我将在我们需要的时候解释如何使用这些程序,因此除了列举在要求这一节中的以外,你不需要这里列举的任何一个的教程。
除此之外,我们浏览了一下开发一款操作系统的构建流程。对大多数部分来说,相当的简单,但是它提供了一个途径去查看什么时候将会使用这些列出来的程序。
在下一章中,我们将回溯到第一个磁盘操作系统(DOS)并回顾一下操作系统的历史。我们也会看看一些基本的操作系统概念。
我们暂时不会用到上面所列的工具,所以你暂时不需要下载它们。
操作系统开发系列 文章网址:
http://matrix7.me/category/os/osdevseries/