借り初めのひみつきち

仮ブログです。移転先募集中

ACPI BGRT

昔同じタイトルの記事を書いたところ結構googleしてる人がいるみたいなので、ちゃんとした記事のせときますね:;(∩´﹏`∩);:

win8くらいの時からPCが起動する時にメーカーロゴが表示された状態のままwindowsが起動してることにお気づきでしょうか?

この仕組みは ACPI にある BGRT (Boot Graphics Resource Table) というテーブルで実現されています。

このテーブルは以下のような構造になっています。

typedef struct {
    acpi_header_t   Header;
    uint16_t    Version;
    uint8_t     Status, Image_Type;
    uint64_t    Image_Address;
    uint32_t    Image_Offset_X, Image_Offset_Y;
} __attribute__((packed)) acpi_bgrt_t;

この中で重要なのは Image_Address, Image_Offset_X, Image_Offset_Y の3つです。
Image_Address の指しているアドレスには BMP ファイルがそのまま格納されています。
Image_Offset_X/Y は実際にイメージを表示する左上の座標になります。解像度を変更した場合は不正な座標になります。
残りの項目は ACPI 共通のお作法だったり、将来拡張があった時のためだったりします。(たぶん使われないでしょう)

実際にこれを使う場合、 EFI_SYSTEM_TABLE の ConfigurationTable から ACPI テーブル(RSD Ptr)を検索し、 XSDT から BGRT を探し、 BGRT から画像を取り出すという手順になります。
ということで表示するプログラムを作ってみました。

github.com

f:id:neriring16:20181220212425p:plain