电脑技术学习

FreeBSD的Loader和内核初始化

dn001

  loader也是一个 BTX 客户,在这里不作详述。已有一部内容全面的手册 loader(8) ,由Mike Smith书写。比loader更底层的BTX的机理已经在前面讨论过。 loader 的主要任务是引导内核。当内核被装入内存后,即被loader调用:sys/boot/common/boot.c:

  /* 从loader中调用内核中对应的exec程序 */

  module_formats[km->m_loader]->l_exec(km);loader跳转至哪里呢?那就是内核的入口点。让我们来看一下链接内核的命令:sys/conf/Makefile.i386:ld -elf -Bdynamic -T /usr/src/sys/conf/ldscript.i386 -export-dynamic

  -dynamic-linker /red/herring -o kernel -X locore.o在这一行中有一些有趣的东西。首先,内核是一个ELF动态链接二进制文件,可是动态链接器却是/red/herring,一个莫须有的文件。其次,看一下文件sys/conf/ldscript.i386,可以对理解编译内核时ld的选项有一些启发。阅读最前几行,字符串sys/conf/ldscript.i386:ENTRY(btext)

  表示内核的入口点是符号 `btext'。这个符号在locore.s中定义:sys/i386/i386/locore.s:

  .text
/**********************************************************************
*
* This is where the bootblocks start us, set the ball rolling...
* 入口
*/
NON_GPROF_ENTRY(btext)

  首先将寄存器EFLAGS设为一个预定义的值0x00000002,然后初始化所有段寄存器:sys/i386/i386/locore.s

/* 不要相信BIOS给出的EFLAGS值 */
  pushl  $PSL_KERNEL
  popfl
/*
* 不要相信BIOS给出的%fs、%gs值。相信引导过程中设定的%cs、%ds、%es、%ss值
*/
  mov %ds, %ax
  mov %ax, %fs
  mov %ax, %gs
btext调用例程recover_bootinfo(),identify_CPU(),create_pagetables()。这些例程也定在locore.s之中。这些例程的功能如下:recover_bootinfo

标签: