您的位置:首页 > 其它

[翻译]如何开始开发自己的操作系统

2013-04-24 23:35 302 查看
This tutorial is written by K.J. and Joachim Nock. Updated 2002.11.20 by K.J.

原文地址:http://www.osdever.net/tutorials/view/getting-started-in-os-development

译者能力有限,欢迎砍砖,共同进步

正文开始

目前看来确实有很多人想要写一个自己的操作系统,但是他们不知道到底从哪开始,而且他们不知道到底都需要掌握哪些计算机语言。

其实,让我开始写我自己的操作系统的时候,我确实也经历了这样的问题。因此我写了这个如何开始开发操作系统的教程。

我写了个Q&A表来帮助大家理解。

Q:要写一个自己的操作系统,我都应该掌握哪些计算机语言?

A:你需要至少知道汇编语言(ASM),因为你将使用它去写一个bootsector(下面会解释这个问题)以及不少其它的事情。我还建议你需要学习C/C++,与汇编语言相比它更好理解一些。你可以把它们都用在你的操作系统中。你可能会想使用Pascal和汇编去替代C++,但是我建议使用C/C++和汇编。(记住这里有一些关于C++和操作系统开发的特别的问题)

Q:什么是bootsector(引导扇区)?

A:bootsector被存在你的软驱或者硬盘最前端的小程序。它用来帮助找到你的内核(这是你操作系统的主要部分),并且把它加载到内存中,并且运行它。

Q:是不是我不得不在一个操作系统上去写的我的操作系统?

A:是的,很多人使用MS Windows或者Linux来开发他们的操作系统。

Q:我应该使用什么编译器?

A:对于汇编语言来说,我建议使用NASM,因为他是免费的,有很好的文档,可以输出很多文件格式,并且支持大多数操作系统,我们可以找到很多可用的源代码示例。对于C/C++来说,我建议使用Linux的朋友使用gcc,MS Windows平台下的朋友使用DJGPP。(它们是相互兼容的)。

Q:怎么做才能让我的操作系统的bootsector启动起来?

A:你需要输出一个二进制文件。如果你使用NASM的话,你需要使用-f bin参数,如果你使用C/C++的话你需要一个linker(连接器)去做这些事情(下面会介绍linker)。

Q:什么是linker,我应该怎么把它用在我的开发中。

A:一个linker可以把编译器生成的文件链接成一个文件。在操作系统开发过程中,你将会经常想要把你的文件链接成一个庞大的2进制文件。对于LD(大多数人一般都会与DJGPP或者gcc一起使用连接器)我们需要使用—oformat binary参数。如果你使用LD的话,你可能还需要一个linker script(链接脚本)去控制的你链接。见My suggestions for making your OS。

http://www.osdever.net/mysuggestions.php

译者注:链接已经失效

Q:什么是Real Mode(实模式)?

A:Real Mode是一个当你打开x86(386,486,Pentium,etc)电脑时的CPU状态。Real Mode有以下几个劣势:

它缺乏保护,并且缺乏阻止程序与其他程序发生混乱和冲突的能力。

也许你只有一个任务

你最多只有1兆的地址空间。

你必须分段去访问内存。

Q:什么是Protected Mode(保护模式)?

A:Protected Mode(还称作PMode)是一个Real Mode的进阶模式。Protected Mode相对Real Mode有以下几个优势:

Protected Mode是被保护的,这个是一个去阻止程序与其他程序发生冲突混乱的能力(这是Protected Mode的名字的由来)。

也许你只有几个任务(就像Windows和Linux)。

你有4G的内存空间,是的4G。(一次使A20-Gate可用,看下一个问题)。

你可以使segmentation(段)去访问内存。

如果这还不够明显,那除非你有一个非常特殊的原因去使用Real Mode,否则你的操作系统需要运行在Protected Mode下。

Q:什么是A20-Gate?

A:8086微处理器(也就是在286,386,486,奔腾等之前的Intel处理器)可以寻址(access)1MB的地址空间(access space)。对于这个寻址范围,20根地址线(A0-A19)已经足够了。在Intel发明了80286(通常被叫做286)之后。80286需要寻址到16MB的寻址空间,但是80286却是和8086一样的(这是为了保证哪些为8086开发的程序也能同样运行在80286上)。

那解决方案是什么呢。首先必须要给80286更多的地址门,但是一些程序已经依赖于这1MB的地址空间。

让我们看看在这种情况下8086看到了什么:你有一个地址:11111111111111111111,当你要给它加1的时候,结果却是0。原因是你没有第21位(A20)。但是80286确实有很多位。

为了解决这个问题,Intel创造了80286 A20-Gate关闭模式,这种情况下,地址范围就是20位。因此,为了寻址超过1MB的内存,我们必须打开A20-Gate。

Q:什么是selector?

A:selector(有些情况也被叫做descriptor)是一个分段的定义。它包含了基础段属性的一个描述。像基段(它是内存的开始)和段的极限(它的长度)。每个selector都有64 位长。关于它的更多描述,我们可以看GDT和LDT。

Q:什么是GDT?

A:GDT是一个包含selector的表。简单的说,它为寻址所有的selector提供了一个开始地址。

译者注 start

这里关于GDT的解释非常少,所以我再解释一下

GDT全称是Global Descriptor Table

在我们实际使用CPU的时候,肯定是同时执行N个程序,每个程序都会有自己的内存空间,因此我们要为每个程序声明自己的内存空间。

所以要使用GDT(中文是啥我也不知道)。

内存会被分成若干个segmentation(段)。

这样我们就可以为每个程序声明ORG 0,但是在声明之前,我们需要为每个segmentation声明一些信息:

段(segment)的大小

段在内存中的开始位置

段的管理属性,比如只读,系统专用等。

以上内容参考自tetsu的博客,我会在Reference List写下它的地址。

译者注 end

Q:什么是interrupt(中断)?

A:interrupt是一个中断现在CPU任务的信号。它告诉CPU你要接受一个重要的事件。举个硬件中断的例子,CPU需要中断现在的任务去运行中断捕获者(interrupt handler => 中断处理函数)。这个中断捕获者(中断处理函数)是一个特别的功能,它被设计去捕获(handle => 处理)一些具体的中断(比如从键盘输入文字)。对中断来说他们有很多特别的特性,举个例子,他常被用于去把ring 3转换成ring 0(they can be used to switch from ring 3 to ring 0),它们在操作系统中可能被用于做一个系统呼叫。

译者注 start

这个是程序的运行级别, ring 0级是最高级别, 通常是系统内核运行的, 而ring 3是最低级别, 通常就是我们的应用程序运行的级别.

扩展阅读:

Wikipedia => 用户态 => http://zh.wikipedia.org/wiki/%E7%94%A8%E6%88%B7%E6%80%81

Wikipedia => Ring (computer security) => http://en.wikipedia.org/wiki/Ring_(computer_security)

笔者会在深入学习后,把上面这篇文章翻译了。

感谢@Nemesis_E comrade抓错,你好用心啊。

译者注 end

Q:什么是PIC(Programmable Interrupt Controller)?

A:PIC是可以编程的interrupt(中断)控制器,它是一个可以在CPU发生中断时捕获硬件中断请求和信号的装置。当它发生时,PIC和CPU会交流发生的那个请求,而且CPU会中断现在的任务并且为那个请求执行interrupt handler。

Q:什么是PIT?

A:PIT(Programmable Interrupt Timer)可编程中断计时器,是一个可编程(你可以改变它的速度)硬件计时器,当它消失的时候(IRQ 0)它会快速的发送(fires off => to quickly send a message or give instructions)一个中断。它主要被用于任务调度。

Q:我应该按照什么顺序去开发我的操作系统?

A:事实上你可以从任何地方开始,但是你可以最后被各种bug终结。我建议你可以先写一个bootsector,然后再写一个基础的内核,最后再一点点的完善这个内核。

Q:在启动时都需要什么基础步骤才能引导进PMode(Protected Mode => 保护模式)?

A:

禁用所有中断,这样就没有事情能困扰你了。

设置GDT

使A20可用

设置CR0的第一位为1

从GDT中为段寄存器加载正确的值

从做一个for jump那里为CS和EIP加载正确的值

你现在已经在PMode(Protected Mode)了

有一篇Chris Giese写的叫做Protected Mode的文章覆盖了更多的细节

链接是http://www.osdever.net/tutorials/pm.php

译者注:以后我会翻译这篇文章。翻译后我会改掉这个链接。

Q:我的问题不在这里,那我应该做什么

A:你可以发给我email,我会试着回答你,并且把你的问题添加到这篇文章里(这个教程离完成还远者呢)。

译者注:作者的邮箱是:osdev@reallyneatmail.zzn.com

感谢

@Nemesis_E 帮我抓错

@杨同学 错别字,第一个回复

@闲尘 提出翻译指正

@海上添翼

@陈阳阳阳

@RGW

注:希望OSCHINA早日出@人功能

Reference List

对GDT的解释(上) => http://tetsu.iteye.com/blog/403407
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: