初めてこのページを見た方へ:こちらは連載ページですので第1回目はこちらからどうぞ。
通常のBIOS設定画面では変更できないBIOS設定をUEFI Shellコマンドから行う手順の第3回目です。気がついたら説明が3回目になってしまいました。普通の手順ではアクセスできない領域へ踏み込む作業なので手順が多く説明が長くなってしまいました。
今回の説明でようやく最終回となります。
最初から振り返ると、全工程は4ステップです。
- BIOSのROMデータのダンプを入手
- ダンプデータからUEFIのUI設定情報を取得
- 非表示のUI設定項目のアドレスを解析
- BIOSのUIを介さずにUEFIのCUIから直接BIOS設定を変更
今回はハイライトしている手順3.の後半と手順4.を行います。
目次
BIOS設定変更を行うコマンドsetup_var
先に結論を知っておくと詳細の手順説明への理解が早まると思うので、BIOSのIFRを解析する前にUEFIシェルでBIOSの設定を変更するコマンドの使い方を先に説明してしまいます。
コマンドにはforkされたものが色々あるのですが、こちらのパッチ済みのGRUB shellが一番使いやすいです。
modGRUBShell.efi
をダウンロードしてください。.efiとはUEFI上で実行するプログラムです。
上記のmodGRUBShell.efi
にはパッチを適用済みのBIOS値変更コマンドが含まれています。使い方はUEFI shellからGRUB shellであるmodGRUBShell.efi
を立ち上げてBIOS設定変更コマンドsetup_varを実行する手順になります。
UEFI shellからmodGRUBShell.efi
を起動させて使用するので、第1回で作成したCHIPSECの起動USBメモリを使用します。CHIPSEC用USBの/EFI/Tools/以下にファイルmodGRUBShell.efi
を置きます。用意ができたら完成したUSBメモリからPCを起動します。
コマンドの使い方
CHIPSEC用USBメモリでPCを起動するとUEFIシェルが立ち上がります。第1回ではここでCHIPSECを起動しましたが、今回はGRUBシェルmodGRUBShell.efi
を起動します。具体的にはUSBメモリから起動した後でUEFI Shellが立ち上がったら次のように実行します。
USBディスクへ移動
> fs0:
grub shellに入る
> cd EFI/Tools
> modGRUBShell.efi
grub shell上でBIOSデータ書き換え
grub> setup_var_cv CpuSetup 0x43 0x01 0x00
現在値を確認する
grub> setup_var_cv 0x43
このようにsetup_var_cv
コマンドに値を渡すと、BIOSの設定が変更できます。何でも変更可能なのでメーカー標準のBIOS設定画面に出てこないパラメータの修正も可能です。
強力なコマンドなのですが、最適な引数は自分で探す必要があります。上の例はWindows以外のOSでPCを起動させるケースでたまに必要となるCFG Lockを解除する引数値です。setup_var_cv
コマンドの引数は整理すると次のような定義です。
setup_var_cv <VarStoreName> <VarOffset> <Size> <Value>
VarStoreName | VarStore領域の名前 |
VarOffset | VarStore領域内のアドレスオフセット値 |
Size | 書き込むバイト数、すなわち下記Value引数のバイト長 |
Value | BIOSへ書き込む値。上記Size引数分のバイト列を記載 |
このようになります。VarStoreName
は上述のコマンド例のようにCpuSetup
やSecureBootSetup
などあらかじめBIOSのIFRで定義されている設定項目のカテゴリを指定します。そして該当項目のカテゴリ内にはさらに詳細設定の様々なバイト列がBIOSに格納されているので、VarOffse
で書き込みを開始するオフセットアドレス値とSize
で書き込みデータ長を指定します。最後に実際にBIOSに対して上書き書き込みする設定値がValue
となります。
引数の探し方
さて、BIOS設定値をほぼ自由に書き換えができるsetup_var_cv
コマンドですが、VarStoreName
やVarOfset
値はBIOSメーカーもPCメーカーも非公開なので引数に入れるべき適切な値は自分で探す必要があります。
しかし、探し方には一定のルールがあるので一度やり方がわかればどんなBIOS設定値でも修正ができるようになります。では先ほどの例のCFG Lockの設定箇所を探してみます。
今回のユースケースは、CPU設定のCFG Lockを無効にしたいというものです。CFG Lockの設定は自作PC向けマザーボードのBIOSであればGUIで設定可能ですが、メーカー製PCではほぼ全部Lock有効で設定画面にも出てきません。CFG LockはWindows以外のOSで起動する際に調整が必要となることがあるものです。
用意するものは第2回の説明で最終的に生成したsetup.txt
です。setup.txt
をテキストエディタで開いてCFG Lockの箇所を探します。
0x2F57F Form: View/Configure CPU Lock Options, FormId: 0x273F {01 86 3F 27 86 02}
0x2F585 One Of: CFG Lock, VarStoreInfo (VarOffset/VarName): 0x43, \
VarStore: 0x2, QuestionId: 0x1D9, Size: 1, Min: 0x0, Max 0x1, \
Step: 0x0 {05 91 63 04 64 04 D9 01 02 00 43 00 10 10 00 01 00}
0x2F596 One Of Option: Disabled, Value (8 bit): 0x0 {09 07 04 00 00 00 00}
0x2F59D One Of Option: Enabled, Value (8 bit): 0x1 (default) {09 07 03 00 30 00 01}
0x2F5A4 End One Of {29 02}
説明のポイントとなる箇所に下線をつけています。
setup_var_cv
コマンドで指定するVarOffset
引数値setup_var_cv
コマンドで指定する書き込みSize
引数値setup_var_cv
コマンドのValue
にあたる設定値。設定値は0x0または0x1で、デフォルトは0x1であることがわかります。VarStoreの0x2はさらに調べる必要があります。とりあえず上記からVarStore値は0x2であることがわかります。次にVarStore値から名称を調べます。
同じくsetup.txt
のはじめのあたり、44行目あたりを見ていきます(長いので横スクロールしながら見てください)
0x2A0B9 VarStore: VarStoreId: 0x2 [B08F97FF-E6E8-4193-A997-5E9E9B0ADB32], Size: 0x24A, Name: CpuSetup {24 1F FF 97 8F B0 E8 E6 93 41 A9 97 5E 9E 9B 0A DB 32 02 00 4A 02 43 70 75 53 65 74 75 70 00}
下線を引いたところを読むと、VarStoreのIDが0x2の場所は、名称がCpuSetup
であることが分かります。この名称がsetup_var_cv
コマンドのVarStoreName引数値となります。
以上のような手順でsetup_var_cv
コマンドの引数を探します。他のBIOS設定項目も同様な手順で自由に設定をチューニングすることができます。
まとめ
ようやく全ての説明が終わりました。書き始めた当初はさらっと設定メモを書けば済む話かなと考えていましたが、いざ書き始めてみたら3回の記事に分けて書くという長い説明になってしまいました。
setup.txtを読むと普段見たことも聞いたこともないようなマニアックなBIOS設定項目がたくさんあることが分かります。意味もわからず設定変更をするとOS起動どころかPOSTしなくなることもあるので、万が一の際はBIOSリセットで工場出荷状態に戻せるような準備をしてから作業してください。
BIOSの設定をカスタマイズできると、Windows以外のOSを安定して動かしたり古いマザーボードが対応していない周辺機器やパーツを接続したりすることもできるようになりますよ。
0 件のコメント:
コメントを投稿