SeaBIOS是一个开源的16bit x86 BIOS程序,它可以运行在模拟器上,或者是在x86硬件平台上和coreboot一起使用。这里主要介绍其运行在QEMU+KVM这样的虚拟化模拟器上的情况,对coreboot的情况暂时不说明。
BIOS程序是计算机上电后,CPU第一个开始运行的程序,完全运行在裸金属上,用于完成对系统硬件的初始化,并且为启动OS做好准备。BIOS程序跟具体的硬件具有很高的耦合度,基本上不同的硬件架构都会对应不同的BIOS程序,所以一般计算机厂商都会自己开发BIOS程序,虽然可能有很多部分是可以共用的,但是每个厂商设计的计算机硬件架构都会有区别,所以还是有一部分需要自己定制。SeaBIOS虽然是运行在模拟器上,但是也有自己适配的一套硬件架构,理解SeaBIOS适配的硬件架构(下一篇文章会讲)对于理解SeaBIOS的代码具有很重要的作用。
SeaBIOS也像正常的BIOS一样,在虚拟机上电的时候,会被加载到地址空间0xFFFFFFF0处,并且该处是一条跳转指令,虚拟机的虚拟CPU会去执行SeaBIOS的代码,完成虚拟硬件的初始化,中断服务函数的设置,ACPI表、SMBIOS表等的创建,最后引导启动OS。
SeaBIOS和正常BIOS的区别在于其运行的环境是一个由Hypervisor模拟出来的环境,有很多地方可以简化,主要表现为:
虚拟化环境中对硬件设备进行模拟的对象是硬件设备的功能及对外的接口,并不需要去模拟硬件设备的内部运行机制和设备的物理特性,所以就可以大大简化一些模拟设备的配置和初始化,其中包括: