x86下SylixOS引导过程分析

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的流程进行初始化。

原文地址:http://blog.51cto.com/4102785/2062375

时间: 2024-07-29 08:17:37

x86下SylixOS引导过程分析的相关文章

没有躲过的坑--你开发的软件安装在C盘Program Files (x86)下产生的异常

今天偶然发现的问题,就是自己写的win32程序安装在C盘Program Files (x86)文件夹下就会产生异常,而安装在其他文件夹,即使是D盘的Program Files (x86)下,程序也可以完美运行. 引起这个,肯定是权限的问题.这个软件运行时,需要读写数据库,以及各种缓存数据. 这就是我给自己挖的一个坑儿,相信很多人也会遇到这个问题. 就是在开发程序.VS调试的时候,总喜欢使用当前路径,或者是相对路径.即把一些数据与.exe文件放在一起. 但是安装的时候,选择的是C盘Program

MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)

依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook的本质就是拦截,就算到现在也是如此认为. 本篇文章是在x86下测试与分析跳转+offset类型的Hook,并且逆推测出热补丁的简单用法,MinHook它的中心就是覆盖重写并且可以复原.知道大概的思路后后让我们先来具体的实现MinHook再去做测试. 首先是堆的申请,这是必要也必须做的,对于微软函数HeapCreate()就不再赘述,以下是实现与卸载 1 NTSTATUS

X86下,FF 25+ 导入表函数地址小测试

在X86下,JMP反汇编出来的FF 25加的是导入表的地址 测试代码如下: void JmpFunctionAddressOfImportTableInWinXP_X86() { DWORD dwOld = 0; ULONG_PTR v2 = 0; void* v1 = NULL; GetFunctionByImport_X86(GetModuleHandle(NULL), "MessageBoxA"); v1 = lpAddress; printf("%p\r\n"

Linux X86下的TLB机制分析

TLB - translation lookaside buffer 快表,直译为翻译后备缓冲器,也可以理解为页表缓冲,地址变换高速缓存. 由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据.提高访存性能的关键在于依靠页表的访问局部性.当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到,. TLB是一种高速缓存,内存管理硬件使用它来改善虚拟地址到物理地址的转换速度.当前所有的个人桌面,笔记本和服务器处理器都使用TLB来进行虚拟地址到物理地址的

X86架构下Linux启动过程分析

1.X86架构下的从开机到Start_kernel启动的整体过程 这个过程简要概述为: 开机-->BIOS-->GRUB/LILO-->Linux Kernel 其执行的流程图和重要函数例如以下图所看到的: 2.载入Linux内核(基于X86)的内存布局图 |          | 0A0000 +--------------------------+ |  Reserved for BIOS    | Do not use. Reserved for BIOS EBDA. 09A000

X86下Linux的启动过程

简介 1.系统加电复位阶段 2.BIOS启动.自检 3.加载MBR主引导程序 4.加载GRU次引导程序 5.加载操作系统内核 6.运行操作系统的第一个进程init 第一步.系统加电复位阶段 系统加电或复位后,基于80x86的特性,中央处理器将内存中所有数据清零,并对内存进行校验.如果没有错误,则CS寄存器中全部置1,IP寄存器中全部置0,即CS=FFFF[0]H,而IP=0000[0]H.[CS]:[IP]指向的就是BIOS的入口,由此进入BIOS的启动过程. 在系统加电启动过程中,实际上只有一

X86下逻辑地址、线性地址、虚拟地址和物理地址的理解

参考:http://bbs.chinaunix.net/thread-2083672-1-1.html 本贴涉及的硬件平台是X86,如果是其它平台,不保证能一一对号入座,但是举一反三,我想是完全可行的. 一.概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应. --这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,

Windows x86 下的 静态代码混淆

0x00  前言 静态反汇编之王,毫无疑问就是Ida pro,大大降低了反汇编工作的门槛,尤其是出色的“F5插件”Hex-Rays可以将汇编代码还原成类似于C语言的伪代码,大大提高了可读性.但个人觉得“F5插件”只能作为一项辅助手段,在结合动态调试和静态分析之后,了解了整个函数的流程再利用F5看“C语言”代码才是最佳的手段.而这篇文章就是学习如何手写”花指令“,来干扰ida的静态分析和”F5插件“. 0x01 反汇编引擎 反汇编引擎就是将二进制程序翻译成了汇编的工具.主流的反汇编算法主要是两种:

Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

Android 设备的CPU类型(通常称为”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 处理器.2011年15月以后的生产的大部分Android设备都使用它. arm64-v8a: 第8代.64位ARM处理器,很少设备,三星 Galaxy S6是其中之一. armeabi: 第5代.第6代的ARM处理器,早期的手机用的比较多. x86: 平板.模拟器用得比较多. x86_64: 64位的平板. 问题描述 今天测试人员测试集成版本时除了一个bug:关于华为 Mate 8手机A