上图相信你似曾相识吧,这是在bios阶段,我们可以看到的界面。但是,你有没有想过这样一个问题,在bios阶段,gpu的驱动并未加载,为什么我们可以看到这样的图像界面?此时,是谁在驱动gpu呢?

在本文接下来的内容中,将会解答上述问题。

在本文中,只考虑主板是uefi firmware的情况。

1. overview


在bios阶段,gpu display的detail如上图所示。

2. OpRegion

OpRegion就是一段内存,我们假设OpRegion大小为为0x3000。

在IGD(Intel Graphics Device)的pci config中,0xFC寄存器存储着OpRegion的start addr。driver通过start addr即可获取到OpRegion的内容。

OpRegion的内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
///
/// IGD OpRegion Structure
///
typedef struct {
IGD_OPREGION_HEADER Header; ///< OpRegion header (Offset 0x0, Size 0x100)
IGD_OPREGION_MBOX1 MBox1; ///< Mailbox 1: Public ACPI Methods (Offset 0x100, Size 0x100)
IGD_OPREGION_MBOX2 MBox2; ///< Mailbox 2: Software SCI Interface (Offset 0x200, Size 0x100)
IGD_OPREGION_MBOX3 MBox3; ///< Mailbox 3: BIOS to Driver Notification (Offset 0x300, Size 0x100)
IGD_OPREGION_MBOX4 MBox4; ///< Mailbox 4: Video BIOS Table (VBT) (Offset 0x400, Size 0x1800)
IGD_OPREGION_MBOX5 MBox5; ///< Mailbox 5: BIOS to Driver Notification Extension (Offset 0x1C00, Size 0x400)
} IGD_OPREGION_STRUCTURE;

可以看出,VBT包含在OpRegion中。

3. VBT

The Video BIOS Table, or VBT, provides platform and board specific configuration information to the driver that is not discoverable or available through other means. By other means the most used method here is to read EDID table from the attached monitor, over Display Data Channel (DDC) using two pin I2C serial interface.

The VBT configuration is related to display hardware. The VBT is available via the ACPI OpRegion.

The VBT consists of a VBT Header, a BIOS Data Block (BDB) Header, and a number of BIOS Data Blocks (BDBs) that contain the actual configuration information (supposed to replace the absence of EDID structure with the older monitors).

4. EDID

What is EDID?

Extended Display Identification Data(EDID)存储着monitor相关的信息。

5. panel

笔记本屏幕是panel,并非通过VGA,HDMI or DP。它的信息并非存放在edid中,而是存放在vbt中。

6. GOP driver

在bios阶段,是Graphics Output Protocol (GOP) driver驱动着硬件gpu。这样,在操作系统加载之前,就可以看到图形界面了。

Replacing VGA, GOP implementation for UEFI

7. 总结

  1. 获取vbt
    在bios阶段,gop driver读取OpRegion的内容,从而可以获取到vbt,得到platform and board specific configuration information。

  2. 获取monitor信息

  • 如果你使用的是panel或者不支持edid的monitor,那么,monitor相关的信息已存储在vbt中
  • 如果你的monitor支持edid,那么,gop driver通过i2c总线,根据DDC protocol,获取monitor相关的信息
  1. 显示
    最后,gop driver就可以驱动gpu,并将内容展示在monitor上了,你就能看到图形界面了。

参考资料:

  1. Intel Integrated Graphics Device OpRegion Specification
  2. https://github.com/ZoranStojsavljevic/Video-BIOS-Table-parser-assembler/wiki/Video-BIOS-Table-(VBT)