OS开发入门

看来大多数人真的想要写一个作业系统,却不知道从哪里开始,他们不知道他们需要知道什么程式语言。

嗯,ㄚ琪也是不知道从哪里开始,所以刚好看到一些资料,所以我翻译这篇OS开发入门。

[adsense][/adsense]

用Q&A的方式来写可能比较容易懂。

Q:所以我需要知道什么程式语言来开发自己的作业系统?

A:你至少应该知道组合语言(asm)因为你会需要它来写开机磁区(bootsector)(下面的问题会解释)以及相当多其他的东西,我建议你也要学C/C++,因为它是比ASM还要容易了解的语言,接着你就可以使用C/C++跟ASM在你的作业系统中,你可能会考虑用Pascal跟 ASM来写自己的作业系统,而不是用C/C++跟ASM,但是我还是建议使用C/C++跟ASM,(注意用C++跟作业系统的开发有一些特别的问题)。

Q: 什么是开机磁区(bootsector)?

A: 开机磁区是一个储存在磁碟片及/或硬碟最前面的很小程式,它负责找到你的核心(你OS的最主要部份做最多事的),载入到记忆体,然后执行。

Q: 我是否必须有一个OS来做一个OS?

A: 是的,大部分的人使用Windows 且/或 Linux来开发OS。

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

A: 对于组合语言来说,我建议NASM因为它是免费的,有好的文件,可以输出到很多的档案格式,以及在很多的OS上可用,它也有释出原始码,有最多的组合语言范例在需要原始码的OS dev站上可以找到,对于C/C++ 我建议在Linux下使用gcc,在Windows下使用DJGPP(这两个彼此相容)。.

Q: 我如何做我的OS可开机磁区?

A: 你会需要输出到只有机器码的执行档,在NASM 使用-f bin,假如你使用C/C++ 你会需要使用连结器来做(见这一个问题)。

Q: 什么是连结器,如何使用来开发OS?

A: 连结器会将编译器产生的输出档连结到一个档案中,对于OS的开发来说,你一般会想到连结你的档案到机器码用的执行档中,对于LD(DJGPP跟gcc最常用到的连结器)使用选项--oformat binary,假如你使用LD,你应该使用连结器指令码可以比较好控制连结。

Q: 什么是真实模式?

A: 真实模式 是x86(386、486、Pentium等等)在你第一次启动你的PC时的状态,真实模式有几个缺点:

  1. 它缺乏保护,这个能力可以让程式免于插科打诨和互相碰撞。
  2. 你只可以做一件工作。
  3. 你被受限于1MB的位址空间。
  4. 你必须使用segmentation(分割) 来存取记忆体。

Q: 什么是保护模式?

A: 保护模式(Protected Mode)(也叫做PMode)是真实模式的加强,保护模式有几个比真实模式还好的优点:

  1. 保护模式有保护(Protection),这个能力可以让程式免于插科打诨和互相碰撞(这就是为什么叫做保护模式)。
  2. 你可以同时有几个工作(像Windows跟Linux)。
  3. 你有4Gig,是的4 gigabytes的位址空间(一旦A20-Gate启用见下一个问题)。
  4. 你可以使用分页(paging) 来存取记忆体。

如果不是很明显,你的OS应该是以保护模式在执行除非你特别的理由要使用真实模式。

Q: 什么是A20汇流排(A20-Gate)?

A: 8086微处理器(这个处理器是在286、386、486、Pentium等等之前的)只能存取1MB的位址空间,对于这个位址范围,20个位址位元(A0 – A19)是足够的,然后,Intel发明了80286(通常只叫做”286″),80286可以存取到16MB的位址空间,但是80286必须跟8086相容(做在8086上的程式必须可以在80286上执行),解决的办法是什么?为了这个位址范围要给80286更多的位址汇流,但是有些程式受到这个事实影响,位址只能围绕在1MB:
让我们用8086看它的方式来看它:你在两个系统里有位址11111111111111111111然后增加1到这个位址,结果是0因为你没有第21个位元(A20!),但是80286真的有更多的位元,要解决这个问题,Intel让80286关闭了A20-汇流排,然后限制位址范围到20位元,所以存取1MB以上的记忆体时,我们需要启用A20-汇流排。

Q: 什么是选择器?

A: 选择器(有时也叫做描述器)是一个区段的定义,它包含一个基本的区段属性描述,像是分段基底值(它是开始的位址)以及分段界限值(它的长度),每一个选择器的长度是64位元,更多的资料在GDT跟LDT的描述里面。

Q: 什么是GDT?

A: 全域描述表(gdt)是一个含有选择器的表格,基本上它提供一个开始位址来定址所有的选择器。

Q: 什么是中断?

A: 中断是一个中断目前CPU正在做的工作的一个信号,它告诉CPU一个重要的事件来临,例如硬体中断,而CPU需要停止目前的工作并执行适当的中断处理器,中断处理器是一个特殊的函式设计来处理一个特定的中断(像是键盘的按键),由于中断有特殊的性能,例如他们可以用来切换ring 3到ring 0,他们可以被用在作业系统中作为系统呼叫使用,Linux系统呼叫透过中断来处理。

Q: 什么是PIC?

A: PIC,可程式中断控制器(Programmable Interrupt Controller),是一个装置用来收集中断已经发生的CPU上的硬体中断的请求和信号,当发生时,PIC跟CPU会沟通那个请求发生,cpu会停止目前的工作以及执行请求的中断处理器。

Q: 什么是PIT?

A: PIT,可程式中断计时器(Programmable Interrupt Timer),是一个可程式(你可以改变速度)的硬体计时器,它激发一个停止的中断(IRQ 0),它主要用于工作的排程。

Q: 我应该用什么顺序来做我自己的OS?

A: 嗯,你可以从任何地方开始,但是你可能会有无数的错误,我建议从制作开机磁区开始,然后做基本的核心,接着增加到你的核心。

Q: 什么是开机时设定PMode的基本步骤?

A:

  1. 停用中断这样才不会搞得一团糟。
  2. 设定GDT。
  3. 启用A20。
  4. 设定CR0的第一个位元为1。
  5. 从GDT载入有正确值的区段暂存器。
  6. 做一个远转移来载入正确值的CS跟EIP。
  7. 现在你已经在PMode了。

更详细的内容在Protected Mode by Chris Giese。

Q: 我的问题在这里没有答案,我该怎么办?

A: 你可以email给Bona Fide,他会设法帮你解答,然后增加到这篇来(这篇教学还有很多没有完成)。