|
看到freeBSD系统结构手册中有一段专门叙述引导过程,现抄录如下:- [color=DarkRed]1.3 BIOS POST[/color]
- 当PC加电后,处理器的寄存器被设为某些特定值。在这些寄存器中, 指令指针寄存器被设为32位
- 值0xfffffff0([color="Red"]CS为0xF000, IP为0xFFF0,故线性地址为 CSx16+IP[/color],welans注)。指令指针寄存器指向
- 处理器将要执行的指令代码。cr1([color="Red"]应该是cr0[/color],welans注),一个32位控制寄存器,在刚
- 启动时值被设为0。cr1的PE(Protected Enabled,保护模式使能)位用来指示处理器是处于保护
- 模式还是实地址模式。由于启动时该位被清位,处理器在实地址模式中引导。在实地址模式中,线
- 性地址与物理地址是等同的。
- 值0xfffffff0略小于4G,因此计算机没有4G字节物理内存,这就不会是一个有效的内存地址。计算机
- 硬件将这个地址转指向BIOS 存储块。
- BIOS表示Basic Input Output System (基本输入输出系统)。在主板上,它被固化在一个相对
- 容量较小的只读存储器(Read-Only Memory, ROM)。BIOS包含各种各样为主板硬件定制的底层
- 例程。就这样,处理器首先指向常驻BIOS存储器的地址0xfffffff0。通常这个位置包含一条跳转指
- 令,指向BIOS 的POST例程。
- POST表示Power On Self Test(加电自检)。 这套程序包括内存检查,系统总线检查和其它底层
- 工具,从而使得 CPU能够初始化整台计算机。这一阶段中有一个重要步骤,就是确定引导设备。现
- 在所有的BIOS都允许手工选择引导设备。你可以从软盘、光盘驱动器、硬盘等设备引导。
- POST的最后一步是执行INT 0x19指令。这个指令从引导设备第一个扇区读取512字节,装入地址
- 0x7c00。 第一个扇区的说法最早起源于硬盘的结构,硬盘面被分为若干圆柱形轨道。给轨道编
- 号,同时又将轨道分为一定数目(通常是64)的扇形。0号轨道是硬盘的最外圈,1号扇区,第一个扇
- 区(轨道、柱面都从0开始编号,而扇区从1开始编号) 有着特殊的作用,它又被称为主引导记录
- (Master Boot Record, MBR)。第一轨剩余的扇区常常不使用[1]。
- [color=DarkRed]1.4 boot0 阶段[/color]
- 让我们看一下文件/boot/boot0。这是一个仅512字节的小文件。如果在FreeBSD安装过程中选择
- “bootmanager”,这个文件中的内容将被写入 硬盘MBR.
- 如前所述,INT 0x19指令装载MBR,也就是 boot0的内容,至内存地址0x7c00。再看文件
- sys/boot/i386/boot0/boot0.s,可以猜想 这里面发生了什么 - 这是引导管理器,一段由 Robert
- Nordier 书写的令人起敬的程序片段。
- MBR里,也就是boot0里,从偏移量0x1be 开始有一个特殊的结构,称为分区表。其中有4条记录
- (称为分区记录),每条记录 16字节。分区记录表示硬盘如何被划分,在FreeBSD的术语中,这被称
- 为slice(d)。16字节中有一个标志字节决定这个分区是否可引导。有仅只能有一个分区可设定这一标
- 志。否则,boot0 的代码将拒绝继续执行。
- 一个分区记录有如下域:
- * 1字节 文件系统类型
- * 1字节 可引导标志
- * 6字节 CHS格式描述符
- * 8字节 LBA格式描述符
- 一个分区记录描述符包含某一分区在硬盘上的确切位置信息。 LBA和CHS两种描述符指示相同的信
- 息,但是指示方式有所不同: LBA (逻辑块寻址,Logical Block Addressing)指示分区的起始扇区 和
- 分区长度,而CHS(柱面 磁头 扇区)指示首扇区和末扇区
- 引导管理器扫描分区表,并在屏幕上显示菜单,以便用户可以选择用于引导的磁盘和分区。在键盘
- 上按下相应的键后, boot0进行如下动作:
- * 标记选中的分区为可引导,清除以前的可引导标志
- * 记住本次选择的分区以备下次引导时作为缺省项
- * 装载选中分区的第一个扇区,并跳转执行之
- 什么数据会存在于一个可引导扇区(这里指FreeBSD扇区)的第一扇区里呢?正如你已经猜到的,那就
- 是boot2。
- [color=DarkRed]
- 1.5 boot2 阶段[/color]
- 也许你想知道,为什么boot2 是在boot0之后, 而不是在boot1之后。事实上,也有一个512字节的
- 文件boot1存放在 目录/boot里,那是用来从一张软盘引导系统的。 从软盘引导时,boot1起着
- boot0对硬盘引导相同的作用: 它找到boot2并运行之。
- 你可能已经看到有一文件/boot/mbr。 这是boot0的简化版本。 mbr中的代码不会显示菜单让用户
- 选择,而只是简单的引导被标志的分区。
- 实现boot2的代码存放在目录 sys/boot/i386/boot2/里,对应的可执行文件 在/boot里。在/boot里
- 的文件boot0 和 boot2 不会在引导过程中使用。不过使用boot0cfg 这样的工具,可将boot0指向
- MBR的实际位置。 boot2位于可引导的FreeBSD分区的开始。这些位置不受文件系统控制,所以它
- 们不可用ls之类的命令查看。
- boot2的主要任务是装载文件/boot/loader。 那是引导过程的第三阶段。在boot2中的代码不能使用
- 诸如 open()和read()之类的例程函数, 因为内核还没有被加载。而应当扫描硬盘,读取文件系统结
- 构,找到文件 /boot/loader,用BIOS的功能将它读入内存,然后从其入口点开始执行之。
- 除此之外,boot2 还可提示用户进行选择, loader可以从其它磁盘、系统单元、分区装载。
- ______
- 备注
- [1] 有些工具如 disklabel(8) 会使用这一区域存储信息,主要是在第二扇区里。
复制代码 |
|