Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54862
  • 博文数量: 9
  • 博客积分: 350
  • 博客等级: 二等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 13:03
文章分类

全部博文(9)

文章存档

2011年(1)

2010年(8)

分类:

2010-07-30 16:01:42

操作系统开发 - 介绍
by Mike, 2008, Updated 2010

本系列教程旨在从基础教授和演示操作系统的开发。

这是关于什么?

操作系统是一个很复杂的话题,学习操作系统是如何工作的是一个非常好的学习体验。

本系统的目的是从基础教授操作系统开发的方法(black art),不论你是想要开发一个自己的操作系统还是简单的想要知道它们是如何工作的,这都会对你有所帮助。

什么是操作系统?

操作系统为计算机提供了最基础的功能,看和感受。主要目的是为用户提供一个可运行的操作环境。

操作系统的例子有Windows、Linux和Macintosh。

如果你之前没有编写过程序

计算机编程是设计和编写计算机可以加载和执行的软件/程序。然而,操作系统被设计用来提供加载和运行软件/程序的功能。

操作系统不只是一个程序,而是彼此通信的软件的集合。这就是我所说的“运行环境”。

因为操作系统是软件的集合,为了开发操作系统,必须知道如何去开发软件。也就是说,必须知道计算机编程。

如果你之前没有编写过程序,不要再张望了,好好看一下下面Requirements部分。这部分有到能够帮助我们用C++和80x86汇编语言编写程序的教程和文章的链接。

必须RequirementsC编程语言知识

使用高级语言,比如C可以使用操作系统开发更容易一些。操作系统开发最常用的语言有C、C++和Perl。不要认为操作系统只可以使有这几种语言开发;其它语言也可以做到。我曾经见过有人用FreeBasic!使用更高级的语言也可以做到这些,但从长远来看,会比较困难一些(译:因为高级语言提供了一些高级特性,这些特性可能需要在开发操作系统过程中自己实现)。

C和C++最常见,尤其是C是最常使用的。C作为一门中层语言,提供了高级结构的同时也支持接近于汇编语言的底层细节,正因为如此,使用C开发操作系统更容易些。最常使用C的主要原因是因为C语言初始就被设计用于系统级和嵌入式软件的开发。

因此,操作系统中的大部我们会使用C

C是一门很复杂的语言,可能需要一本书进行讲述。如果不了解C,如下可能会有所帮助:

我个人从“The C++ Programming Language”开始学习,尽管,它现在已经过时。

x86汇编语言知识

80x86汇编语言是底层语言。汇编语言提供了到处理器指令的直接一对一映射,使得汇编语言更适合用于硬件编程。

作为低层语言,汇编语言相对于像C语言一样的高级语言而言,更复杂也更难以用于开发。 因此,为了简单,我们只在必须使用的时候才会用汇编。

汇编语言是另一门复杂的语言,它的知识足以填充一本书。如果不了解x86汇编语言,如下会有所帮助:

我个人从“Assembly Language: Step by Step(非常好的入门书籍)”和“Art of Assembly”开始学起,这两本是非常好的书。准备这就是需要知道的---其它的边学边讲。事先声明:从现在开始,不会再讲解C或汇编语言的概念。只会讲解不熟悉的新指令,比如lgdt,sti, cli, bt, cpuid等。行业工具

在开发底层代码过程中,我们需要特殊的底层软件。这些软件有一些不是必需的,但是,还是强烈推荐,因为它们对我们开发有很大的帮助。

NASM - 汇编器

Netwide Assembler (NASM)能够产生扁平的二进制16位程序。而其它大部汇编器(TASM, MASM)不能。

在开发操作系统过程中,许多程序必须是纯二进制可执行文件。因此,NASM是我们最好的选择

可以从下载NASM。

微软VC++2005/2008因为移植关系,我们操作系统的大部分代码都会用C开发

在开发操作系统过程当中,有些编译器不支持的事情必须我们自己控制。比如:不能再使用运行时编译器支持(模板,异常)和老的标准库!根据你对操作系统的设计,你可能也需要支持或改变一些细节的东西:比如加载特定地址,在自己编写的二进制文件中增加内部节(internal sections)等...,基础思想是,并不是所有的编译器有开发操作系统的能力。

我会使用微软VC++开发操作系统。然而,也可以使用其它编译器,比如DJGPP、GCC,甚至是Cygwin。Cygwin是一个用于模拟Linux命令行的程序。Cygwin有GCC。

可以从得到VC++2008

也可以从得到VC++2005。

其它编译器支持

如前所述,可以使用其它编译器开发操作系统。虽然我主要用VC++编译器,但也会解释如何设置您喜爱的编译器的环境。

现在,我打算描述一下以下编译器的环境设置:

  • DJGPP
  • Microsoft Visual Studio 2005
  • GCC
  • 如果可能的话,我也会提供对以下编译器的支持:

  • Mingw
  • Pelles C
如果想增加更多到这个列表,请。拷贝boot loaderbootloader是纯二进制程序,保存在512字节的一个扇区内。它是非常重要的程序,没有它无法创建操作系统。它是BIOS直接加载的操作系统的第一个程序,直接由处理器执行

我们可以使用NASM汇编这个程序,但我们如何把它放到软盘上?我们不能仅仅只是拷贝这个文件,而是需要把我们的bootloader覆盖掉Windows占据(格式化后)的引导记录。我们为什么需要做这些?切记,当BIOS查找可引导磁盘时,只看它的引导扇区。引导扇区,和“引导记录”在同一个扇区!因此,我们必须覆盖它。

有很多方法可以做这些。这里,我会介绍两个。如果一种方法不行,可以尝试另外一种

警告:在我解释如何使用它之前,不需要使用以下这些软件。不正确使用这些软件可能损坏磁盘上的数据或者使用PC机无法启动。

PartCopy - 低级磁盘拷贝

PartCopy支持从一个磁盘向另一个拷贝扇区。PartCopy表示"部分拷贝". 它的功能是从一个位置拷贝适当数量的扇区到另一个,可以指定特定位置。

可以下载到它。

Windows DEBUG 使命Windows提供了一个小的可以通过命令行使用的调试工具。使用这个软件我们可以做一些不同的事情,但我们需要它做的是拷贝我们的boot loader到磁盘开始的512字节。

在命令提示符后,输入debug。会看到(-)提示符:

C:\Documents and Settings\Michael>debug -
在它后面输入命令。h 是帮助命令,q 是退出命令,w (写)对我们最有用。

可以调用加载一个文件到内存,比如我们的boot loader:

C:\Documents and Settings\Michael>debug boot_loader.bin -
这允许我们对它执行操作。(我们可能也会使用 L (加载) 命令加载我们指定的文件)。在上面的命令里, boot_loader.bin 会被加载到0x100地址处。

把文件写到我们磁盘的第一个扇区,我们需要按如下方式使用 W (写) 命令:

W [address] [drive] [firstsector] [number]
Okay... 让我们看一看,文件地址在0x100。 我们用的是软件盘(驱动器0)。第一扇区是磁盘的第一个扇区(扇区0) ,扇区号是ehm...1。

把这们放到一起就组成了将 boot_loader.bin 写到磁盘引导扇区的命令:

C:\Documents and Settings\Michael>debug boot_loader.bin -w 100 0 0 1 -q

如果想对这个命令的了解更多一些,请看。

VFD - 虚拟软盘驱动器

不管你有没有软盘,这个程序都非常有用。它可以从软盘镜像模拟,或者是内存出一个真实的软盘驱动器。这个程序创建一个虚拟软盘镜像,可以在Windows explorer对其格式化和拷贝文件(比如,内核)。

从下载。

Bochs 仿真器 - PC仿真器和调试器

你将软盘插入到计算机中,并期待着它工作。你启动你的计算机,并欣赏着自己伟大的作品!...直到软盘马达停止工作因为你忘记在bootloader中发送命令给控制器

当编写低层代码时,如果不小心可能会损坏硬件。另外,在开发期间为了测试操作系统,你会频繁的重启计算机

另,如果只是重启计算机你会做什么?如果你的内核崩溃了又会做什么?因为你的操作系统没有调试器,它实际上也不可能调试。

解决方案是什么?PC仿真器。有许多可以供使用,VMWare和Bochs仿真器就是其中两个。我会使用Bochs和微软Virtual PC进行测试。

可以从下载Bochs。

Thats all, fokes

你不必知道如何使用我列出的软件。我会在我们开始使用它们前解释如何使用

如果你喜欢在没有软盘驱动器的真实的计算机上运行你的系统,可以从CD引导,尽管它是一个软盘镜像。这是通过大部分BIOS都支持的软盘仿真实现的。

找到一个可以从软盘镜像创建可引导ISO的CD刻录软件(我个人使用MagicISO),然后,把这个ISO镜像刻录到一张CD盘上,它就会工作了

创建过程

上面列出了很多工具,更好的了解它们会非常有用。我们来看一下整个OS创建的过程。

  • Setting everything up
    1. 使用VFD创建和格式化一个软盘镜像
    2. 启动Bochs仿真器,从这个软盘镜像引导
  • The bootloader
    1. 用NASM汇编bootloader成一个扁平的二进制程
    2. 使用PartCopy或DEBUG命令把bootloader拷贝到软盘镜像的引导扇区
  • The Kernel (And basically all other programs)
    1. 把所有源文件汇编/编译成能够被bootloader加载和运行的对象文件(比如ELF或PE)
    2. 使用Windows Explorer把内核拷贝到软盘上
  • Test it!
    1. 使用Bochs仿真器和调试器,使用一上真实的软盘,或使用MagicISO创建的可引导的CD

下回分解

这里所列出的一些名词或概念可能对你来说很陌生,不要担心--后续的文章会为你解释清楚的

本教程是为后续系列起到铺垫作用。提供了基本介绍,并列出了我们会使用的工具。在需要时我会解释如何去使用这些程序,所以除了Requirements部分外你不用刻意去学习。

我们也看了一下操作开发的创建过程。对于大部分是非常简单的,然而,它提供了何时会使用列出程序的方式。

下一个教程我们会回到第一个磁盘操作系统(DOS),并了解一下历史。我们也会看一下OS的基础概念。

我们还没有使用上面列出的软件,所以你也不需要下载它们。

原文地址:

阅读(3655) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~