🕍

UEFIから起動するイメージの先頭が"MZ"である歴史的理由

2023/01/27に公開

RISC-Vのカーネルイメージのエントリーポイント

kernelvmのrisc-vのチャネルで「riscv環境におけるlinuxのカーネルがロードされた直後からどう動くのかを知りたい。どこのコードから読めばよいか」という質問があり、あれこれ調べるうちにここだということが判明しました。

https://github.com/torvalds/linux/blob/v5.19/arch/riscv/kernel/head.S#L21-L39

#ifdef CONFIG_EFI
	/*
	 * This instruction decodes to "MZ" ASCII required by UEFI.
	 */
	c.li s4,-13
	j _start_kernel

どうもEFIで起動するイメージの先頭はASCIIコードで"MZ"となっている必要があるようです。

"EFI MZ" でいろいろ検索

https://retrage01.hateblo.jp/entry/2017/12/09/001214

どうやら、EFIで起動するイメージは(EFI Application)はPE(Portable Executable)というWindowsの実行形式と同じヘッダフォーマットである必要があるようです。
https://en.wikipedia.org/wiki/Portable_Executable

"MZ"の起源はMS-DOSの実行ファイルにまでさかのぼるようです。
https://en.wikipedia.org/wiki/DOS_MZ_executable

"MZ" are the initials of Mark Zbikowski, one of the leading developers of MS-DOS.

"MZ"は開発者の名前のイニシャルでした。

私は組み込み畑にいて、Windowsの実行ファイルのことは全く知らなかったので新鮮でした。
RISC-VでWindowsを動かすわけでもないのに、こんなふうに歴史的な痕跡が残っているのですね。

補足

Discordで教えてもらったオブジェクトフォーマットの系譜の図のtweetをこちらにも貼っておきますね。
https://twitter.com/netspooky/status/1565184163505999877

ELFなども含んだもの
https://twitter.com/netspooky/status/1565485846656172033?conversation=none

関連

https://zenn.dev/tetsu_koba/articles/4913560f77abd1

Discussion