x86下SylixOS引导过程分析
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引导过程分析相关推荐
- x86架构linux内核引导过程分析,SylixOS---x86引导过程分析
1. 上电启动流程 当x86电源打开后,CPU将自动进入实模式,并从地址0xFFFF0(CS:0xFFFF,IP:0x0)开始自动运行程序代码,此地址一般是BIOS的地址. BIOS启动后,将启动设备 ...
- oracle禁用系统用户登录,关闭系统 - 在 x86 平台上引导和关闭 Oracle Solaris
关闭系统 以下过程和示例说明如何使用 shutdown 和 init 命令关闭系统. 如何确定登录到系统的用户 对于作为多用户分时系统的 Oracle Solaris 系统,关闭系统前可能需要确定是否 ...
- Ubuntu 16.04 下开机引导修复Windows
前言: 趁着放假期间,我装了Ubuntu16.04 系统.我用了 easyBCD设置了在Windows8.1下开机引导Ubntu16.04启动,然后再关机重启(这个如何使用easyBCD我是参考网上的 ...
- pe下bootice修复Linux引导,pe下修复引导不成功?这种方法才是最有效的解决方法...
pe下修复引导不成功的话,造成系统进不去就会影响到大家使用电脑,很多人都选择重新安装系统,有些人则会选择另寻方法修复系统,下面快启动小编为大家分享详细的如何使用bootice工具修复引导,大家一起来瞧 ...
- linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程
[文章导读] 随着win10系统的流行,越来越多的小伙伴经常遇到win10系统引导丢失的情况,我们知道win10系统现在采用的是uefi引导,以前的一些修复工具都只能修复传统模式mbr格式下的硬引导, ...
- arm linux运行安卓app,Android x86 下运行纯ARM版APP
Android x86 默认不带houdini,运行纯ARM版会提示: 很抱歉,"xxxx"已停止运行 设置->应用兼容性->打开 终端模拟器 $ su # enabl ...
- 双系统下grub引导windows系统
双系统下grub引导windows系统 我在一台本来有windows的电脑上安装了arch linux,在grub里是没有windows系统的,于是搜索各种文章,花费好长时间才成功.在这里分享一下我的 ...
- linux grup进入操作系统,Linux操作系统下GRUB引导过程及原理
Linux操作系统下GRUB引导过程及原理 作者: 硅谷动力 CNETNews.com.cn 2008-09-09 19:53:52 GRUB是一个多重启动管理器.GRUB是GRand Unified ...
- java放在c盘x86_你开发的软件安装在C盘Program Files (x86)下产生的异常
## 没有躲过的坑--你开发的软件安装在C盘Program Files (x86)下产生的异常 今天偶然发现的问题,就是自己写的win32程序安装在C盘Program Files (x86)文件夹下就 ...
- x86架构linux内核引导过程分析,Linux内核x86架构引导协议7(翻译)
运行内核 内核的跳转指令在相对于内核实模式部分为0x20的内存段处.也就是说,如果你把内核的实模式部分加载到了0x90000处,那么内核入口应该在0x9020:0000处. 在进入内核前,ds.es. ...
最新文章
- mysql怎么创建表视频教程_mySQL学习入门教程——2.创建表
- MFC libraries are required for this project. Install them from the Visual Studio installer (Individu
- 无限极分类原理与实现
- python3.6.2安装教程-CentOS 6.5中安装Python 3.6.2的方法步骤
- Oracle12c 在windonServer2012中安装的步骤
- spring mvc学习(22):/textpath/*/helen
- C# 获取枚举的描述属性
- VS_VERSION_INFO信息的读取
- Java嵌入式数据库H2学习总结(一)——H2数据库入门
- SQL基础实例(学生课程系统)
- HTTPS详解SSL/TLS
- 使用ADD命令将目录复制到Docker的其他目录
- CentOS 5.5 使用 EPEL 和 RPMForge 软件库
- java中的StringUtil.isEmpty和StringUtil.isBlank
- 谈谈核心网UPF和开放
- IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
- 【基金学习】小白基金学习记录-从入门到实践(一)
- Android UI 切图命名规范、标注规范及单位描述
- mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
- [C++OpenCv] 两点距离、三点角度的计算
热门文章
- 看完这篇文章就知道为什么要使用 Node.js啦!
- 架构运维篇(五):Centos7/Linux中安装RocketMQ
- 架构运维篇(二):Centos7/Linux安装部署Tomcat环境
- 分类损失函数多元分类_二元分类为什么不能用MSE做为损失函数?
- perl判断变量是数值_Perl学习12之defined undef使用
- 傅里叶变换对_复变函数6傅里叶变换
- 快速理解浮动对标准流的影响
- Markdown 编辑器 Editor.md 预览
- $.each 中return问题
- 训练自己的数据_YOLOv3训练自己的数据集(以口罩检测数据集为例)