从头开始编写操作系统(2) 第1章:介绍

来源:互联网 发布:linux find查找文件 编辑:程序博客网 时间:2024/05/29 11:43

译自:http://www.brokenthorn.com/Resources/OSDev1.html

1章:介绍
Mike, 2008, Updated 2010

本系列文章旨在向您展示并说明如何从头开发一个操作系统。

这是关于什么的?

操作系统是一个复杂的话题,学习操作系统是如何工作的是一个伟大的学习经历。

本系列的目的是告诉您从头开发操作系统背后的故事。无论您想要开发您自己的操作系统或是简单的只想知道操作系统是如何工作的,这个系列就适合您。

什么是操作系统?

操作系统向用户提供一台电脑的基本功能、外观和感觉。基本目的是为用户创造一个可工作的操作环境。

操作系统的例子有 WindowsLinuxMacintosh等。

如果你没有编程经验

计算机编程是设计、编写计算机可以加载并执行的软件或程序。而编写操作系统正是这样一件事。

操作系统不是单个程序,而是一些独立工作并相互交流的软件集合。这是“操作环境”的意义。

因为操作系统是一个软件集合,为了开发操作系统,我们必须了解如何开发软件,就是说必须要了解如何编程。

如果你以前从没写过代码,看看“读者需要了解的知识”一节。这一节有一些不错的教程和文章的链接,它们将帮助您学习使用C++80x86汇编语言编程。

读者需要了解的知识

关于C语言的知识

使用像C语言这样的高级语言,可以使操作系统开发更为容易。用于操作系统开发的常用语言有C C++Perl。不要以为这些是可以使用的全部语言;可以使用其他的。我就曾经见过使用FreeBASIC的!可是,在长远来看使用更高级的语言会使工作更舒服也更困难。

CC++最常见,其中C最常见。C语言,是一个中级语言,既有高级的构造方法,也提供那些靠近汇编语言和系统的底层细节。所以,在操作系统开发中使用C语言很容易。一个为什么要在操作系统开发中使用C语言的主要原因是:C语言原本就是为系统编程和嵌入式软件开发而设计的。

因此,我们在大多数的操作系统开发中使用C语言。

C语言是一个复杂的保存语言,需要一本书来描述。如果你不了解C语言,下面的链接会对你有帮助:

  • cprogramming.com
  • Thinking in C++

我个人从原来的“The C++ Programming language”开始学习C语言,不过现在它有些过时了。

关于x86汇编语言的知识

80x86汇编语言是一种低级编程语言。汇编语言提供一种直接的一对一的处理器指令映射,这使得它适合于硬件编程。

汇编语言是低级语言,这使得使用它比像C那样的高级语言更复杂也更困难,所以,为了简单些,我们仅在那些必须使用汇编语言的地方使用它。

汇编语言是另外一种需要一本书来描述的复杂语言。如果你不了解x86汇编语言,下面的链接会对你有帮助:

  • Assembly Language: Step by Step
  • Art of Assembly

我个人从“Assembly Language Step by Step (很棒的入门书) 和“ the Artof Assembly Language”开始学起。它们都是好书。

准备完成

这是你所需要了解的全部——所有其它东西,我会随着需要教给您。如前所诉,从现在起,我不会解释C或是x86汇编语言的概念。然而,我仍然会解释那些您可能不熟悉的新指令比如lgdtsticlibtcpuid 等等。

工具

为了开发低级代码,我们会使用低级软件来帮助我们。这些工具的一部分并不是必须的,但是,我们强烈推荐使用它们来简化我们的开发工作。

NASM——汇编器

Netwide Assembler (NASM)可以产生平坦二进制16位程序,而大多数其他的汇编器(Turbo Assembler (TASM) Microsoft's MacroAssembler (MASM))不能。

在操作系统开发过程中,一些程序必须是纯二进制可执行程序,因此NASM是最佳选择。

您可以在这里下载NASM.

Microsoft Visual C++ 2005 2008

因为移植性的考虑,我们的操作系统的大部分代码会使用C语言来开发。

在操作系统开发中,有些事情我们必须要控制,但是有些编译器并不支持。比如,告别了所有的运行时编译器支持(模板、异常)以及优秀的标准库!根据您的系统的设计,您也要支持或是改变更为详细的特性:比如从一个特殊地址加载,为您的出现增加内部的节等等。基本的意思是,并不是所有的编译器都适合操作系统的开发。

我会使用Microsoft Visual C++来开发系统。可是,使用DJGPPGCC Cygwin也可以。Cygwin是一个命令壳程序用于模拟Linux的命令壳。通过Cygwin可以使用GCC

您可以从这里下载Visual C++ 2008

您可以从这里下载Visual C++ 2005

对其它编译器的支持

如前所诉,使用其它的编译器开发操作系统是可行的。而我使用的是Visual C++,我将会解释如何设置工作环境,使您能够使用您喜爱的编译器。

当前,我计划解释如何为以下编译器设置工作环境:

  • DJGPP
  • Microsoft Visual Studio 2005
  • GCC

如果可能的话,我会尝试支持以下编译器:

  • Mingw
  • Pelles C

如果您希望在这个列表中增加一些内容,请联系我

复制引导加载器

引导加载器是一个保存在单独的512字节的扇区中的纯二进制程序。没有它就不能创建一个操作系统,十分重要。它是您的操作系统中第一个被BIOS加载并由处理器直接运行的程序。

我们可以使用NASM来汇编程序,可怎么把它放到软盘上呢?我们不能只复制文件。相反,我们要用我们自己的引导加载器代替原来的(在格式化时Windows创建的)加载器。为什么要这么做呢?记住,BIOS仅在查找引导磁盘时查找引导扇。引导扇和“引导记录”必须在同一个扇区,所以我们得覆盖它。

有很多方法来实现这一目的。这里,我们展示两种方法,如果这种方法不适合您的系统,我们的读者可能会尝试其他的方法。

提示:在我说明如何使用之前,不用尝试这个软件,不恰当的使用这个软件会导致数据损坏,或者是您的计算机无法正确引导。

PartCopy——低级磁盘拷贝器

PartCopy可以使您能够将数据从一个驱动器复制到另一个。PartCopy表示“Partial copy”。它的功能是将制定数量扇区由一个位置复制到另一个位置,或者从一个特殊的地址到另一个。

您可以从这里下载它。

Windows DEBUG 命令

Windows提供了一个小的命令行调试器。可以使用这个软件做很多工作,但我们仅需要用它将我们的引导加载器复制到磁盘的第一个512字节中。

转到命令提示符,输入debug。你会看到一个小横线作为提示 (-)

C:/Documents andSettings/Michael>debug

-

这就是你输入命令的地方。h 是帮助命令,q 是退出命令。w write)是写命令,这个对我们而言最重要。

你可以让debug加载一个文件,比如我们的引导加载器:

C:/Documents andSettings/Michael>debug boot_loader.bin

-

这允许我们对它进行操作。(我们也可以使用LLoad命令加载我们需要的文件)。在前面的例子中,boot_loader.bin 文件被加载到了地址0x100处。

为了将文件写到磁盘的第一个扇区中,我们需要W(Write)命令,格式如下:

W [address] [drive] [firstsector] [number]

Okay……让我们看看:文件在地址(address0x100处。我们希望是软驱 (Drive 0)firstsector是磁盘的第一个扇区(sector 0)。扇区数(number)是1

放到一块,我们将boot_loader.bin写到磁盘引导扇的代码是:

C:/Documents Settings/Michael>debug boot_loader.bin

-w 100 0 0 1

-q

如果您希望学习更多关于DEBUG的内容看看这个教程

VFD——虚拟软盘驱动器

您有一个软驱吗,这个程序很有用。它可以从一个软盘映像文件甚至是内存来模拟一个真正的软驱。这个程序可以创建软盘映像文件,允许直接使用Windows文件浏览器直接格式化、复制文件(比如您的内核)。

您可以从 这里下载它。

Bochs虚拟机——PC仿真器和调试器

您要把一张软盘插入的计算机,期待它可以工作。您引导您的计算机,来检查您的伟大工作!……直到,直到您的软盘马达因为您在引导加载器中忘记向控制器发送命令而损坏。

当在操作低级代码时,如果您不小心,很可能会损坏您的硬件。同样,为了测试您的操作系统,在开发过程中您需要重启您的计算机成百上千次。

同样,如果您的计算机重启了,您会做什么?当内核崩溃时,您会做什么?因为没有适合您的操作系统的调试器,调试几乎变得不可能。

如何解决?PC仿真器。有很多可用的,比如VMWareBochs。我会使用BochsMicrosoftVirtual PC用于测试。

您可以从这里下载Bochs.

完了,伙计们

您现在不需要知道,我列出的这些软件该怎么用,我会在需要使用它们的时候作出解释。

如果你希望在一台没有软驱的真实计算机上运行您的操作系统,从一个包含软盘映像的CD上引导也是可以的。这是通过大多数BIOS支持的软盘仿真(Floppy Emulation实现的。

简单的使用一个CD烧制软件(我使用MagicISO)可以从软盘映像文件生成一个可引导ISO文件,然后,简单的把这个文件烧制到CD上就行了。

构造步骤

上面列出了很多工具。为了更好的理解它们是怎样被使用的,我们看一下构造操作系统的整个过程。

  • 准备好一切
    1. 使用VFD 创建并格式化要使用的虚拟磁盘文件。
    2. 设置Bochs虚拟机从软盘引导。
  • 引导加载器
    1. 使用NASM汇编引导加载器来创建平坦二进制文件。
    2. 使用PartCopyDEBUG命令复制引导加载器到虚拟磁盘的引导扇。
  • 内核 (以及所有其它的程序)
    1. 汇编和/或编译所有的源代码到一个可以被引导加载器加载并执行的目标文件格式(如ELFPE)。
    2. 使用Windows Explorer将内核复制到软盘中。
  • 测试!
    1. 使用Bochs虚拟机及调试器,使用真正的软盘或使用MagicISO创建可引导的CD

下次见

本章列出的条目和概念对您来说并不新鲜。别着急——所有的一切会在后面的章节里解释。

本章的目的是为本系列的其余部分构造一个立足点。它给出了一个基本的介绍,并列出了将要使用的工具。当需要的时候,我会解释如何使用这些工具,所以你不需要了解除了“用户需要了解的知识”一节中列出的内容以外的其他东西。

我们也见到了开发操作系统的构造步骤。大多数情况下,这个描述过于简单,但是,它却告诉您在什么时候使用哪一个上面列出的工具。

下一章中,我们将回顾第一个磁盘操作系统(Disk Operating System (DOS))并进行一次短暂的历史旅程。我们会看到一些基本的操作系统概念。

我们还不会马上使用到上面列出的工具,您不需要立即下载它们。

下次见。