电脑技术学习

FreeBSD的Loader和内核初始化

dn001

  这个例程分析由引导程序传送给内核的参数。引导内核有3种方式:由loader引导(如前所述), 由老式磁盘引导块引导,无盘引导方式。这个函数决定引导方式,并将结构struct bootinfo存储至内核内存。identify_CPU 这个函数侦测CPU类型,将结果存放在变量_cpu中。create_pagetables 这个函数为分页表在内核内存空间顶部分配一块空间,并填写一定内容 下一步是开启VME(如果CPU有这个功能): 

testl  $CPUID_VME, R(_cpu_feature)
  jz 1f
  movl  %cr4, %eax
  orl $CR4_VME, %eax
  movl  %eax, %cr4

  然后,启动分页模式:/* Now enable paging */

  movl  R(_IdlePTD), %eax
  movl  %eax,%cr3      /* load ptd addr into mmu */
  movl  %cr0,%eax      /* get control Word */
  orl $CR0_PE|CR0_PG,%eax   /* enable paging */
  movl  %eax,%cr0      /* and let's page NOW! */

  由于分页模式已经启动,原先的实地址寻址方式随即失效。

  随后三行代码用来跳转至虚拟地址:  pushl  $begin       

  /* jump to high virtualized address */

  ret

  /* 现在跳转至KERNBASE,那里是操作系统内核被链接后真正的入口 */

  begin:

  函数init386()被调用;随参数传递的是一个指针,指向第一个空闲物理页。

  随后执行mi_startup()。init386是一个与硬件系统相关的初始化函数,mi_startup()是个与硬件系统无关的函数(前缀'mi_'表示Machine Independent,不依赖于机器)。内核不再从mi_startup()里返回;调用这个函数后,内核完成引导:sys/i386/i386/locore.s:

标签: