翻译这篇文章,文章意思很简单。本文主要讲述关于L4的。
http://www.geocities.ws/munkee_chuff/l4/boot_process.html
本文主要叙述在IA-32(PC)上一个OS的启动进程,以及详细描述其内存模型。
首先当PC启动时,它实在实模式。BIOS首先察看磁盘的启动扇区(前512字节,也叫MBR),接着便加载存储在这的程序。我一般用grub。
在MBR中放着的是GRUB的stage1,它主要是引导加载磁盘上的stage1.5和stage2。stage1.5提供磁盘访问,所以不同的文件系统会有不同的stage1.5。
如下图所示,GRUB把东西都存储在内存的前640KB内。想知道这部分内存里面都有什么,可以看这里 memory map。在你机器上地址0×00100000及以上部分是你的可用空间。
一旦GRUB启动且3个stage文件也在内存里,它将从磁盘读取grub.conf(或者menu.lst)。这个文件规定了那个二进制程序将会被引导以及规定它们的命令行参数(如果有的话).
一旦一个条目(假设是L4)被选中的话,GRUB将加载必要的文件进内存且运行grub.conf中标记为kernel的程序。在我们的事例中,kickstart是kernel,ia32-kernel、sigma0和一个roottask server被标记为模块。关于更多GRUB的介绍,可以参见此文。
kickstart 镜像被链接到物理地址0×00800000处。这个镜像使用从GRUB得到的信息初始化ia32-kernel模块,例如内存空间,sigma0和root task的地址。kickstart也把ia32-kernel, sigma0 和root task所使用的内存映射为已被使用。
kickstart从程序需要以来ia32-kernel, sigma0 和root task server,所以GRUB加载应该有顺序,否则将崩溃。
kickstart也加载ELF,只是基本地读取由GRUB已经加载的ELF文件。进行加载操作的代码实际上是复制程序映像到由GRUB之前加载该模块的内存区域。之所以这么做,是为了kickstart不必为了存储而重新分配更多的内存。
内核映像被链接到物理地址0×00100200处。
kernel把机器初始化到一个可以使用的状态,这包括
sigma0映像被链接到物理地址0×00020000处。
sigma0进入一个无限循环,等待来是用户任务(主要是root task)或者来自内核分配内存的信息。这将一直持续到内存耗尽,关于这一点,内存管理应该有用户任务处理。.
已经说到sigma0的方式不是很稳定,因为在某些情况下内存将耗尽。对于嵌入式程序来说,这种机制是好的,因为嵌入式的内存和任务的数量是可控的。但对于想desktop OS这样的系统来说,这种机制不尽完美。
N.B: NICTA have removed Sigma0 from their most recent L4 and the L4ka people are working on a resolution to this problem.
root task映像被链接到物理地址0×00300000。
这是开始你自己设计的地方。 root task是特权任务,可以调用L4内核的系统地用。你,OS的设计者,决定你的OS对于用户的样子。你提供哦你开始和结束任务的接口,分配合销毁内存,调度任务和线程等等。
在L4中,所有的地址空间看起来都一样,在顶部1GB的空间中,放的是kernel及其相关数据,在底部的3GB是用户地址空间。
谢谢 Espen Skoglund对此的描述。
剩下的到你了,OS的设计者,如何管理你任务地址空间的页面,在哪里退出以及保证他们不和任何其它的任务页面重合。
欢迎访问个人小站,阅读本文出处。