romstage是coreboot的第二个执行阶段。本文分别介绍基于qemu模拟环境的x86的跟踪,以及基于Intel baytrail平台的跟踪。

在romstage阶段,由于内存还未初始化好,所以使用cache作为内存,此项技术称为“cache as ram”,简称为“CAR”。网络上有较多文章涉及此方面,可以查阅以了解更多。

一、qemu-i440fx

cache_as_ram文件:src\mainboard\emulation\qemu-i440fx\cache_as_ram.inc

1、保存BIST

BIST值会作为romstage主函数的参数。

 /* Save the BIST result. */movl %eax, %ebp

2、设置CAR

(注:这段代码还不是太理解)

cache_as_ram:post_code(0x20)/* Clear the cache memory region. This will also fill up the cache */movl    $CACHE_AS_RAM_BASE, %esimovl    %esi, %edimovl  $(CACHE_AS_RAM_SIZE >> 2), %ecx// movl    $0x23322332, %eaxxorl   %eax, %eax/* 使用 EAX 填写位于 ESI:EDI 的 ECX 个双字 *//* 将CACHE_AS_RAM_BASE地址的大小为CACHE_AS_RAM_SIZE区域初始化为0 */rep  stoslpost_code(0x21)/* Set up the stack pointer. */movl $(CACHE_AS_RAM_SIZE + CACHE_AS_RAM_BASE - 4), %eaxmovl %eax, %esp

3、恢复BIST值

 /* Restore the BIST result. */movl  %ebp, %eaxmovl  %esp, %ebp/* eax为BIST值,将其压栈,作为main的参数,然后调用main函数 */pushl   %eax/*测试 pushl $0xdeadbeaf*/

4、调用romstage主函数

上段代码恢复BIST值到eax寄存器后,即将eax压入栈中,接着调用main函数,这个函数在romstage.c文件中定义。

before_romstage:post_code(0x29)/* 跳转到romstage的主函数 *//* Call romstage.c main function. */call main

5、跳转到ramstage阶段

在main函数返回后,调用copy_and_run函数,之后就到了ramstage阶段了。

 /* 调用完main后,就到了copy_and_run,即ramstage阶段了 */
__main:post_code(POST_PREPARE_RAMSTAGE)cld          /* Clear direction flag. */movl $CONFIG_RAMTOP, %espmovl    %esp, %ebp/* 此处为调试用movl $9, %eaxpushl   %eax*//* 调用copy_and_run */call  copy_and_run.Lhlt:post_code(POST_DEAD_CODE)hltjmp   .Lhlt

至此,分析结束。

下面看看romstage的主函数。

4.1、main函数

代码如下:

// bist为blockboot传递的参数,intel在启动时会进行自检,正常情况下bist为0
// 在cache_as_ram.inc中会调用到此处的main
void main(unsigned long bist)
{int cbmem_was_initted;/* init_timer(); */post_code(0x05);console_init();ll_printk("qemu-i440fx romstage --BIST: 0x%x\n", (unsigned int)bist);/* Halt if there was a built in self test failure */report_bist_failure(bist);//print_pci_devices();//dump_pci_devices();cbmem_was_initted = !cbmem_recovery(0);timestamp_init(timestamp_get());timestamp_add_now(TS_START_ROMSTAGE);}

很简单,调用console_init函数初始化终端,在该函数中会打印coreboot的版本号以及编译时间。如果传入的参数的bist值不为0,则出错,直接挂机。

注:ll_printk为代码使用的打印函数,本文中使用bist值(即cache_as_ram.inc的eax寄存器)以跟踪执行流程。
流程图示如下:

二、baytrail-fsp

(李迟按:留空待写)

注:

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

李迟 2016.3.15 周二 夜

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

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

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

  2. coreboot学习3:启动流程跟踪之bootblock阶段

    coreboot的第一个启动阶段为bootblock.该阶段均使用汇编语言编写.下面根据执行文件顺序介绍. 一.reset16.inc bootlbock的最开始执行的文件为src\cpu\x86\1 ...

  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. 51单片机怎么编程,有什么好的课程?
  2. 一个大型网游需要哪些代码块_你会因为网游的非公平性,而转投单机游戏阵营吗?...
  3. python基础语法总结-Python基础语法精心总结!看完都知道的可以往下继续学习了...
  4. 如何把SAP WebIDE里的Web项目同Github仓库连接起来
  5. 学用 TStringGrid [1] - ColCount、RowCount、Cells
  6. 【JS 逆向百例】如何跟栈调试?某 e 网通 AES 加密分析
  7. 数据结构与算法——图解平衡二叉树及代码实现
  8. 2015手机病毒暴涨16倍 每天70万人次连接风险WiFi
  9. ‘adb‘ 不是内部或外部命令and Error while executing: am start -n解决
  10. vs2008软件测试实战 3 web test(1)
  11. 人工智能、区块链、算法...这30个大数据热词你知道吗?
  12. ArcGIS Server 10.1发布数据源为ArcSDE(直连)的MXD【转】
  13. 腾讯翻译君API使用笔记
  14. xlsx文件怎么打开
  15. jsp页面打开为空白页
  16. 扫雷游戏(基础版本)
  17. 视频惠民发布平台助力智慧城市升级
  18. List元素自动排序
  19. 使用SPSS进行多元回归分析
  20. Dell戴尔服务器添加新硬盘认不到解决方法

热门文章

  1. mysql show tables_MySQL防误删插件Recycle-Bin简介
  2. 终于迎来大改变!iPhone 14全系标配120Hz高刷屏+6GB内存
  3. 微拍堂推出“正义联盟计划” 助力文玩行业高质量发展
  4. 哪吒汽车宣布获得上海银行总行20亿元综合授信额度
  5. iQOO Z5内置5000mAh大电池:超长续航安全感爆棚
  6. 滴滴更新招股书:预计定价13.5美元 最多筹集约46亿美元
  7. 滴滴等8家网约车平台将增设“一键叫车”功能 便利老年人打车
  8. 一个德国设计奖,怎么就成了中国品牌的财富密码
  9. 山寨机来了:小米10至尊、透明版只要688
  10. 前一天还在聊抢票,第二天就被裁了,年底是互联网行业的寒冬吗?