前回までに紹介してきたように、
一方、
CPUとマイクロコード
最近の無線LANやグラッフィクカードのような高機能化した周辺機器では、
たとえば、
$ 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の場合、
$ 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
これらのファームウェアは、
ファームウェアによって動作を変える仕組みは、
なお、
前述のように、
一方、
マイクロコード用initrd
LinuxではCPUのマイクロコードを更新する機能がカーネルに組み込まれており、
たとえば、
$ dmesg | grep microcode [ 1.200804] microcode: sig=0x306c3, pf=0x2, revision=0x24 [ 1.201094] microcode: Microcode Update Driver: v2.2.
このMicrocode Update DriverがCPUのマイクロコードの更新を担当しており、
# echo '1' > /sys/devices/system/cpu/microcode/reload # dmesg | last .... [ 100.477620] microcode: updated to revision 0x27, date = 2019-02-26 [ 100.488654] x86/CPU: CPU features have changed after loading microcode, but might not take effect. [ 100.489534] x86/CPU: Please consider either early loading through initrd/built-in or a potential BIOS update. [ 100.490409] microcode: Reload completed, microcode revision: 0x27
dmesgの出力を見ると、
マイクロコードはソースコードのないバイナリファイルなため処理内容等は分からないものの、
さて、
マイクロコードの結合
initrd経由でマイクロコードを渡された際、
# mkdir work ; cd work # mkdir -p kernel/x86/microcode # cat /lib/firmware/intel-ucode/* > kernel/x86/microcode/GenuineIntel.bin # cat /lib/firmware/amd-ucode/microcode_amd*.bin > kernel/x86/microcode/AuthenticAMD.bin
マイクロコード用initrd(initramfs)イメージの作成
作成したマイクロコードのファイルを、
# find . | cpio -ov -Hnewc > ../ucode.cpio
ブートローダにマイクロコード用イメージを追加
新しく作成したマイクロコード用イメージ
# mv ../ucode.cpio /boot # vim /boot/efi/grub/grub.cfg .... initrd /boot/ucode.cpio /boot/initrd.img-5.2.11-plamo64
以上の設定でシステムを再起動すると、
再起動した環境でdmesgを調べると、
$ dmesg | head [ 0.000000] microcode: microcode updated early to revision 0x27, date = 2019-02-26 [ 0.000000] Linux version 5.2.11-plamo64 (kojima@ryzen) (gcc version 9.1.0 (GCC)) #1 SMP PREEMPT Tue Sep 3 16:54:21 JST 2019 [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.2.11-plamo64 root=UUID=8809ed77-98b0-44ce-b141-88482e63cbe7 ro net.ifnames=0 quiet [ 0.000000] KERNEL supported cpus: [ 0.000000] Intel GenuineIntel [ 0.000000] AMD AuthenticAMD [ 0.000000] Hygon HygonGenuine
もう少し先では、
[ 1.213284] microcode: sig=0x306c3, pf=0x2, revision=0x27 [ 1.213338] microcode: Microcode Update Driver: v2.2.
この場合、
なお、
# cd /boot # mv initrd.img-5.2.11-plamo64{,.backup} # cat ucode.cpio initrd.img-5.2.11-plamo64.backup > initrd.img-5.2.11-plamo64
今回はinitrdの応用的な使い方としてマイクロコードの早期読み込みを紹介しました。説明の都合上、
initrdイメージにマイクロコードが入っているかどうかは、
$ cpio -t < /boot/initrd.img-5.2.11-plamo64 . kernel kernel/x86 kernel/x86/microcode kernel/x86/microcode/GenuineIntel.bin kernel/x86/microcode/AuthenticAMD.bin 5024 ブロック
ちなみに、
$ dd if=/boot/initrd.img-5.2.11-plamo64 of=orig_initrd.img skip=5024 34488+1 レコード入力 34488+1 レコード出力 17658307 bytes (18 MB, 17 MiB) copied, 0.206798 s, 85.4 MB/s
こうして取り出したinitrdイメージは、
$ zcat orig_initrd.img | cpio -t . init lib64 etc etc/lvm etc/lvm/profile etc/lvm/profile/thin-generic.profile ...
今回取りあげた話題は、