FreeBSD完整的内核代码在FreeBSD的“/sys目录下 。其中,FreeBSD 的 Boot Manager代码是 sysbooti386boot0boot0.s,它是FreeBSD自带的Boot Manager,其功能虽然不如Linux的lilo和Grub功能强大,但它只需按一个键就可以引导,界面直观 。小小的512字节,可以给你一个简单明了的启动选择界面,还能记住你上次的选择 。以下,就对此代码进行详细分析:
当我们打开计算机电源时,计算机叽叽嘎嘎进行设备和内存检测过后就读取硬盘或者软盘的引导扇区,这个扇区只有512字节,显然这512字节不能够有多大作用,这512字节的代码被BIOS放在地址从0x0000:0x7c00开始处 。然后直接跳转到0x0000:0x7c00处去执行 。以上工作是BIOS 干的,你什么也不用作 。操作系统需要通过这个引导扇区代码再装载操作系统的其他部分 。在还没有跳转到这段代码之前,也就是BIOS把磁盘的引导扇区读入到内存之后,其DL和ES、SI寄存器的内容如下: DL:表示启动设备,例如,如果计算机是从软盘启动的则DL=0,若是从IDE的C、D盘(严格来说是物理磁盘一和物理磁盘二,而不是逻辑磁盘分区)启动的则DL分别为0x80和0x81 。如果是从硬盘启动的话,ES:SI是指向BIOS中的硬盘分区表存放的地址 。
【FreeBSD启动扇区代码分析】好了,我们现在已经知道,计算机的BIOS已经把引导扇区的512字节的内容读入到了0:0x7c00处,然后就跳转到0:0x7C00处去执行,也就是执行引导扇区代码,引导扇区代码boot0执行代码dump如下(它很有用,以后我们还不时回头来看):
上图中的4x16个字节是保留的4个分区信息下面,我们对FreeBSD启动扇区代码boot0.s进行逐步分析 。boot0.s代码如下:
#
# Copyright (c) 1998 Robert NordIEr
# All rights reserved.
#
# Redistribution and use in source and binary forms are freely
# permitted provided that the above copyright notice and this
# paragraph and the following disclaimer are duplicated in all
# such forms.
#
# This software is provided "AS IS" and without any express or
# implied warranties, including, without limitation, the implied
# warranties of merchantability and fitness for a particular
# purpose.
#以上的Coyright就不用翻译了 。# $FreeBSD: src/sys/boot/i386/boot0/boot0.s,v 1.27 2003/11/20 20:28:18 jhb Exp $以上供版本管理软件使用 # A 512-byte boot manager.
.set NHRDRV,0x475 # Number of hard drives
.set ORIGIN,0x600 # Execution address
.set FAKE,0x800# Partition entry
.set LOAD,0x7c00 # Load address
.set PRT_OFF,0x1be # Partition table
.set TBL0SZ,0x3 # Table 0 size
.set TBL1SZ,0xb # Table 1 size
.set MAGIC,0xaa55 # Magic: bootable
.set B0MAGIC,0xbb66 # Identification
.set KEY_ENTER,0x1c # Enter key scan code
.set KEY_F1,0x3b # F1 key scan code
.set KEY_1,0x02 # #1 key scan code
#
# Addresses in the sector of embedded data values.
# Accessed with negative offsets from the end of the relocated sector (雙).
#
.set _NXTDRV,-0x48 # Next drive
.set _OPT,-0x47 # Default option
.set _SETDRV,-0x46 # Drive to force
.set _FLAGS,-0x45 # Flags
.set _TICKS,-0x44 # Timeout ticks
.set _FAKE,0x0 # Fake partition entry
.set _MNUOPT,0xc # Menu options 以上是定义相关的参数值,例如“.set NHRDRV,0x475类似于C语言中的“#define NHRDRV 0x475.globl start # Entry point
.code16 # This runs in real mode
#
# Initialise segments and registers to known values.
# segments start at 0.
# The stack is immediately below the address we were loaded to.
#
start:
cld # String ops inc
xorw %ax,%ax # Zero
movw %ax,%es # Address
movw %ax,%ds # data
movw %ax,%ss # Set up
推荐阅读
- FreeBSD的Loader和内核初始化
- FreeBSD系统安装与配置之准备篇
- FreeBSD的磁盘和BIOS的关系
- 浅谈FreeBSD 5.2常用操作的改变
- freebsd7.0 安装记录
- freebsd 7 pkg_add -r kde 4
- 加快FreeBSD中pkg_add的速度
- 红米note7pro中将应用自启动关掉具体操作方法
- 在FreeBSD5.0上配置DNS服务手记
- 04 FreeBSD连载:FreeBSD的相关资源