对于一种新东西的学习,如果有看得到、摸得着的演示,比单纯看理论知道更容易理解。在未对coreboot进行代码级别分析之前,用一个实例来看看coreboot到底长什么样子。

本文讲述如何在linux环境中编译coreboot,并使用qemu模拟器来启动。

一、下载

coreboot的发布版本下载地址为:https://www.coreboot.org/releases/,最新版本为2016年1月份发布的4.3。

coreboot的主分支仓库地址为:https://github.com/coreboot/coreboot,有超过100多人开发维护,一直在更新。

笔者研究使用的coreboot仓库地址为:https://github.com/latelee/coreboot。

二、编译

本文所用的系统为ubuntu 14.04,32位桌面版本。

1、基本环境

安装必须的开发工具、库:

$ sudo apt-get install m4 bison flex

进入coreboot源码目录,安装iasl(注:笔者使用apt-get方式安装无法正常编译):

$ make iasl

2、配置

对coreboot进行配置,输入:
$ make menuconfig
注意:
1、在“通用设置”(General setup),要选择“Allow building with any toolchain”,否则要make crossgcc来新建一个交叉编译器。如下:
General setup  --->
[*] Allow building with any toolchain

2、主板使用模拟器,选择x86。
Mainboard  --->
Mainboard vendor (Emulation)  --->
Mainboard model (QEMU x86 i440fx/piix4 (aka qemu -M pc))  --->
ROM chip size (8192 KB (8 MB))  ---> (flash大小)

3、Payload选择,可以选择配置不同类型的payload

( ) An ELF executable payload
( ) FILO
( ) GRUB2
( ) SeaBIOS
( ) U-Boot (Experimental)
( ) A Linux payload
( ) Tiano Core

选择SeaBIOS:
Payload  --->  
 Add a payload (SeaBIOS)  --->
 SeaBIOS version (1.9.0)  --->

另外还可以选择U-Boot:
Payload  --->  
 Add a payload (U-Boot (Experimental))  --->
 U-Boot version (v2016.1)  --->

其它默认即可。

3、编译

直接使用make进行编译。

$ make

注意:

3rdparty目录文件为第三方git仓库管理,如果使用coreboot的git仓库版本,则会在编译过程自动clone里面的仓库((如vboot和arm-trusted-firmware)再进行编译。但发布版本中已经包含了第三方库(如vboot和arm-trusted-firmware)的源码。

另外,在编译过程中会下载用户选择的payload,然后一起编译,这是在Makefile.inc中控制的。

最终生成烧写文件coreboot.rom,位于build目录。

三、qemu环境

安装qemu模拟器(qemu-system-x86为只针对x86平台的工具):
$ sudo apt-get install qemu-system-x86

注意,qemu还有其它平台的,可以根据需要选择。具体如下:
* qemu-system-arm
* qemu-system-mips
* qemu-system-misc
* qemu-system-ppc
* qemu-system-sparc
* qemu-system-x86

四、启动qemu

由于本文只关注coreboot,无须用其启动操作系统。启动命令如下:

$ qemu-system-i386 -nographic -bios coreboot/build/coreboot.rom

如果使用操作系统,则要用-hda指定磁盘文件。ubuntu下制定小型根文件系统十分简单,请参阅本站文章。示例命令如下:

qemu-system-i386 -nographic -bios coreboot/build/coreboot.rom -hda rootfs/disk.img

coreboot的默认payload为seabios,它可以启动安装好grub的linux系统。

五、启动信息

下面是部分的启动信息,默认使用seabios作为payload。
POST: 0x05
QEMU debugcon not found [port 0x402]coreboot-248fb13 Mon Feb 15 12:38:01 UTC 2016 romstage starting...
CBMEM:
IMD: root @ 07fff000 254 entries.
IMD: root @ 07ffec00 62 entries.
CBFS @ 100 size 7fff00
CBFS: 'Master Header Locator' located CBFS at [100:800000)
CBFS: Locating 'fallback/ramstage'
CBFS: Found @ offset 35c0 size a018
QEMU debugcon not found [port 0x402]coreboot-248fb13 Mon Feb 15 12:38:01 UTC 2016 ramstage starting...
POST: 0x39
Moving GDT to 07ffe8a0...ok
POST: 0x80
POST: 0x70
POST: 0x71
POST: 0x72
Enumerating buses...
Show all devs... Before device enumeration.
Root Device: enabled 1
CPU_CLUSTER: 0: enabled 1IMD SMALL   1. 07ffe000 00001000
CONSOLE     2. 07fde000 00020000
IRQ TABLE   3. 07fdd000 00001000
ACPI        4. 07fb9000 00024000
SMBIOS      5. 07fb8000 00000800
COREBOOT    6. 07fb0000 00008000
IMD small region:IMD ROOT    0. 07ffec00 00000400CAR GLOBALS 1. 07ffeac0 00000140ROMSTAGE    2. 07ffeaa0 00000004GDT         3. 07ffe8a0 00000200
POST: 0x7a
CBFS @ 100 size 7fff00
CBFS: 'Master Header Locator' located CBFS at [100:800000)
CBFS: Locating 'fallback/payload'
CBFS: Found @ offset d640 size ec9bJumping to boot code at 000ff06e(07fb0000)
POST: 0xf8
CPU0: stack: 00117000 - 00118000, lowest used address 00117bbc, stack used: 1092 bytes
entry    = 0x000ff06e
lb_start = 0x00100000
lb_size  = 0x000203a8
buffer   = 0x07f6f000
SeaBIOS (version 1.9.1-20160218_213012-localhost)
BUILD: gcc: (Ubuntu 4.8.2-19ubuntu1) 4.8.2 binutils: (GNU Binutils for Ubuntu) 2.24
SeaBIOS (version 1.9.1-20160218_213012-localhost)
BUILD: gcc: (Ubuntu 4.8.2-19ubuntu1) 4.8.2 binutils: (GNU Binutils for Ubuntu) 2.24
Found coreboot cbmem console @ 7fde000
Found mainboard Emulation QEMU x86 i440fx/piix4
Relocating init from 0x000e4820 to 0x07f64850 (size 46880)
Found CBFS header at 0xff800138
multiboot: eax=0, ebx=0
Found 6 PCI devices (max PCI bus is 00)
Copying SMBIOS entry point from 0x07fb8000 to 0x000f7180
Copying ACPI RSDP from 0x07fb9000 to 0x000f7160
Copying PIR from 0x07fdd000 to 0x000f70e0
Using pmtimer, ioport 0xe408
Scan for VGA option rom
Running option rom at c000:0003
Turning on vga text mode console
SeaBIOS (version 1.9.1-20160218_213012-localhost)
All threads complete.
Found 1 lpt ports
Found 1 serial ports
ATA controller 1 at 1f0/3f4/0 (irq 14 dev 9)
ATA controller 2 at 170/374/0 (irq 15 dev 9)
PS2 keyboard initialized
DVD/CD [ata1-0: QEMU DVD-ROM ATAPI-4 DVD/CD]
Searching bootorder for: /pci@i0cf8/*@1,1/drive@1/disk@0
All threads complete.
Scan for option roms
Running option rom at c900:0003
pmm call arg1=1
pmm call arg1=0
pmm call arg1=1
pmm call arg1=0
Searching bootorder for: /pci@i0cf8/*@3Press ESC for boot menu.

下面是使用U-Boot作为payload的信息:

entry    = 0x01110015
lb_start = 0x00100000
lb_size  = 0x00021070
buffer   = 0x07f6c000
[LL DEBUG]: jmp_payload() coreboot end==============================
Coreboot mission complete,PAYLOAD coming up......U-Boot 2016.01 (Mar 06 2016 - 09:53:38 +0800)CPU: x86, vendor Intel, device 663h
DRAM:  127.6 MiB
Using default environmentVideo: No video mode configured in coreboot!
Model: QEMU x86 (I440FX)
Net:   No ethernet found.
IDE:   Bus 0: OK Bus 1: OKDevice 0: not availableDevice 1: not availableDevice 2: Model: QEMU Firm: 2.0. Ser#: QEMU DVD-ROMType: Removable CD ROMCapacity: not availableDevice 3: not available
=>
=> versionU-Boot 2016.01 (Mar 09 2016 - 09:53:38 +0800)
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
GNU ld (GNU Binutils for Ubuntu) 2.24
coreboot-4.3-367-gd161e1e-dirty (Thu Mar  3 14:09:29 UTC 2016)

李迟 2016.3.11 周五 夜

coreboot学习1:编译并使用qemu模拟相关推荐

  1. 为 QEMU ARM 仿真器编译 Linux 内核:QEMU 模拟 ARM 环境

    QEMU 是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以 GPL 许可证分发源码的模拟处理器,在GNU/Linux 平台上使用广泛.简单来说,QEMU 是一个虚拟机,与常见的 Vm ...

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

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

  3. coreboot学习2:项目源码的初步了解

    本文主要介绍coreboot源码的目录结构和其它一些东西. 一.目录结构 1.一级目录 coreboot的一级目录比较少,现分别简单. src:源码目录,后文再介绍. util:工具目录,编译使用到的 ...

  4. 用QEMU模拟ARM开发板,搭建Linux kernel运行环境

    前言 有的时候我们想调试linux kernel或者linux应用程序,但是又没有硬件环境,这个时候可以选择用模拟器的方法,模拟出一个硬件环境. Android emulator Android系统的 ...

  5. 用QEMU模拟调试裸机ARM64汇编,支持gdb单步调试

    完全是方便自己查询,做个记录. 树莓派4的SOC是ARM64, cortex A72,支持最新的ARMv8指令集,且有众多的开源资料,适合用来学习ARM64汇编,其他芯片大同小异,遇到需要,再进一步研 ...

  6. QEMU模拟FriendlyArm的Mini2440开发板

    这篇博文中主要从以下几点进行叙述: 1.Mini2440开发板和QEMU模拟器简介 2.编译适配Mini2440的QEMU 3.Buildroot (2012.05)的使用 4.在QEMU中运行编译好 ...

  7. 在qemu模拟的aarch32上使用kgtp

    KGTP 介绍 KGTP 是一个能在产品系统上实时分析 Linux 内核和应用程序(包括 Android)问题的全面动态跟踪器. 使用 KGTP 不需要 在 Linux 内核上打 PATCH 或者重新 ...

  8. qemu模拟armlinux执行目标文件系统的可执行文件

    --------------------以下是2020年更新的内容 不需要自己编译qemu,直接apt安装一个静态编译版本的qemu apt install qemu-user-static进入解包的 ...

  9. QEMU模拟vexpress-a9 搭建Linux kernel运行环境

    众所周知,QEMU是一个可以模拟ARM架构的虚拟机,拥有高速.开源.跨平台.支持多种架构等优点.接下来,我们将使用QEMU模拟vexpress-a9,并在上面跑一个Linux kernel,为接下来的 ...

最新文章

  1. 配置gradle时,一直报错提示:ERROR: JAVA_HOME is set to an invalid directory: D:\Java\jdk1.8.0_144;
  2. linux shell 显示路径
  3. 实现用户协议显示_HTTP协议工作原理及其特点
  4. 使用Windows的分析等待链(analyze wait chain)来诊断没用响应的应用
  5. 【Python】一行python代码利用人工智能去除工作照背景
  6. 【SICP练习】138 练习3.69
  7. halcon相关的链接
  8. java ssh shell命令_java 通过ssh 执行命令
  9. centos 卸载软件_Linux服务器运维必备技能 软件包和启动项超详细整理
  10. mysql中的rman备份_oracle数据库 rman基本备份操作
  11. 保存jpg太大怎么办_[日本清酒小知识] 清酒可以放多久?应该怎样保存呢?——清酒保存指南(收藏版)...
  12. vim表达式正则替换
  13. c语言数据类型简介表格,C语言基本数据类型简介.docx
  14. 不少同学想要放弃秋招了........
  15. FZU 1924——死锁——————【topo判环】
  16. VS C++改变窗体背景色
  17. HTML+CSS——网页设计项目完整版本(阿里矢量图标库)分享
  18. eda交通灯控制器波形输入_【EDA课程设计】基于VHDL十字路口交通灯控制电路
  19. 飞思卡尔智能车准备篇
  20. android平板电脑的虚拟键盘,苹果平板电脑ipad虚拟键盘介绍 ipad虚拟键盘使用方法【详解】...

热门文章

  1. 什么时候使用resulttype_ResultMap和ResultType在使用中的区别
  2. 支付宝升级商家积分等服务 商家积分权益增至60余种
  3. 一加 9RT原神限定礼盒今晚开售:内含丰富资源回馈用户
  4. 特斯拉中国月销破5万台创纪录:每46秒就能卖出一辆车
  5. 互联网“收割”网瘾父母
  6. 菜鸟CEO万霖:双11包裹量将继续增长 已建立更高效的物流枢纽
  7. 坐拥12亿月活流量,腾讯直播带货的底牌
  8. 蔚来汽车发布声明:“蔚来EC6爆炸”为谣言
  9. 小米6钉子户们的胜利!复刻机可能要来了,目前已在工程验证阶段
  10. 卢伟冰曝Redmi K30 Pro搭载骁龙865,却惨遭交罚款