[翻译]如何开始开发自己的操作系统
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
原文地址: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
相关文章推荐
- 如何开发自己的操作系统的引导程序?
- 如何开发自己的操作系统的引导程序
- 如何在IBM PC上开发自己的操作系统
- (翻译)LearnVSXNow!-#1 如何开始VSX开发?
- 如何在IBM PC上开发自己的操作系统
- 【iOS开发-25】UIDevice查看系统信息,从一个问题开始如何快速找到自己想要的属性和方法并看懂它
- 如何利用虚拟化技术解决物联网开发难题?从了解 ACRN 开始
- 如何在新浪的开发平台上申请自己的应用
- 如何request乱码翻译(JAVA)_JAVA开发平台_JAVA快速开发
- android app 开发 如何定制自己的日志工具_系统优化 日志控制
- 如何设置WINCE系统字体、字号?如何设置自己开发的软件的字体、字号
- 区块链开发(零)如何开始学习以太坊及区块链
- 【翻译加转载】自己开发Blog博客程序:关于MetaWeblogAPI 的实现
- 开发控件,如何在不隐藏父类事件的情况下加入自己的操作(由开发CdsDjmx模块想到的)
- python -- 青少年如何使用 Python 开始游戏开发
- 如何开发自己的搜索帝国之ES图形化Kibana安装与使用
- [翻译]开发自己的web站点管理工具(Website Administration Tool)(2)
- 自己写操作系统MUMUOS之开发环境
- 区块链开发(零)如何开始学习以太坊及区块链
- 深入浅出JQuery (四) 如何自己开发 plugin 详解