电脑技术学习

FreeBSD的Loader和内核初始化

dn001

  movl  physfree, %esi
  pushl  %esi    /* 送给init386()的第一个参数 */
  call  _init386  /* 设置386芯片使之适应Unix工作 */
  call  _mi_startup /* 自动配置硬件,挂接根文件系统,等 */
  hlt   /* 不再返回到这里! */

  1.7.1 init386()init386()定义在sys/i386/i386/Machdep.c中,它针对Intel 386芯片进行低级初始化。loader已将CPU切换至保护模式。loader已经建立了最早的任务。译者注: 每个"任务"都是与其它“任务相对独立的执行环境。

  任务之间可以分时切换,这为并发进程/线程的实现提供了必要基础。对于Intel 80x86任务的描述,在这个任务中,内核将继续工作。在讨论其代码前,我将处理器对保护模式必须完成的一系列准备工作一并列出:

  初始化内核的可调整参数,这些参数由引导程序传来准备GDT(全局描述符表)

  准备IDT(中断描述符表)初始化系统控制台初始化DDB(内核的点调试器),如果它被编译进内核的话初始化TSS(任务状态段)准备LDT(局部描述符表)建立proc0(0号进程,即内核的进程)的pcb(进程控制块)init386()首先初始化内核的可调整参数,这些参数由引导程序传来。先设置环境指针(environment pointer, envp)调用,再调用init_param1()。

  envp指针已由loader存放在结构bootinfo中:sys/i386/i386/machdep.c:

  kern_envp = (CADdr_t)bootinfo.bi_envp + KERNBASE;

  /* 初始化基本可调整项,如hz等 */

  init_param1();

  init_param1()定义在sys/kern/subr_param.c之中。这个文件里有一些sysctl项,两个函数,init_param1()和init_param2()。这两个函数从init386()中调用:sys/kern/subr_param.c

标签: