SeaBIOS程序的各种入口点都在src/romlayout.S这个文件中定义了,启动包括了vCPU上电后开始执行的起点src/romlayout.S:reset_vector,该位置会被QEMU加载到vCPU物理空间的0xFFFFFFF0位置。该处的指令是一个跳转指令,该指令会跳转到src/romlayout.S:entry_post位置,然后判断是否是系统resume,如果不是则跳转到post.c:handle_post()函数处,开始POST(Power On Self Test)阶段。
post.c:handle_post()主要执行如下操作:
初始化debug串口
将SeaBIOS程序拷贝到0xC0000 ~ 0x100000内存区域,并且将这段内存区域的属性设置为可写的。
检测当前平台信息,如使用的芯片组类型,内存大小等,创建相应的E820表表项,设置内存分配函数分配内存时从哪些内存区域获取内存。
跳转到maininit()函数
maininit()函数会对各种系统资源进行初始化,然后寻找可启动的设备,详细步骤如下:
对系统的各种接口进行初始化,主要是软件上的接口,没怎么动到其他硬件