続・玩式草子 ―戯れせんとや生まれけん―

第13回 Plamo-7.1とinitrd[4]

この記事を読むのに必要な時間:およそ 4 分

前回までに紹介してきたように,initrdは元々,モジュール化されたカーネル・ドライバを,HDD上のファイルシステムを介することなくカーネルに組み込むための仕組みとして考案されました。

きちんと確認したわけではないものの,initrdのルーツは,Mach等のマイクロカーネルをブートするための仕組みに遡るのではないかと思っています。

一方,initrdはgrub等のブートローダによってカーネルと共にメモリ内に読み込まれ,他のあらゆるソフトウェアよりも先にカーネルに触れるため,その特徴を活かした面白い使い方もあります。それが今回紹介するマイクロコードの早期読み込み(early loading)です。

CPUとマイクロコード

最近の無線LANやグラッフィクカードのような高機能化した周辺機器では,カーネルの持つデバイスドライバとは別に,ファームウェア(firmware)と呼ばれる,専用のソフトウェアを必要とする例が増えてきました。ファームウェアはその機器を制御する専用のソフトウェアで,機器のメーカーからバイナリファイルとして提供され,どのようなファームウェアが必要になるのかはその機器用のデバイスドライバに記録されています。

たとえば,AMD GPU用のデバイスドライバであるamdgpumodinfoコマンドでチェックすると,このドライバが必要とするfirmwareの一覧が表示されます。

$ sudo modinfo amdgpu
[sudo] kojima のパスワード:
filename:       /lib/modules/5.2.11-plamo64/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu.ko.xz
license:        GPL and additional rights
description:    AMD GPU
author:         AMD linux driver team
firmware:       amdgpu/raven2_gpu_info.bin
firmware:       amdgpu/picasso_gpu_info.bin
firmware:       amdgpu/raven_gpu_info.bin
firmware:       amdgpu/vega12_gpu_info.bin
firmware:       amdgpu/vega10_gpu_info.bin
firmware:       amdgpu/mullins_mec.bin
firmware:       amdgpu/mullins_rlc.bin
firmware:       amdgpu/mullins_ce.bin
....

Linuxの場合,これらファームウェアは /lib/firmwareディレクトリに収めることになっており,上記リストに指定されたAMD GPU用のファームウェアは/lib/firmware/amdgpu/にあります。

$ ls /lib/firmware/amdgpu/*gpu*
/lib/firmware/amdgpu/picasso_gpu_info.bin  /lib/firmware/amdgpu/vega10_gpu_info.bin
/lib/firmware/amdgpu/raven2_gpu_info.bin   /lib/firmware/amdgpu/vega12_gpu_info.bin
/lib/firmware/amdgpu/raven_gpu_info.bin

これらのファームウェアは,カーネルがその機器用のデバイスドライバを組み込む際に合わせて読み込まれ,デバイスドライバと協働して機器の初期化等の処理を行います。

ファームウェアによって動作を変える仕組みは,周辺機器だけでなくCPU本体にも採用されています。CPUの場合,シリコン上に書き込まれた回路は変更できないものの,その回路はマイクロコード(micro code)と呼ばれるソフトウェアによって制御されており,マイクロコードの修正によってCPUのバグやセキュリティホールを回避できるようになっています。すこし前にSpectreやMeltdownといったCPUの脆弱性が報告され,それに対応するためのマイクロコードが多数公開されたことをご記憶の方も多いでしょう。

なお,⁠ファームウェア」「マイクロコード」は共に,⁠ハードウェアに組み込まれた制御用ソフトウェア」を指す言葉なものの,周辺機器の場合は「ファームウェア⁠⁠,CPUの場合は「マイクロコード」と呼ばれることが多いので,本稿でもそれに従うことにします。

前述のように,周辺機器の場合,ファームウェアはその機器を操作するためのデバイスドライバが組み込まれる際にロードされるので,機器が動作し始める時点から適用することができます。

一方,CPUの場合は,マイクロコードを読み込むにもCPUの機能が必要なので,まずCPUを先に起動する必要があります。しかしながら,マイクロコードによるバグやセキュリティホールの修正は可能な限り早期に適用し,以後の処理に悪影響が及ばないようにしなければなりません。そこで考案されたのがinitrdを介してマイクロコードを読み込む手法です。

マザーボードのBIOSで新しいマイクロコードに対応するのが一番確実な方法なものの,BIOSが新しいマイクロコードに対応するかはマザーボードメーカ次第なので,古めのマザーボードでは対応されないこともよくあります。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html