这个例程分析由引导程序传送给内核的参数。引导内核有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:
标签: