coreboot的第一个启动阶段为bootblock。该阶段均使用汇编语言编写。下面根据执行文件顺序介绍。

一、reset16.inc

bootlbock的最开始执行的文件为src\cpu\x86\16bit\reset16.inc。该文件十分简单,如下:

 .section ".reset", "ax", %progbits.code16
.globl  _start
_start:.byte  0xe9.int   _start16bit - ( . + 2 )/* Note: The above jump is hand coded to work around bugs in binutils.* 5 byte are used for a 3 byte instruction.  This works because x86* is little endian and allows us to use supported 32bit relocations* instead of the weird 16 bit relocations that binutils does not* handle consistenly between versions because they are used so rarely.*/.previous

里面的_start16bit在entry16.inc中定义。

二、 entry16.inc

从文件src\cpu\x86\16bit\ entry16.inc名称上看出,该文件为16位的汇编代码,主要做一些初始工作,接着便进入到保护模式。

下面语句定义其为16位代码段。

.code16
.globl _start16bit
.type _start16bit, @function

1、关中断:

_start16bit:/* 关中断 */cli

2、保存BIST的值

 /* Save the BIST result *//* 保存eax的BIST(Built-In Self-Test)的值,上电或复位后,eax值为0表示所有的测试通过,参见intel开发文档3A 9.1.2 */movl    %eax, %ebp

3、将cr3清零

 /* cr3清零,使TLB无效(cache无效) — CR3:页目录基址的物理地址和PCD和PWT标志位(和CACHE有关) */xorl    %eax, %eaxmovl  %eax, %cr3    /* Invalidate TLB*/

4、

 movw    %cs, %axshlw    $4, %axmovw $nullidt_offset, %bxsubw    %ax, %bxlidt    %cs:(%bx)movw   $gdtptr16_offset, %bxsubw   %ax, %bxlgdtl   %cs:(%bx)

5、进入保护模式

主要是设置cr0寄存器,其中PE为1表示保护模式。

 /* 进入保护模式 PE为1 */movl   %cr0, %eaxandl  $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */orl    $0x60000001, %eax /* CD, NW, PE = 1 */movl %eax, %cr0

6、恢复BIST值到eax寄存器

 /* 重新赋值BIST到eax *//* 测试用的 -- movl $0xab, %eax*//* Restore BIST to %eax */movl   %ebp, %eax

7、跳转到保护模式

 /* Now that we are in protected mode jump to a 32 bit code segment. */ljmpl $ROM_CODE_SEG, $__protected_start

之后便到entry32.inc文件。

三、entry32.inc

文件:src\cpu\x86\16bit\ entry32.inc。开始处的.code32定义其为32位代码段。

1、GDT表相关定义
GDT表中有三个表项:
第一个是GDT表项的基地址和大小作为limit。
第二个是基地址为0x00000000段界限为4GB的代码段。
第三个是与第二个相同地址的数据段。

 /* This is the GDT for the ROM stage part of coreboot. It* is different from the RAM stage GDT which is defined in* c_start.S*/.align   4
.globl gdtptr
gdt:
gdtptr:.word    gdt_end - gdt -1 /* compute the table limit */.long gdt      /* we know the offset */.word  0/* selgdt 0x08, flat code segment */.word  0xffff, 0x0000.byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit *//* selgdt 0x10,flat data segment */.word 0xffff, 0x0000.byte 0x00, 0x93, 0xcf, 0x00/* selgdt 0x18, flat code segment (64-bit) */.word   0xffff, 0x0000.byte   0x00, 0x9b, 0xaf, 0x00gdt_end:

2、保存BIST值

 lgdt    %cs:gdtptrljmp  $ROM_CODE_SEG, $__protected_start__protected_start:/* Save the BIST value */movl    %eax, %ebp

3、把除了CS以外的数据段全部加载到第三个GDT表项上。

 movw    $ROM_DATA_SEG, %axmovw  %ax, %dsmovw    %ax, %esmovw    %ax, %ssmovw    %ax, %fsmovw    %ax, %gs

4、恢复BIST值

 /* Restore the BIST value to %eax *//* 恢复BIST值到eax,以qemu x86为例,在cache as ram阶段,会保存此值,而最后romstage入口函数参数即为BIST *//* 测试用的 -- movl $0xaa, %eax */movl   %ebp, %eax

以上是简单的代码注释。其中BIST贯穿着整个阶段,它是romstage入口函数的参数。BIST为英文“Built-In Self-Test”简称,在CPU上电或复位后,如果eax的值为0,则表示测试通过,参考intel软件开发人员文档3A 9.1.2。关于GDT表相关知识,可以参阅于渊编写的《Orange'S:一个操作系统的实现》。

另外:

在代码分析时,使用临时值赋给eax寄存器,作为跟踪的一个手段。

对于coreboot代码编译生成还未十分掌握、理解。

本文未对跳转到下一阶段romstage做分析。

注:

由于coreboot方面资料较少,笔者第一次尝试分析代码,还有众多未能参透的地方,难免出错。任何问题,欢迎一起交流学习。

参考资料:

Intel 64 and IA-32 Architectures Software Developer’s Manual手册下载地址:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

coreboot仓库:https://github.com/coreboot/coreboot

http://blog.csdn.net/shuanghuo9/article/details/6574261

Orange'S:一个操作系统的实现:https://book.douban.com/subject/3735649/

李迟 2016.3.14 周一 晚

coreboot学习3:启动流程跟踪之bootblock阶段相关推荐

  1. coreboot学习4:启动流程跟踪之romstage阶段

    romstage是coreboot的第二个执行阶段.本文分别介绍基于qemu模拟环境的x86的跟踪,以及基于Intel baytrail平台的跟踪. 在romstage阶段,由于内存还未初始化好,所以 ...

  2. coreboot学习5:启动流程跟踪之ramstage阶段主干分析

    ramstage阶段涉及比较多的操作,比如枚举板子上的外围设备,分配资源(PCI),使能设备.本文根据该阶段的主干函数流程做分析,细节方面不涉及.理顺这个主干,从全局上把控大致流程. romstage ...

  3. I.MX6 Linux Qt 启动流程跟踪

    /*************************************************************************** I.MX6 Linux Qt 启动流程跟踪* ...

  4. 从MDK分散加载文件学习STM32启动流程

    一直在用ARM的Cortex-M系列做产品开发,也陆陆续续学习了ARM的启动流程.汇编启动文件,但是总感觉没有连贯的把全部知识串起来,不知道某些汇编语句为什么要这么写,没法按照自己的情况进行修改.今天 ...

  5. 【树莓派不吃灰】命令篇⑥ 了解树莓派Boot分区,学习Linux启动流程

    目录 1. Linux启动过程 1.1 内核引导 1.2 运行init初始化进程 -- 初始化系统环境 1.3 运行级别 -- runlevel 1.4 系统初始化 -- 加载开机启动程序 1.5 用 ...

  6. openfire服务器源码阅读学习之启动流程(一)

    openfire启动流程(ServerStarter类.XMPPServer类) 首先从org.jivesoftware.openfire.starter包下的ServerStarter.java文件 ...

  7. android源码学习- APP启动流程(android12源码)

    前言: 百度一搜能找到很多讲APP启动流程的,但是往往要么就是太老旧(还是基于android6去分析的),要么就是不全(往往只讲了整个流程的一小部分).所以我结合网上现有的文章,以及源码的阅读和调试, ...

  8. Activiti学习——生成历史流程跟踪图

    需求说明 流程在流转或者结束后,可以查看其流转历史流程图 效果图 实现思路 获取流程图 获取指定流程的流转环节 获取每个流转环节之间的线 根据流程图,环节,线绘制流转历史流程图 实现代码 @Contr ...

  9. coreboot学习10:coreboot第一阶段学习小结

    时间过得真快,从今年2月份开始到4月份,断断续续摸索coreboot的源码.限于精力但又不想让人误以为笔者是个容易放弃的人,只好匆匆将前面所做的工作称为第一阶段,用时髦的话,也叫一期工程.此文做些阶段 ...

最新文章

  1. hp惠普笔记本电脑黑屏大小写锁定键闪烁报错无法开机怎么办?
  2. iOS viewDidUnload方法
  3. 【Android】Home键
  4. jQuery初识 - jQuery案例练习
  5. POJ 1986:Distance Queries(倍增求LCA)
  6. 【iCore2模块】VGA模块样板谍照!
  7. poj 3368 Frequent values rmq
  8. Tengine(Nginx)配置SSL(https),应用服务器(Tomcat)无需配置
  9. 如何在spring框架中解决多数据源的问题[转]
  10. 无人驾驶项目——交通标志识别
  11. shell(30) : 批量修改文件后缀
  12. 手机远程连接服务器工具:RD client远程桌面使用教程
  13. MCSA / Windows Server 2016 安装,配置和管理 Nano Server
  14. 【入门必备】如何学习一门编程语言——这些你一定要知道
  15. 计算机x线平扫对人健康有影响吗,X线检查-医学影像频道-家庭医生在线 第16页...
  16. GDAL+Python实现栅格影像处理之栅格矢量化及矢量栅格化
  17. 老贾笔记--轻轻松松oracle之logmnr篇[吃顿饭的功夫学恢复误删除(delete)的数据]
  18. 显著性检验【t-test、方差分析、ks检验】
  19. 3dmax动画学习阶段总结
  20. C语言中##和#的作用

热门文章

  1. 网信办:网络音视频等平台不得诱导未成年人参与应援集资等活动
  2. 苹果ios15.4RC版发布:新增口罩面容解锁功能
  3. 比尔·盖茨录视频祝大家“新春快乐
  4. 华为P50 Pro外观基本确认:居中开孔全面屏,首发鸿蒙操作系统
  5. 刘强东退出武汉京东世纪贸易有限公司经理一职
  6. 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
  7. 雷军晒十多年前的手机:支持无线充电、内置8GB存储
  8. 笑喷!小区封闭男子将头伸出围栏外理发:又好笑又心酸
  9. 41款App存在违规收集用户信息 明年将制定个人信息保护法
  10. 一加7T Pro最新渲染图曝光:背部有小改动