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
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