用Bochs学习Minix(2)-启动过程分析

  Minix 的启动过程分为两步,第一步运行 masterboot.s 或者 bootblock.s 中的内容。对于有分区的硬盘,它的第一个扇区是 MBR(Master Boot Record) ,其中包含有引导代码和分区表。如果硬盘有子分区,则每个子分区的第一个扇区也具有单独的引导代码。此外,引导代码也可以被放到软盘的第一个扇区。 masterboot.s 的代码存放在 MBR 中,它适合引导装在不同分区上的 Minix 。如果 masterboot.s 被载入到内存的 0x7c00 处,它的任务就是找到引导分区(或软盘),加载其中的第一个扇区中的引导信息。在引导分区(或软盘)的第一个扇区存放有 Minix 的初级引导程序,即 bootblock.s 。它也被加载到 0x7c00 位置,它的任务是将 boot monitor Minix 的次级引导程序,磁盘中的 /boot 文件)加载到内存的 0x10000 处,并跳转到 0x10000+0x0030 处执行。

关于bootblock.s的分析,可以参考http://blog.donews.com/zwell/articles/70010.aspx,注意由于版本不同,文章内容可能与下载到的代码有出入。

第二部分的启动程序boot monitorboothead.sbootimage.cboot.crawfs.c等文件连接成。boot monitor的代码从boothead.s开始执行,在进行一些准备工作后程序就跳转到boot.cboot函数(boothead.s的其他代码在后面还将调用),boot函数会在显示器上打印:

Minix boot monitor 2.19

Press ESC to enter the monitor

此时可以按ESC键进入启动环境,与用户进行交互式操作(Minix中,以root身份登入后输入halt也可以进入交互界面)。Minix启动环境的命令包括bootexitmenu等。接下来boot函数会调用execute函数执行用户输入的命令。比如,如果输入的命令是help,将会调用help函数打印帮助信息。

系统第一次启动时,如果没有任何输入,boot调用的get_parameters函数设置menu命令,所以在显示器上输出:

Hit a key as follows:

       = Start Minix

       n Start Networked Minix

用户必须选择一个Minix内核,之后boot函数会调用execute函数执行用户选择的命令。

execute函数中调用了bootimage.c中的bootminix函数启动minix内核,启动调用过程如下所示:

用Bochs学习Minix(2)-启动过程分析_第1张图片

bootimage.c

bootminix

exec_image

_minix

boothead.s

选择内核镜像

设置GDT

转换到保护模式

跳转到内核

拷贝monitorGDT到内核空间,使用新的GDT

prot_init

填充GDT表项

建立GDT中指向进程表中LDT的表项

建立IDT的描述符

mpx386.s

protect.c

cstart

设置运行main函数的环境

start.c

载入prot_init

设置好的GDT对应的gdtridtr

调用main.c中的main函数

执行内核镜像

bootimage.c

bootminix

exec_image

_minix

boothead.s

选择内核镜像

设置GDT

转换到保护模式

跳转到内核

拷贝monitorGDT到内核空间,使用新的GDT

prot_init

填充GDT表项

建立GDT中指向进程表中LDT的表项

建立IDT的描述符

mpx386.s

protect.c

cstart

设置运行main函数的环境

start.c

载入prot_init

设置好的GDT对应的gdtridtr

调用main.c中的main函数

内核镜像是 /minix/2.0.4 文件, mpx386.s 是内核的入口。最后跳转到 main 函数完成初始化,然后开始系统的正常运行。

main函数的执行过程如下:

1、  调用intr_init完成8259中断控制器的初始化。

2、  调用mem_init初始化一个数组,定义系统中所有可用内存块的地址和大小。

3、  执行函数mapdrivers,将驱动程序(任务)映射到硬件控制器并更新任务表。

4、  设置系统任务和服务器进程的进程表项,将各进程使用的内存段的位置、大小及运行特权级设置到适当的域中。

5、  使用lock_pick_proc选择第一个运行的进程,最后使用restart开始运行进程。

你可能感兴趣的:(image,服务器,Parameters,任务,menu,磁盘)