2019独角兽企业重金招聘Python工程师标准>>>

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首部定义如下表所示。

Offset Type Field Name Note
0 u32 magic required
4 u32 flags required
8 u32 checksum required
12 u32 header_addr if flags[16] is set
16 u32 load_addr if flags[16] is set
20 u32 load_end_addr if flags[16] is set
24 u32 bss_end_addr if flags[16] is set
28 u32 entry_addr if flags[16] is set
32 u32 mode_type if flags[02] is set
36 u32 width if flags[02] is set
40 u32 height if flags[02] is set
44 u32 depth if flags[02] is set

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

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

4. SylixOS启动

4.1 GRUB解析bspx86.elf

GRUB启动时,会根据menu.lst文件加载对应的系统镜像。 SylixOS的RealEvo-IDE默认提供的menu.lst文件内容如下图所示。

在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文件头部的信息,如下图所示。

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

4.3 跳转到主核入口地址

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

以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命令都是固定的带有参数的指令,通过核间中断的方式进行发送。

INIT IPI命令可以使AP自动进行复位操作,并完成上电启动后POST自检等硬件所需流程。 STARTUP IPI命令中可以指定从核跳转到实模式执行的指令内容和地址,由此可以使从核按照SMP或AMP的流程进行初始化。

转载于:https://my.oschina.net/wPCBsKzQ/blog/1608992

x86下SylixOS引导过程分析相关推荐

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

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

  2. oracle禁用系统用户登录,关闭系统 - 在 x86 平台上引导和关闭 Oracle Solaris

    关闭系统 以下过程和示例说明如何使用 shutdown 和 init 命令关闭系统. 如何确定登录到系统的用户 对于作为多用户分时系统的 Oracle Solaris 系统,关闭系统前可能需要确定是否 ...

  3. Ubuntu 16.04 下开机引导修复Windows

    前言: 趁着放假期间,我装了Ubuntu16.04 系统.我用了 easyBCD设置了在Windows8.1下开机引导Ubntu16.04启动,然后再关机重启(这个如何使用easyBCD我是参考网上的 ...

  4. pe下bootice修复Linux引导,pe下修复引导不成功?这种方法才是最有效的解决方法...

    pe下修复引导不成功的话,造成系统进不去就会影响到大家使用电脑,很多人都选择重新安装系统,有些人则会选择另寻方法修复系统,下面快启动小编为大家分享详细的如何使用bootice工具修复引导,大家一起来瞧 ...

  5. linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程

    [文章导读] 随着win10系统的流行,越来越多的小伙伴经常遇到win10系统引导丢失的情况,我们知道win10系统现在采用的是uefi引导,以前的一些修复工具都只能修复传统模式mbr格式下的硬引导, ...

  6. arm linux运行安卓app,Android x86 下运行纯ARM版APP

    Android x86 默认不带houdini,运行纯ARM版会提示: 很抱歉,"xxxx"已停止运行 设置->应用兼容性->打开 终端模拟器 $ su # enabl ...

  7. 双系统下grub引导windows系统

    双系统下grub引导windows系统 我在一台本来有windows的电脑上安装了arch linux,在grub里是没有windows系统的,于是搜索各种文章,花费好长时间才成功.在这里分享一下我的 ...

  8. linux grup进入操作系统,Linux操作系统下GRUB引导过程及原理

    Linux操作系统下GRUB引导过程及原理 作者: 硅谷动力 CNETNews.com.cn 2008-09-09 19:53:52 GRUB是一个多重启动管理器.GRUB是GRand Unified ...

  9. java放在c盘x86_你开发的软件安装在C盘Program Files (x86)下产生的异常

    ## 没有躲过的坑--你开发的软件安装在C盘Program Files (x86)下产生的异常 今天偶然发现的问题,就是自己写的win32程序安装在C盘Program Files (x86)文件夹下就 ...

  10. x86架构linux内核引导过程分析,Linux内核x86架构引导协议7(翻译)

    运行内核 内核的跳转指令在相对于内核实模式部分为0x20的内存段处.也就是说,如果你把内核的实模式部分加载到了0x90000处,那么内核入口应该在0x9020:0000处. 在进入内核前,ds.es. ...

最新文章

  1. mysql怎么创建表视频教程_mySQL学习入门教程——2.创建表
  2. MFC libraries are required for this project. Install them from the Visual Studio installer (Individu
  3. 无限极分类原理与实现
  4. python3.6.2安装教程-CentOS 6.5中安装Python 3.6.2的方法步骤
  5. Oracle12c 在windonServer2012中安装的步骤
  6. spring mvc学习(22):/textpath/*/helen
  7. C# 获取枚举的描述属性
  8. VS_VERSION_INFO信息的读取
  9. Java嵌入式数据库H2学习总结(一)——H2数据库入门
  10. SQL基础实例(学生课程系统)
  11. HTTPS详解SSL/TLS
  12. 使用ADD命令将目录复制到Docker的其他目录
  13. CentOS 5.5 使用 EPEL 和 RPMForge 软件库
  14. java中的StringUtil.isEmpty和StringUtil.isBlank
  15. 谈谈核心网UPF和开放
  16. IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
  17. 【基金学习】小白基金学习记录-从入门到实践(一)
  18. Android UI 切图命名规范、标注规范及单位描述
  19. mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
  20. [C++OpenCv] 两点距离、三点角度的计算

热门文章

  1. 看完这篇文章就知道为什么要使用 Node.js啦!
  2. 架构运维篇(五):Centos7/Linux中安装RocketMQ
  3. 架构运维篇(二):Centos7/Linux安装部署Tomcat环境
  4. 分类损失函数多元分类_二元分类为什么不能用MSE做为损失函数?
  5. perl判断变量是数值_Perl学习12之defined undef使用
  6. 傅里叶变换对_复变函数6傅里叶变换
  7. 快速理解浮动对标准流的影响
  8. Markdown 编辑器 Editor.md 预览
  9. $.each 中return问题
  10. 训练自己的数据_YOLOv3训练自己的数据集(以口罩检测数据集为例)