
现在对netbsd的引导部分还有很多不明白,但大致知道流程了,记录如下,以下部分记录的是最普通的启动过程,即从磁盘启动,不保证完全正确
netbsd3.0的引导程序主要分为这样几个部分:一部分是主程序,还有一部分是库函数,库函数分为体系结构相关的和体系结构无关的。相应程序所在目录
是这样分配的:
以下提到的目录都以/usr/src/sys为起点
主程序第一部分:boot1
在arch/i386/stand/bootxx下,由四个文件组成,pbr.S,lable.S bootxx.S boot1.c
这四个文件编译后形成bootxx_${FS},顾名思义就是和文件系统相关的引导程序,因为mbr的程序不可能认识文件系统,而这部分是认识文件系统,
这部分要通过特殊的工具些到netbsd分区的第一个磁道,一共15个sector,sector0 是pbr.S
sector1是ptn_disklable(lable.S),sector2及后面的就是bootxx.S和boot1.c组成的程序。这部分程序负
责把/boot载入到内存的0x1000:0x0
第二部分:boot2
在arch/i386/stand/boot下,Makefile.boot里面是有5个文件组成,但是我始终没找到exec.c这个文件,呵呵,
pmake还看不习惯,很多都没看懂。这个目录下的文件编译成boot,就是根目录下的那个boot。这部分好像没什么特殊要求。
第三部分:库函数
和i386相关的库函数在arch/i386/stand/lib中,主要是利用bios写的一些辅助函数,和体系结构无关的在lib/libsa中主要是一些必须的c库函数的简单实现,我想是为了减小移直的难度。
上面介绍的这些都是和内核无关的,所以叫stand,就是stand alone的意思。
现在来介绍启动过程:
有必要把mbr的行文先介绍一下,nerbsd的mbr会把自己移到0x0600处,然后加载上面的pbr到0x7c00,再把控制权交到0x7c00,
pbr只需要一个参数:%dl,这个寄存器里保存了启动设备的bios设备号,所以这个工作也可以有其他程序来做,只要传来这个参数就可以了。
pbr先会加载netbsd所在分区的trace0的前15个sector到0x600,然后跳转到bootxx继续运行,bootxx做了最基本的准备
工作之后就转到保护模式,执行boot1,boot1把/boot加载到0x1000:0x0处,退回到bootxx,bootxx然后切换到实模式,跳
转到0x1000:0x0继续执行。
boot负责把netbsd加载到内存,并运行它,由于这部分涉及到的函数和文件很多,我还没有理清楚,所以就不能细说了。
在上面的这些程序中会有很多象open,read,exec,printf这样的好像是unix的系统调用的或者是c的库函数的,其定义应该可以在lib/libsa中找到。