这一篇文章来自旧的alt.os.development新闻主题,每一行有">"的部份是由Ian Nottingham所写,其余的部份是由Alistair J. R. Young所写,ㄚ琪兹将其翻成中文分享给华人的朋友。
> Hey…我已经试着开始设计核心一段时间了,但是所有我看的范例都已经远超过最早开始的
>阶段,我没办法了解从哪里开始并且什么时候该做什么…有人有开发初期的范例吗?或是可能有一篇指南
>还是有需要做什么的清单?
我要说的第一件事就是你需要考虑的是”没有”完整的子系统可以开始,关于核心我发现最有趣的一件事就是每件事跟其余的事都有有五六个的相依关系- 所以同时你会留下五六个子系统的小片段程式要开发。
如果你是从头开始,或许你需要做的第一件事就是开发一大堆的小巨集跟函式来把一个漂亮的脸放在X86架构比较杂乱的位元上,如果你真的雄心勃勃,你可以尝试,并使其成为一个可携式或至少是一个半携式的脸。:)
(我真的相信假如你对撰写大量低阶PC-硬体-杂凑值的组合语言程式不感兴趣的话,那将会是有很多无聊细节的时间要消磨,我建议你可以取得Utah Oskit {文中所列为v. 0.96,但ㄚ琪查阅之后已经有0.97版,不过这些版本真的都很旧了,约在2002年出来的}这里所有的资料都可以拿来用)。
你也需要一堆核心的函式库(不是strcmp()、不是strcpy()、不是malloc()等等,当然,所以…?)- 加上assert()及panic()逐行的侦错函式。
同时,你*真的*需要现在做你主要设计的决策,否则你会落到跟我现在一样的状况 – 必须摧毁这个东西然后重做一遍那可是*很大的*痛苦。
第一件大事就是记忆体模式,分段且/或分页?如今看起来,大部分的人要分页而不要分段 – 因为平面记忆体模式是较好的,且因为分页通常是可相容的而分段却不能。
再者你要放核心在哪?你允许每个程序有个别的位置空间吗,或是混合在一起?虚拟记忆体?
然后就是多工/绪,假如你决定有这个功能,或许最关键的就是一开始,它是否可能将你的程式码将永远在对称多处理机(SMP)上执行?假如是,你需要从一开始就放进所有的自旋锁跟其他同步的东西 – 回想到这件是是一个*很难想像的*恶梦。
你的行程模式为何?只是基本的两阶的行程-拥有-执行绪,或是一些更复杂的?(我自己现在使用三阶的互动式交谈/工作/设施拥有行程拥有执行绪的模式),当你处理工作交换时,你将要写你自己的程式码来做这件事,或是用Intel提供的工作状态分段(task-state segment,TSS)来做,假如是后者,你将要走整套得方法并让每个执行绪有一个TSS,或是有两个及交换相应的资讯进出无作用的资讯在每次的工作交换前及之后?
系统呼叫,你如何处理?有几个可能 – Linux,以及其它的,似乎使用软体中断,所以那是相当的流行,其他的选项 – 呼叫闸到来让使用模式的程序直接呼叫相应的核心函式,或只是有一个呼叫送出讯息到IPC连接埠。
而提到IPC – 讯息连接埠?具名管道?伫列?本地通讯端?上述所有部份?现在最好想一下,因为它会大大影响你其余的设计 – 你可能想要有一个基本的然后实作其它所有的条款(在
Laura,举个例来说,一切几乎是基本的讯息连接埠的衍生 – 而它会影响TCP/IP堆叠的设计(网路 – 这是另外要想到的)。
Ich,设备驱动程式 – 要如何讨论这些?以及档案系统,这真的都是复用式的主题,简言之,总有Unix的模式是你把所有的事情都当成档案来处理并且透过档案系统来存取,或许有更奇特的选项在那里等待 – 再次使用我自己的核心做例子,Laura模式有一个’命名空间管理员’会列出系统的每个物件 – 设备、档案系统及他们自己的档案等等,要存取每个设备、档案不管什么东西,你询问命名空间管理员而它针对这个物件给你一个(回忆之前的)IPC连接埠 – 且每个注册的事情可以完全支援一系列订制的动作,不只是标准的open()、close()、 read()、write()、ioctl()…
安全!假如你想要有,现在就想想,它几乎比SMP改装还要逊,至少假如你想要避免每个地方有安全漏洞的话,而且有这么多不同的方法来做到这一点 – 我自己使用物件存取控制表验证可能的三个不同的权杖(token)而这是基于相关的执行绪、工作及交谈来处理的。
嗯,这是所有的设计东西,但这在我的书中是最重要的,我的意思是先把它做完,否则,最后你会花很多时间来摧毁跟重写。
一旦你真的开始放程式码到键盘…嗯,(除非你使用一样东西),你需要的第一件事就是粗略的控制台驱动程式,这个程式几乎确定不会是你使用驱动控制抬得最后一个版本,但是试着不用printf()来侦错绝对是一个混蛋…
那么 – 让我看看,它很多取决于你的OS是如何的布局(再一次谈到设计:) )以及那些相关的事务,很明显地,首先你需要的是启动核心的程式码(假如你使用多重开机启动程式,或是某些类似的,这比较不会那么痛苦,使用像它这样的东西来开始甚至是稍后你计划写你自己的启动程式可能是一个不错主意)以及做最基本的设定(让分段设定正确、配置核心堆积及堆叠来工作等等…等等)。
然后,我的第一步是写东西,用来显示启动和停止的旗帜(这样我就可以真正看到东西发生什么事 – 这总是一个好处!)然后,在这上面建构 – 让我们来看看,我的第一个步骤是重写那个要显示旗帜,然后进入系统闲置状态(也就是最后变成限制执行绪的回圈),那就*真的*比只用’for (;;) ;’ 还复杂了 – 我认为在这期间停止处理器避免使用过多电力是一个好主意,但是…
我认为下一件事可以拿来做的就是陷阱处理(trap handling)或许是个好主意- 即使,在这个阶段,你所能做的就是显示一个讯息、列印状态以及核心的错误(依我所见,这应该是你预设的处理器),这讯息会在稍后侦错的时后派上用场(比只是崩溃还有用),这在你已经有了一个架构时可以更快地实作真正的处理器。
同样的事就是中断的处理,我觉得这可能是名单上需要处理的下一件事,但我不会对一个无法预期的中断感到恐慌。
在此之后 – 嗯,做好后它会依赖你现在正在做的核心,我的下一个步骤就是获得一个处理器来跑时间的中断 – 几乎所有的事情都会使用系统的定时器来做*某些事*,所以这是非常必要的,而且,我也需要排程器来工作,所以…
Utah OSKit 可以在http://www.cs.utah.edu/flux/oskit/找到。
ㄚ琪发现翻译这篇硬体的英文,对我来说难度颇高的,因为很多专业名词是没有接触过的,有机会继续涉猎啰。