![見出し画像](https://assets.st-note.com/production/uploads/images/84740347/rectangle_large_type_2_947cb334b750f958d0d653025ddad44b.jpeg?width=1200)
8/14にYoutubeで動画を公開しました!
Youtubeで「ベアメタル・プログラミング 初歩の初歩!」という動画を公開したので、それについていくつか補足説明させていただきます。
ベアメタルプログラミング概要
今回のお題にもなっていますが、そもそも「ベアメタルプログラミング」と言われても初耳の方も少なくないのではないでしょうか。実は私もつい最近までは知りませんでした(笑)。いろんなWebページを見た感じでは「いわゆるOS(Windows/Linux/MacOSなど)」の機能を使わない、独力で作動するプログラムを指すようです。
と言ってもPCのハードウェアは千差万別。その全てを網羅するプログラムを記述するのは至難の業ですよね。というわけで今回は比較的容易な、UEFIのAPIを用いたベアメタルプログラミングの解説に焦点を絞りました。
プログラム例
本動画内では直接ふれていませんが、VirtualBoxで「Hello, world!」を出力するためにUEFIのAPIを叩いています。そんなに長くないので全コードを掲載しますね。
struct EFI_SYSTEM_TABLE
{
char _buf[60];
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
{
void *_buf;
unsigned long long (*OutputString)(struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *, unsigned short *);
} * ConOut;
};
void efi_main(void *ImageHandle __attribute__((unused)), struct EFI_SYSTEM_TABLE *SystemTable)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello, World!\n");
while (1)
;
}
ごらんの通り特にひねりも何もないC言語のコードです。強いて言えばmain()関数が存在しない事くらいでしょうか。
最初の構造体は、UEFIで画面の1行出力を行うための定義です。詳細はこちらを参照して頂くとして、実際の利用は次のコード1行でおこなっています。
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello, World!\n");
PCのUEFI BIOSから呼び出されるエントリ関数となるefi_main()の第2引数としてUFEIのAPIテーブルのアドレスが渡されるので、それをAPI構造体のポインタに格納し、然るべき設定を行い呼び出しを行うだけです。実に簡単ですね!
フローチャート
noteでわざわざこの記事をお読みになる方にこの説明は不要かも知れませんが、いちおう掲載だけしておきます。
![](https://assets.st-note.com/img/1660513968929-qTAERKsSCb.png)
どうやって実行するの?
本動画では環境構築やコンパイル方法、実行方法にまでは踏み込んでいないので、これについては次回の動画公開後に説明しようと思います。コードを書くこと自体よりも、最初の環境構築につまずく方が少なくないようなので…。
何を隠そう、したり顔でnoteを書いている私も環境構築にはかなり苦労しました。できればLinux環境をご用意の上で次回動画をお待ちいただければと思います。続きはそれほどお待たせしないで公開できる予定です。
もし質問やツッコミ等ありましたらnoteやYoutubeのコメント、twitterのリプなどでも構いませんのでお気軽にご質問ください。
ここまでお読みいただき、ありがとうございました。