[翻译]如何开始开发本身的操做系统

This tutorial is written by K.J. and Joachim Nock. Updated 2002.11.20 by K.J. php


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


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

正文开始 小程序


目前看来确实有不少人想要写一个本身的操做系统,可是他们不知道到底从哪开始,并且他们不知道到底都须要掌握哪些计算机语言。 函数


其实,让我开始写我本身的操做系统的时候,我确实也经历了这样的问题。所以我写了这个如何开始开发操做系统的教程。 学习


我写了个Q&A表来帮助你们理解。 ui


Q:要写一个本身的操做系统,我都应该掌握哪些计算机语言? spa

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


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

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


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

A:是的,不少人使用MS Windows或者Linux来开发他们的操做系统。


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

A:对于汇编语言来讲,我建议使用NASM,由于他是免费的,有很好的文档,能够输出不少文件格式,而且支持大多数操做系统,咱们能够找到不少可用的源代码示例。对于C/C++来讲,我建议使用Linux的朋友使用gccMS 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(实模式)?

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

它缺少保护,而且缺少阻止程序与其余程序发生混乱和冲突的能力

也许你只有一个任务

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

你必须分段去访问内存。


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

AProtected Mode(还称做PMode)是一个Real Mode的进阶模式。Protected Mode相对Real Mode有如下几个优点:

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

也许你只有几个任务(就像WindowsLinux)。

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

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


若是这还不够明显,那除非你有一个很是特殊的缘由去使用Real Mode,不然你的操做系统须要运行在Protected Mode下。


Q:什么是A20-Gate

A8086微处理器(也就是在286386486,奔腾等以前的Intel处理器)能够寻址(access1MB的地址空间(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

Aselector(有些状况也被叫作descriptor)是一个分段的定义。它包含了基础段属性的一个描述。像基段(它是内存的开始)和段的极限(它的长度)。每一个selector都有64 位长。关于它的更多描述,咱们能够看GDTLDT


Q:什么是GDT

AGDT是一个包含selector的表。简单的说,它为寻址全部的selector提供了一个开始地址。


译者注 start


这里关于GDT的解释很是少,因此我再解释一下

GDT全称是Global Descriptor Table

在咱们实际使用CPU的时候,确定是同时执行N个程序,每一个程序都会有本身的内存空间,所以咱们要为每一个程序声明本身的内存空间。

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

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

这样咱们就能够为每一个程序声明ORG 0,可是在声明以前,咱们须要为每一个segmentation声明一些信息:

段(segment)的大小

段在内存中的开始位置

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


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

译者注 end


Q:什么是interrupt(中断)?

Ainterrupt是一个中断如今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:什么是PICProgrammable Interrupt Controller)?

APIC是能够编程的interrupt(中断)控制器,它是一个能够在CPU发生中断时捕获硬件中断请求和信号的装置。当它发生时,PICCPU会交流发生的那个请求,并且CPU会中断如今的任务而且为那个请求执行interrupt handler


Q:什么是PIT

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


Q:我应该按照什么顺序去开发个人操做系统?

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


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

A

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

设置GDT

使A20可用

设置CR0的第一位为1

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

从作一个for jump那里为CSEIP加载正确的值

你如今已经在PModeProtected 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

相关文章
相关标签/搜索