电脑技术学习

FreeBSD操作系统的boot2阶段

dn001

  工具btxld是链接器,它将两个二进制代码链接在一起。btxld(8)和ld(1)的区别是ld通常将两个目标文件链接成一个动态链接库或可执行文件,而btxld则将一个目标文件与BTX链接起来,产生适合于放在分区首部的二进制代码,以实现系统引导。

  boot0执行跳转至BTX的入口点。然后,BTX将处理器切换至保护模式,并准备一个简单的环境,然后调用客户。这个环境包括:

  虚拟8086模式。这意味着BTX是虚拟8086的监视程序。实模式指令,如pushf, popf, cli, sti, if,均可被客户调用。

  建立中断描述符表(Interrupt Descriptor Table, IDT),使得所有的硬件中断可被缺省的BIOS程序处理。建立中断0x30,这是系统调用关口。

  两个系统调用exec和 exit的定义如下:

sys/boot/i386/btx/lib/btxsys.s:
    .set INT_SYS,0x30    # 中断号
#
# System call: exit
#
__exit:   xorl %eax,%eax     # BTX系统调用0x0
    int $INT_SYS      #
#
# System call: exec
#
__exec:   movl $0x1,%eax     # BTX系统调用0x1
    int $INT_SYS      #

  BTX建立全局描述符表(Global Descriptor Table, GDT):

sys/boot/i386/btx/btx/btx.s:
gdt:    .Word 0x0,0x0,0x0,0x0    # 以空为入口
    .word 0xffff,0x0,0x9a00,0xcf  # SEL_SCODE
    .word 0xffff,0x0,0x9200,0xcf  # SEL_SDATA
    .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
    .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
    .word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE
    .word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA
    .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS

  客户的代码和数据始于地址MEM_USR(0xa000),选择符(selector) SEL_UCODE指向客户的数据段。选择符 SEL_UCODE 拥有第3级描述符权限(Descriptor Privilege Level, DPL),这是最低级权限。但是INT 0x30 指令的处理程序存储于另一个段里,这个段的选择符SEL_SCODE (supervisor code)由有着管理级权限。正如代码建立IDT(中断描述符表)时进行的操作那样:

标签: