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

本文主要介绍coreboot源码的目录结构和其它一些东西。

一、目录结构

1、一级目录

coreboot的一级目录比较少,现分别简单。
src:源码目录,后文再介绍。
util:工具目录,编译使用到的命令,一些脚本,等等。比如sconfig根据代码生成static.c文件,该文件在枚举设备时十分重要。而romcc则是在编译中使用到的命令。另外,还有一些有用的工具,如读写msr寄存器的msrtool。
payloads:该目录存储的是当前支持的payload。在子目录external中,就有GRUB2、SeaBIOS、U-Boot等其名的bootloader。
3rdparty:第三方库目录,里面有vboot、arm-trusted-firmware。注意,coreboot的git仓库上这几个是引用其它的仓库,所以clone下来是暂时没有内容的,只有要编译时才会去clone,之后就不会再执行了。
build:编译专用目录,生成的最终文件coreboot.rom便位于此目录。
Documentation:文档目录。在ubuntu下使用doxygen可以生成代码html文档,使用命令安装:$ sudo apt-get install doxygen graphviz。进入该目录,执行doxygen Doxyfile.coreboot即可生成。
下面是用tree命令打印的二级目录,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
latelee@latelee:~/bios/coreboot-master/coreboot_m$ tree -L 2
.
├── 3rdparty
│ ├── arm-trusted-firmware
│ ├── blobs
│ ├── chromeec
│ └── vboot
├── COPYING
├── MAINTAINERS
├── Makefile
├── Makefile.inc
├── payloads
│ ├── bayou
│ ├── coreinfo
│ ├── external
│ ├── Kconfig
│ ├── libpayload
│ ├── Makefile.inc
│ └── nvramcui
├── README
├── src
│ ├── acpi
│ ├── arch
│ ├── commonlib
│ ├── console
│ ├── cpu
│ ├── device
│ ├── drivers
│ ├── ec
│ ├── include
│ ├── Kconfig
│ ├── lib
│ ├── mainboard
│ ├── northbridge
│ ├── soc
│ ├── southbridge
│ ├── superio
│ └── vendorcode
├── toolchain.inc
└── util
├── abuild
├── acpi
├── amdfwtool
├── amdtools
├── archive
├── arm_boot_tools
├── autoport
├── bimgtool
├── board_status
├── broadcom
├── cbfstool
├── cbmem
├── chromeos
├── crossgcc
├── dtd_parser
├── ectool
├── exynos
├── futility
├── fuzz-tests
├── genbuild_h
├── genprof
├── gitconfig
├── ifdfake
├── ifdtool
├── inteltool
├── intelvbttool
├── ipqheader
├── k8resdump
├── kconfig
├── lint
├── marvell
├── mma
├── msrtool
├── mtkheader
├── nvidia
├── nvramtool
├── optionlist
├── post
├── release
├── rockchip
├── romcc
├── sconfig
├── scripts
├── showdevicetree
├── spkmodem_recv
├── superiotool
├── uio_usbdebug
├── vgabios
├── viatool
└── xcompile

2、src目录

下面简单说说src目录的子目录。
arch:平台架构代码。当前支持的有arm、arm64、mips、x86,等等。
commonlib:共用库。如cbfs。
console:终端代码,比如printk实现,还有终端初始化。
cpu:该目录包括了allwinner、amd、intel、x86模拟器qemu-x86。其中x86目录包含了入口函数(即上电启动第一条指令)。
device:设备目录。比如重要的文件有device.c、pci_device.c,等。
drivers:驱动目录。
mainboard:主板目录。里面包含了各式各样的主板。比如qemu使用的“主板”代码位于emulation目录。
northbridge:北桥芯片目录。
southbridge:南桥芯片目录。
soc:一些“平台”的代码目录。比如大名鼎鼎的英特尔(Intel)的baytrail、braswell、skylake、quark,等(注:感觉coreboot对英特尔还是很到位的,新出的平台很快能支持)。还有英伟达(nvidia)的tegra。
vendorcode:厂商微码目录。比如英特尔(Intel)的固件支持包(fsp)。可搜索一下处理器“微码”方面的资料。

二、编译配置

coreboot配置使用make menuconfig进行,与大部分的大型开源项目(比如Linux内核、openwrt,等)类似。
在实践中推荐使用qemu,因为qemu拥有快速、便捷性。在没有实物情况下可以调试跟踪。像Intel、AMD或其它的芯片平台,还需要烧写到开发板上才能验证。另外,使用qemu并不会对coreboot的整体流程跟踪产生影响。
至此,万事俱备,接下来就可以一边在代码添加打印信息(方便观察跟踪),并使用qemu模拟环境启动以便验证。

李迟 2016.3.13 周日 晚