x86架构linux内核引导过程分析,SylixOS---x86引导过程分析

1. 上电启动流程

当x86电源打开后,CPU将自动进入实模式,并从地址0xFFFF0(CS:0xFFFF,IP:0x0)开始自动运行程序代码,此地址一般是BIOS的地址。

BIOS启动后,将启动设备的主引导记录。主引导记录位于第0磁道的第1个扇区,它的大小是512字节,里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA等。

BIOS将主引导记录读入内存绝对地址0x7C00处,并跳转到此地址运行。

在SylixOS平台中,事实上被拷贝到物理内存0x7C00处的内容就是GRUB。

2. GRUB的作用

GRUB是目前较流行启动引导程序。

GRUB(Grand Unified Bootloader)是当前Linux诸多发行版本默认的引导程序,SylixOS遵循了GRUB的引导协议Multiboot后,也可以使用GRUB进行引导。

GRUB执行后,将初始化设置内核执行所需的环境,载入内核镜像。

GRUB分为1.x版本和2.x版本,两个版本的架构有所不同,目前SylixOS启动还是使用1.x版本的GRUB。

GRUB1.x磁盘引导SylixOS全过程:

stage1

GRUB读取磁盘的第一个512字节的主引导记录MBR。

stage1.5

识别各种不同的文件系统格式,目的是为了GRUB能识别到文件系统。

stage2

载入系统引导菜单(“/boot/grub/menu.lst”或“grub.lst”),载入SylixOS的x86镜像bspx86.elf。

3. Multiboot协议

为了统一x86平台GRUB引导各式操作系统的流程,GRUB支持了Multiboot的引导协议,该协议定义了一个可识别的系统镜像文件头部应具备的格式协议,Multiboot首部定义如下表所示。

1a595c55b1beece35c9119e01025cce6.png

SylixOS参照上表所示的Multiboot首部定义规则,对SylixOS的x86镜像的Multiboot首部进行了定义,如下图所示。

ca539eff9ef0c149522895e45891cc8e.png

并且按照Multiboot的协议要求,Multiboot的首部应当位于整个elf镜像的首部位置,所以对于SylixOS的BSP镜像工程,在链接Multiboot文件时需要指定其地址,如下图所示。

e333d092dc47273e1081353c27e991fd.png

4. SylixOS启动

4.1 GRUB解析bspx86.elf

GRUB启动时,会根据menu.lst文件加载对应的系统镜像。

SylixOS的RealEvo-IDE默认提供的menu.lst文件内容如下图所示。

59728e87f0c6a9403de48683dca56302.png

在menu.lst文件中指定了GRUB启动的默认等待时间timeout、默认加载菜单项default以及各菜单条目。

如,菜单条目“title SylixOS(UP)”,其定义了使用GRUB的kernel命令引导bspx86.elf文件,并为其传递“ncpus=1 hz=1000”等参数。

GRUB的kernel命令会解析bspx86.elf文件,判断其Multiboot首部的有效性,在有效性完整判断结束之后,根据elf的头信息,对bspx86.elf的各个段进行重定位。

4.2 重定位入口地址

elf文件的头信息中包含了该elf文件众多的信息,使用elf文件分析工具等程序,可以查看elf文件头部的信息,如下图所示。

466d7a0ec4abafad9bcb99fa1e342001.png

程序的入口地址是在elf文件中设定好的,所以GRUB在将SylixOS镜像重定位后,也会将该入口地址设置在elf头信息中指定的位置。

4.3 跳转到主核入口地址

x86主核入口代码如下图所示。

cf4df4ea0bf3302b32c11dca12e9b65a.png

以SylixOS的32位系统为例,在跳转到该入口地址后,应先设置栈指针,而设置栈指针之前,需要关闭中断。

最后调用CALL命令,跳转到C程序入口bspInit,而bspInit的两个参数由%EBX和%EAX寄存器传递,分别为Multiboot的魔数和Multiboot信息结构体的首地址。

4.4 主核引导从核启动

主核引导从核启动也是遵循了Intel制定的从核启动规则。

如下图所示,BSP为BIOS引导的主核,AP为待BSP启动的从核。BSP需要首先向AP发送INIT IPI命令,之后连续发送两次STARTUP IPI命令。

INIT IPI命令与STARTUP IPI命令都是固定的带有参数的指令,通过核间中断的方式进行发送。

c2a785dd0b501de97d2d8ecd8af99194.png

INIT IPI命令可以使AP自动进行复位操作,并完成上电启动后POST自检等硬件所需流程。

STARTUP IPI命令中可以指定从核跳转到实模式执行的指令内容和地址,由此可以使从核按照SMP或AMP的流程进行初始化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值